diff --git a/dumux/CMakeLists.txt b/dumux/CMakeLists.txt index a8e7f0f33e13e29735b6d997152bd73f9b74f514..87cb87d8609fb96482771c7c36cd522ef43d221c 100644 --- a/dumux/CMakeLists.txt +++ b/dumux/CMakeLists.txt @@ -1,13 +1,11 @@ add_subdirectory("common") add_subdirectory("discretization") add_subdirectory("freeflow") -add_subdirectory("geomechanics") add_subdirectory("implicit") add_subdirectory("io") add_subdirectory("linear") add_subdirectory("material") add_subdirectory("mixeddimension") -add_subdirectory("multidomain") add_subdirectory("nonlinear") add_subdirectory("parallel") add_subdirectory("porousmediumflow") diff --git a/dumux/geomechanics/CMakeLists.txt b/dumux/geomechanics/CMakeLists.txt deleted file mode 100644 index 317ac1cf3564d3219e6211b0faf40a852dce5665..0000000000000000000000000000000000000000 --- a/dumux/geomechanics/CMakeLists.txt +++ /dev/null @@ -1,5 +0,0 @@ -add_subdirectory("el1p2c") -add_subdirectory("el2p") -add_subdirectory("elastic") -add_subdirectory("implicit") -add_subdirectory("constitutivelaws") \ No newline at end of file diff --git a/dumux/geomechanics/constitutivelaws/CMakeLists.txt b/dumux/geomechanics/constitutivelaws/CMakeLists.txt deleted file mode 100644 index 513c666aeefecd41e73de8899ee9b040504d7a13..0000000000000000000000000000000000000000 --- a/dumux/geomechanics/constitutivelaws/CMakeLists.txt +++ /dev/null @@ -1,5 +0,0 @@ - -#install headers -install(FILES -hokeslaw.hh -DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/dumux/geomechanics/constitutivelaws) diff --git a/dumux/geomechanics/constitutivelaws/hookeslaw.hh b/dumux/geomechanics/constitutivelaws/hookeslaw.hh deleted file mode 100644 index 8e425a76f5ed0e5861295a9ea75087b088911ee7..0000000000000000000000000000000000000000 --- a/dumux/geomechanics/constitutivelaws/hookeslaw.hh +++ /dev/null @@ -1,313 +0,0 @@ -// -*- mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- -// vi: set et ts=4 sw=4 sts=4: -/***************************************************************************** - * See the file COPYING for full copying permissions. * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 2 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program. If not, see . * - *****************************************************************************/ -/*! - * \file - * \brief This file contains the data which is required to calculate - * the mechanic stresses according to Hooke's law. - */ -#ifndef DUMUX_GEOMECHANICS_HOOKES_LAW_HH -#define DUMUX_GEOMECHANICS_HOOKES_LAW_HH - -#include - -#include -#include - -#include - - -namespace Dumux -{ - -namespace Properties -{ -// forward declaration of properties -} - -/*! - * \ingroup CCTpfaHookesLaw - * \brief Evaluates the stresses, tractions and compressions on a face according to Hooke's law. - * Specializations are given for the different discretization methods. - */ -template -class HookesLaw -{}; - -template -class HookesLaw::type > -{ - typedef typename GET_PROP_TYPE(TypeTag, Scalar) Scalar; - typedef typename GET_PROP_TYPE(TypeTag, Problem) Problem; - typedef typename GET_PROP_TYPE(TypeTag, SubControlVolume) SubControlVolume; - typedef typename GET_PROP_TYPE(TypeTag, SubControlVolumeFace) SubControlVolumeFace; - typedef typename GET_PROP_TYPE(TypeTag, PrimaryVariables) PrimaryVariables; - typedef typename GET_PROP_TYPE(TypeTag, BoundaryTypes) BoundaryTypes; - typedef typename GET_PROP_TYPE(TypeTag, GridView) GridView; - typedef typename GridView::IndexSet::IndexType IndexType; - typedef typename std::vector Stencil; - typedef typename GridView::template Codim<0>::Entity Element; - - enum { dim = GridView::dimension} ; - static constexpr int voigtDim = 0.5*(dim*dim+dim); - - typedef Dune::FieldMatrix StiffnessMatrix; - typedef Dune::FieldVector VoigtVector; - typedef Dune::FieldMatrix DimMatrix; - typedef Dune::FieldVector DimVector; - - struct FaceData - { - Scalar insideLambda, insideMu; - DimVector insideAlpha, insideN, insideU; - - Scalar outsideLambda, outsideMu; - DimVector outsideAlpha, outsideN, outsideU; - - bool valueSet; - - FaceData() - { - valueSet = false; - } - }; - -public: - - static DimVector stressVector(const Problem& problem, const SubControlVolumeFace& scvFace) - { - DimMatrix sigma = calculateSigma_(problem, scvFace); - - // calculate Sigma*n - DimVector stressVec(0.0); - sigma.mv(scvFace.unitOuterNormal(), stressVec); - stressVec *= scvFace.area(); - - return stressVec; - } - - static DimMatrix stressTensor(const Problem& problem, const SubControlVolumeFace& scvFace) - { - return calculateSigma_(problem, scvFace); - } - - static Stencil stencil(const Problem& problem, const SubControlVolumeFace& scvFace) - { - std::vector stencil; - if (!scvFace.boundary()) - { - stencil.push_back(scvFace.insideScvIdx()); - stencil.push_back(scvFace.outsideScvIdx()); - } - else - stencil.push_back(scvFace.insideScvIdx()); - - return stencil; - } - - static DimMatrix calculateInversA(const Problem& problem, const SubControlVolumeFace& scvFace) - { - FaceData faceData = obtainFaceData_(problem, scvFace); - - DimMatrix inversA(0.0); - addEntriesToMatrix_(faceData.insideLambda, faceData.insideMu, faceData.insideAlpha, faceData.insideN, inversA); - addEntriesToMatrix_(faceData.outsideLambda, faceData.outsideMu, faceData.outsideAlpha, faceData.outsideN, inversA); - inversA.invert(); - - return inversA; - } - - static DimVector interpolateFaceDisplacement(const Problem& problem, const SubControlVolumeFace& scvFace) - { - FaceData faceData = obtainFaceData_(problem, scvFace); - return interpolateFaceDisplacement_(problem, scvFace, faceData); - } - -private: - - static FaceData obtainFaceData_(const Problem& problem, const SubControlVolumeFace& scvFace) - { - FaceData container; - - const auto insideScvIdx = scvFace.insideScvIdx(); - const auto& insideScv = problem.model().fvGeometries().subControlVolume(insideScvIdx); - const auto& insideVolVars = problem.model().curVolVars(insideScvIdx); - container.insideU = insideVolVars.displacement(); - container.insideLambda = insideVolVars.lambda(); - container.insideMu = insideVolVars.mu(); - container.insideN = scvFace.unitOuterNormal(); - container.insideAlpha = scvFace.center(); - container.insideAlpha -= insideScv.center(); - container.insideAlpha /= container.insideAlpha.two_norm2(); - - const auto outsideScvIdx = scvFace.outsideScvIdx(); - const auto& outsideVolVars = problem.model().curVolVars(outsideScvIdx); - container.outsideU = outsideVolVars.displacement(); - container.outsideLambda = outsideVolVars.lambda(); - container.outsideMu = outsideVolVars.mu(); - container.outsideN = scvFace.unitOuterNormal(); - container.outsideN *= -1; - if (scvFace.boundary()) - container.outsideAlpha = 0.0; - else - { - const auto& outsideScv = problem.model().fvGeometries().subControlVolume(outsideScvIdx); - container.outsideAlpha = scvFace.center(); - container.outsideAlpha -= outsideScv.center(); - container.outsideAlpha /= container.outsideAlpha.two_norm2(); - } - - container.valueSet = true; - - return container; - } - - static DimMatrix calculateSigma_(const Problem& problem, const SubControlVolumeFace& scvFace) - { - DimMatrix sigma(0.0); - StiffnessMatrix C(0.0); - VoigtVector voigtStrain(0.0); - VoigtVector voigtSigma(0.0); - - FaceData faceData = obtainFaceData_(problem, scvFace); - DimVector faceU = interpolateFaceDisplacement_(problem, scvFace, faceData); - - fillStiffnessMatrix_(C, faceData.insideLambda, faceData.insideMu); - fillStrainVector_(voigtStrain, faceData.insideAlpha, faceData.insideU, faceU); - - C.mv(voigtStrain, voigtSigma); - - if (dim == 2) - { - sigma[0][0] = voigtSigma[0]; - sigma[0][1] = voigtSigma[2]; - sigma[1][0] = voigtSigma[2]; - sigma[1][1] = voigtSigma[1]; - } - else - DUNE_THROW(Dune::NotImplemented, "dim = " << dim << " is not implemented yet"); - - return sigma; - } - - static DimVector interpolateFaceDisplacement_(const Problem& problem, const SubControlVolumeFace& scvFace, const FaceData& faceData, const bool oldSol = false) - { - DimVector faceU(0.0); - - if (!scvFace.boundary()) - { - DimMatrix inversA(0.0); - DimMatrix insideB(0.0); - DimMatrix outsideB(0.0); - - getInversA_(problem, scvFace, faceData, inversA); - addEntriesToMatrix_(faceData.insideLambda, faceData.insideMu, faceData.insideAlpha, faceData.insideN, insideB); - addEntriesToMatrix_(faceData.outsideLambda, faceData.outsideMu, faceData.outsideAlpha, faceData.outsideN, outsideB); - - DimVector insideTmp(0.0); - DimVector outsideTmp(0.0); - insideB.mv(faceData.insideU, insideTmp); - outsideB.mv(faceData.outsideU, outsideTmp); - - insideTmp += outsideTmp; - - inversA.mv(insideTmp, faceU); - } - else - { - if (!oldSol) - { - try { return problem.model().curVolVars(scvFace.outsideScvIdx()).displacement(); } - catch (Dune::Exception& e) - { - DUNE_THROW(Dune::InvalidStateException, "Error ocurred during the displacement interpolation on a boundary scv face. Only call this method on inner scv faces or pure Dirichlet boundaries with the volvars bound to the element"); - } - } - else - { - // TODO - DUNE_THROW(Dune::NotImplemented, "Reconstruction of the previous boundary vol vars not yet implemented"); - } - } - - return faceU; - } - - template - static typename std::enable_if::type getInversA_(const Problem& problem, - const SubControlVolumeFace& scvFace, - const FaceData& faceData, - DimMatrix& inversA) - { inversA = problem.model().fluxVarsCache(scvFace).inversA(); } - - template - static typename std::enable_if::type getInversA_(const Problem& problem, - const SubControlVolumeFace& scvFace, - const FaceData& faceData, - DimMatrix& inversA) - { - addEntriesToMatrix_(faceData.insideLambda, faceData.insideMu, faceData.insideAlpha, faceData.insideN, inversA); - addEntriesToMatrix_(faceData.outsideLambda, faceData.outsideMu, faceData.outsideAlpha, faceData.outsideN, inversA); - inversA.invert(); - } - - static void addEntriesToMatrix_(const Scalar lambda, const Scalar mu, const DimVector& alpha, const DimVector& normal, DimMatrix& matrix) - { - if (dim == 2) - { - matrix[0][0] += (lambda + 2*mu)*alpha[0]*normal[0] + mu*alpha[1]*normal[1]; - matrix[0][1] += lambda*alpha[1]*normal[0] + mu*alpha[0]*normal[1]; - matrix[1][0] += mu*alpha[1]*normal[0] + lambda*alpha[0]*normal[1]; - matrix[1][1] += mu*alpha[0]*normal[0] + (lambda + 2*mu)*alpha[1]*normal[1]; - } - else - DUNE_THROW(Dune::NotImplemented, "dim = " << dim << " is not implemented yet"); - } - - static void fillStiffnessMatrix_(StiffnessMatrix& C, const Scalar lambda, const Scalar mu) - { - if (dim == 2) - { - C[0][0] = lambda + 2*mu; - C[0][1] = lambda; - C[0][2] = 0.0; - - C[1][0] = lambda; - C[1][1] = lambda + 2*mu; - C[1][2] = 0.0; - - C[2][0] = 0.0; - C[2][1] = 0.0; - C[2][2] = mu; - } - } - - static void fillStrainVector_(VoigtVector& strain, const DimVector& alpha, const DimVector& insideU, const DimVector& faceU) - { - if (dim == 2) - { - strain[0] = alpha[0]*(faceU[0] - insideU[0]); - strain[1] = alpha[1]*(faceU[1] - insideU[1]); - strain[2] = alpha[1]*(faceU[0] - insideU[0]) + alpha[0]*(faceU[1] - insideU[1]); - } - } -}; - -} // end namespace - -#endif diff --git a/dumux/geomechanics/el1p2c/CMakeLists.txt b/dumux/geomechanics/el1p2c/CMakeLists.txt deleted file mode 100644 index b1d385c69a89719def138462fc0a42ce5cc3c9ff..0000000000000000000000000000000000000000 --- a/dumux/geomechanics/el1p2c/CMakeLists.txt +++ /dev/null @@ -1,13 +0,0 @@ - -#install headers -install(FILES -elementvolumevariables.hh -fluxvariables.hh -indices.hh -localjacobian.hh -localresidual.hh -model.hh -properties.hh -propertydefaults.hh -volumevariables.hh -DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/dumux/geomechanics/el1p2c) diff --git a/dumux/geomechanics/el1p2c/elementvolumevariables.hh b/dumux/geomechanics/el1p2c/elementvolumevariables.hh deleted file mode 100644 index 4e422d0ad11682b99f52ef274b002078eed44e60..0000000000000000000000000000000000000000 --- a/dumux/geomechanics/el1p2c/elementvolumevariables.hh +++ /dev/null @@ -1,146 +0,0 @@ -// -*- mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- -// vi: set et ts=4 sw=4 sts=4: -/***************************************************************************** - * See the file COPYING for full copying permissions. * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 2 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program. If not, see . * - *****************************************************************************/ -/*! - * \file - * \brief Volume variables gathered on an element - */ -#ifndef DUMUX_BOX_EL1P2C_ELEMENT_VOLUME_VARIABLES_HH -#define DUMUX_BOX_EL1P2C_ELEMENT_VOLUME_VARIABLES_HH - -#include -#include - -namespace Dumux -{ - -/*! - * \ingroup ElOnePTwoCBoxModel - * - * \brief This class stores an array of VolumeVariables objects, one - * volume variables object for each of the element's vertices - */ -template -class ElOnePTwoCElementVolumeVariables : public BoxElementVolumeVariables -{ - typedef BoxElementVolumeVariables ParentType; - typedef typename GET_PROP_TYPE(TypeTag, Problem) Problem; - typedef typename GET_PROP_TYPE(TypeTag, FVElementGeometry) FVElementGeometry; - - typedef typename GET_PROP_TYPE(TypeTag, GridView) GridView; - typedef typename GridView::template Codim<0>::Entity Element; - enum { dim = GridView::dimension }; - - typedef typename GET_PROP_TYPE(TypeTag, FluxVariables) FluxVariables; - -public: - /*! - * \brief The constructor. - */ - ElOnePTwoCElementVolumeVariables() - { } - - /*! - * \brief Construct the volume variables for all vertices of an element. - * - * \param problem The problem which needs to be simulated. - * \param element The DUNE Codim<0> entity for which the volume variables ought to be calculated - * \param fvGeometry The finite volume geometry of the element - * \param oldSol Tells whether the model's previous or current solution should be used. - * - * This class is required for the update of the effective porosity values at the - * vertices since it is a function of the divergence of the solid displacement - * at the integration points - */ - void update(const Problem &problem, - const Element &element, - const FVElementGeometry &fvGeometry, - bool oldSol) - { - ParentType::update(problem, element, fvGeometry, oldSol); - this->updateEffPorosity(problem, element, fvGeometry); - - }; - - /*! - * \brief Update the effective porosities and the volumetric strain divU for all vertices of an element. - * - * \param problem The problem which needs to be simulated. - * \param element The DUNE Codim<0> entity for which the volume variables ought to be calculated - * \param fvGeometry The finite volume geometry of the element - * - * This function is required for the update of the effective porosity / divU values at the - * vertices. - * - * During the partial derivative calculation, changes of the solid displacement - * at vertex i can affect effective porosities / divU of all element vertices. - * To correctly update the effective porosities / divU of all element vertices - * an iteration over all scv faces is required. - * The remaining volvars are only updated for the vertex whose primary variable - * is changed for the derivative calculation. - */ - void updateEffPorosity(const Problem &problem, - const Element &element, - const FVElementGeometry &fvGeometry) - { - // we assert that the i-th shape function is - // associated to the i-th vert of the element. - int numScv = element.subEntities(dim); - - // number of faces which contribute to the porosity value in the sub-control volume - std::vector numContributingFaces; - numContributingFaces.resize(numScv); - - for (int scvIdx = 0; scvIdx < numScv; scvIdx++) { - (*this)[scvIdx].effPorosity = 0.0; - (*this)[scvIdx].divU = 0.0; - numContributingFaces[scvIdx] = 0.0; - } - for (int fIdx = 0; fIdx < fvGeometry.numScvf; fIdx++) - { - // evaluate the gradients at the IPs for each subcontrol volume face - FluxVariables fluxVars; - fluxVars.update(problem, - element, - fvGeometry, - fIdx, - *this); - - numContributingFaces[fluxVars.face().i] += 1; - numContributingFaces[fluxVars.face().j] += 1; - - // average value for the effective porosity - (*this)[fluxVars.face().i].effPorosity += fluxVars.effPorosity(); - (*this)[fluxVars.face().j].effPorosity += fluxVars.effPorosity(); - // average value for the volumetric strain - (*this)[fluxVars.face().i].divU += fluxVars.divU(); - (*this)[fluxVars.face().j].divU += fluxVars.divU(); - - } - for (int scvIdx = 0; scvIdx < numScv; scvIdx++) { - (*this)[scvIdx].effPorosity /= numContributingFaces[scvIdx]; - (*this)[scvIdx].divU /= numContributingFaces[scvIdx]; - } - }; - - -}; - -} // namespace Dumux - -#endif diff --git a/dumux/geomechanics/el1p2c/fluxvariables.hh b/dumux/geomechanics/el1p2c/fluxvariables.hh deleted file mode 100644 index 40c5bf0b5316d79acd94dc5d69ecc7cb75460827..0000000000000000000000000000000000000000 --- a/dumux/geomechanics/el1p2c/fluxvariables.hh +++ /dev/null @@ -1,327 +0,0 @@ -// -*- mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- -// vi: set et ts=4 sw=4 sts=4: -/***************************************************************************** - * See the file COPYING for full copying permissions. * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 2 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program. If not, see . * - *****************************************************************************/ -/*! - * \file - * - * \brief This file contains the calculation of all the fluxes over the surface of the - * finite volume that make up the volume, the mass and the momentum balance - * for the one-phase two-component linear-elastic model. - * - * This means pressure, concentration and solid-displacement gradients, phase densities at - * the integration point, etc. - * - * This class inherits from the one-phase two-component model FluxVariables and from the - * linear elasticity model FluxVariables - */ -#ifndef DUMUX_ELASTIC1P2C_FLUX_VARIABLES_HH -#define DUMUX_ELASTIC1P2C_FLUX_VARIABLES_HH - -#include -#include - -namespace Dumux -{ -/*! - * \ingroup ElOnePTwoCBoxModel - * \ingroup ImplicitFluxVariables - * \brief This template class contains the data which is required to - * calculate the fluxes over the surface of the - * finite volume that make up the volume, the mass and the momentum balance - * for the one-phase two-component linear-elastic model. - * - * This means pressure, concentration and solid-displacement gradients, phase densities at - * the integration point, etc. - * - */ -template -class ElOnePTwoCFluxVariables: public ElasticFluxVariablesBase , - public OnePTwoCFluxVariables -{ - friend class ElasticFluxVariablesBase; // be friends with parents - friend class OnePTwoCFluxVariables; // be friends with parents - - typedef ElasticFluxVariablesBase ElasticBase; - typedef OnePTwoCFluxVariables OnePTwoCBase; - - typedef typename GET_PROP_TYPE(TypeTag, Problem) Problem; - typedef typename GET_PROP_TYPE(TypeTag, VolumeVariables) VolumeVariables; - typedef typename GET_PROP_TYPE(TypeTag, ElementVolumeVariables) ElementVolumeVariables; - typedef typename GET_PROP_TYPE(TypeTag, EffectiveDiffusivityModel) EffectiveDiffusivityModel; - - typedef typename GET_PROP_TYPE(TypeTag, GridView) GridView; - typedef typename GridView::template Codim<0>::Entity Element; - enum - { - dim = GridView::dimension, - dimWorld = GridView::dimensionworld - }; - - typedef typename GridView::ctype CoordScalar; - typedef typename GET_PROP_TYPE(TypeTag, Scalar) Scalar; - typedef Dune::FieldVector GlobalPosition; - typedef Dune::FieldVector DimVector; - - typedef typename GET_PROP_TYPE(TypeTag, FVElementGeometry) FVElementGeometry; - typedef typename FVElementGeometry::SubControlVolumeFace SCVFace; - -public: - /*! - * \brief Compute / update the flux variables - * - * \param problem The problem - * \param element The finite element - * \param fvGeometry The finite-volume geometry - * \param fIdx The local index of the SCV (sub-control-volume) face - * \param elemVolVars The volume variables of the current element - * \param onBoundary A boolean variable to specify whether the flux variables - * are calculated for interior SCV faces or boundary faces, default=false - */ - void update(const Problem &problem, - const Element &element, - const FVElementGeometry &fvGeometry, - const int fIdx, - const ElementVolumeVariables &elemVolVars, - const bool onBoundary = false) - { - ElasticBase::update(problem, element, fvGeometry, fIdx, elemVolVars); - OnePTwoCBase::update(problem, element, fvGeometry, fIdx, elemVolVars); - - dU_ = 0.0; - dGradP_ = 0.0; - porosity_ = 0.0; - effPorosity_ = 0.0; - pressure_ = 0.0; - timeDerivUNormal_ = 0.0; - - elOnePTwoCGradients_(problem, element, elemVolVars); - calculateEffectiveValues_(problem, element, elemVolVars); - calculateDiffCoeffPM_(problem, element, elemVolVars); - calculateDDt_(problem, element, elemVolVars); - } - -public: - /*! - * \brief Return porosity [-] at the integration point. - */ - Scalar porosity() const - { - return porosity_; - } - - /*! - * \brief Return effective porosity [-] at the integration point. - */ - Scalar effPorosity() const - { - return effPorosity_; - } - - /*! - * \brief Return pressure [Pa] at the integration - * point. - */ - Scalar pressure() const - { - return pressure_; - } - - /*! - * \brief Return change of pressure gradient with time [Pa/m] at - * integration point. - */ - Scalar dGradP(int dimIdx) const - { - return dGradP_[dimIdx]; - } - - /*! - * \brief Return gradient of time derivative of pressure [Pa]. - */ - Scalar timeDerivGradPNormal() const - { - return timeDerivGradPNormal_; - } - - /*! - * \brief Return change of u [m] with time at integration point - * point. - */ - Scalar dU(int dimIdx) const - { - return dU_[dimIdx]; - } - - /*! - * \brief Return time derivative of u [m/s] in normal direction at integration point - */ - Scalar timeDerivUNormal() const - { - return timeDerivUNormal_; - } - - /*! - * \brief Return porous medium diffusion coefficient [m^2] - */ - Scalar diffCoeffPM() const - { - return diffCoeffPM_; - } - - const SCVFace &face() const - { - return ElasticBase::face(); - } - -protected: - // Overload the parent's methods to avoid ambiguous overloads due to multiple inheritance - // The elastic gradients are already computed in the elastic base class update - void calculateGradients_(const Problem &problem, - const Element &element, - const ElementVolumeVariables &elemVolVars) - { - OnePTwoCBase::calculateGradients_(problem, element, elemVolVars); - } - - /*! - * \brief Calculation of the solid displacement and pressure gradients. - * - * \param problem The considered problem file - * \param element The considered element of the grid - * \param elemVolVars The parameters stored in the considered element - */ - void elOnePTwoCGradients_(const Problem &problem, - const Element &element, - const ElementVolumeVariables &elemVolVars) - { - // calculate gradients - GlobalPosition tmp(0.0); - for (int idx = 0; idx < ElasticBase::fvGeometry_().numScv; idx++) // loop over adjacent vertices - { - // FE gradient at vertex idx - const DimVector &feGrad = face().grad[idx]; - - // the gradient of the temporal pressure change (needed for stabilization term) - tmp = feGrad; - tmp *= elemVolVars[idx].dPressure(); - dGradP_ += tmp; - - // average the pressure at integration point - pressure_ += elemVolVars[idx].pressure() - * face().shapeValue[idx]; - // average temporal displacement change at integration point (for calculation of solid displacement velocity) - for (int i = 0; i < dim; ++i) - dU_[i] += elemVolVars[idx].dU(i) - * face().shapeValue[idx]; - // average porosity at integration point - porosity_ += elemVolVars[idx].porosity() - * face().shapeValue[idx]; - } - } - - /*! - * \brief Calculation of the effective porosity. - * - * \param problem The considered problem file - * \param element The considered element of the grid - * \param elemVolVars The parameters stored in the considered element - */ - void calculateEffectiveValues_(const Problem &problem, - const Element &element, - const ElementVolumeVariables &elemVolVars) - { - - // the effective porosity is calculated as a function of solid displacement and initial porosity - // according to Han & Dusseault (2003) - - // calculate effective porosity as a function of solid displacement and initial porosity - effPorosity_ = (porosity_ + this->divU()) - / (1 + this->divU()); - } - - /*! - * \brief Calculation of the effective porous media diffusion coefficient. - * - * \param problem The considered problem file - * \param element The considered element of the grid - * \param elemVolVars The parameters stored in the considered element - */ - void calculateDiffCoeffPM_(const Problem &problem, - const Element &element, - const ElementVolumeVariables &elemVolVars) - { - const VolumeVariables &volVarsI = elemVolVars[face().i]; - const VolumeVariables &volVarsJ = elemVolVars[face().j]; - - const Scalar diffCoeffI = - EffectiveDiffusivityModel::effectiveDiffusivity(volVarsI.porosity(), - /*sat=*/1.0, - volVarsI.diffCoeff()); - - const Scalar diffCoeffJ = - EffectiveDiffusivityModel::effectiveDiffusivity(volVarsJ.porosity(), - /*sat=*/1.0, - volVarsJ.diffCoeff()); - - diffCoeffPM_ = harmonicMean(diffCoeffI, diffCoeffJ); - } - - /*! - * \brief Calculation of the time derivative of solid displacement and pressure gradient - * \param problem The considered problem file - * \param element The considered element of the grid - * \param elemVolVars The parameters stored in the considered element - */ - void calculateDDt_(const Problem &problem, - const Element &element, - const ElementVolumeVariables &elemVolVars) - { - Scalar dt= problem.timeManager().timeStepSize(); - DimVector tmp(0.0); - - //time derivative of solid displacement times normal vector - for (int i = 0; i < dim; ++i) - tmp[i] = dU_[i] / dt; - timeDerivUNormal_ = tmp * face().normal; - //time derivative of pressure gradient times normal vector - for (int i = 0; i < dim; ++i) - tmp[i] = dGradP_[i] / dt; - timeDerivGradPNormal_ = tmp * face().normal; - } - - //! change of solid displacement with time at integration point - GlobalPosition dU_; - //! change of pressure gradient with time at integration point - GlobalPosition dGradP_; - //! porosity at integration point - Scalar porosity_; - //! effective porosity at integration point - Scalar effPorosity_; - //! pressure at integration point - Scalar pressure_; - //! time derivative of solid displacement times normal vector at integration point - Scalar timeDerivUNormal_; - //! time derivative of pressure gradient times normal vector at integration point - Scalar timeDerivGradPNormal_; - //! Parameters - Scalar diffCoeffPM_; -}; - -} // end namespace - -#endif diff --git a/dumux/geomechanics/el1p2c/indices.hh b/dumux/geomechanics/el1p2c/indices.hh deleted file mode 100644 index 6b5c446286b96ef07e679c79a0720d6ec39ef04e..0000000000000000000000000000000000000000 --- a/dumux/geomechanics/el1p2c/indices.hh +++ /dev/null @@ -1,53 +0,0 @@ -// -*- mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- -// vi: set et ts=4 sw=4 sts=4: -/***************************************************************************** - * See the file COPYING for full copying permissions. * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 2 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program. If not, see . * - *****************************************************************************/ -/*! - * \file - * - * \brief Defines the primary variable and equation indices used by - * the one-phase two-component linear elasticity model. - */ - -#ifndef DUMUX_ELASTIC1P2C_INDICES_HH -#define DUMUX_ELASTIC1P2C_INDICES_HH - -#include -#include - -namespace Dumux -{ -// \{ - -/*! - * \ingroup ElOnePTwoCBoxModel - * \ingroup ImplicitIndices - * \brief The indices for the one-phase two-component linear elasticity model. - * - * This class inherits from the OnePTwoCIndices and from the ElasticIndices - */ -template -// PVOffset is set to 0 for the OnePTwoCIndices and to 2 for the ElasticIndices since -// the first two primary variables are the primary variables of the one-phase two-component -// model followed by the primary variables of the elastic model -class ElOnePTwoCIndices : public OnePTwoCIndices, public ElasticIndices<2> -{ -}; - -} // namespace Dumux - -#endif diff --git a/dumux/geomechanics/el1p2c/localjacobian.hh b/dumux/geomechanics/el1p2c/localjacobian.hh deleted file mode 100644 index 4184d8cd4aa2dc93c0fb74f75241a7952d40e224..0000000000000000000000000000000000000000 --- a/dumux/geomechanics/el1p2c/localjacobian.hh +++ /dev/null @@ -1,258 +0,0 @@ -// -*- mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- -// vi: set et ts=4 sw=4 sts=4: -/***************************************************************************** - * See the file COPYING for full copying permissions. * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 2 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program. If not, see . * - *****************************************************************************/ -/*! - * \file - * \brief Calculates the partial derivatives of the local residual for the Jacobian of the - * one-phase two-component linear elasticity model. - */ -#ifndef DUMUX_EL1P2C_LOCAL_JACOBIAN_HH -#define DUMUX_EL1P2C_LOCAL_JACOBIAN_HH - -#include - -namespace Dumux -{ -/*! - * \ingroup ElOnePTwoCBoxModel - * \brief Calculates the partial derivatives of the local residual for the Jacobian - * - * Except for the evalPartialDerivatives function all functions are taken from the - * base class ImplicitLocalJacobian - */ -template -class ElOnePTwoCLocalJacobian : public ImplicitLocalJacobian -{ -private: - typedef typename GET_PROP_TYPE(TypeTag, GridView) GridView; - enum { - dim = GridView::dimension, - }; - typedef typename GET_PROP_TYPE(TypeTag, FVElementGeometry) FVElementGeometry; - typedef typename GET_PROP_TYPE(TypeTag, ElementSolutionVector) ElementSolutionVector; - typedef typename GET_PROP_TYPE(TypeTag, PrimaryVariables) PrimaryVariables; - typedef typename GET_PROP_TYPE(TypeTag, VolumeVariables) VolumeVariables; - typedef typename GET_PROP_TYPE(TypeTag, Scalar) Scalar; - enum { isBox = GET_PROP_VALUE(TypeTag, ImplicitIsBox) }; - - // copying a local jacobian is not a good idea - ElOnePTwoCLocalJacobian(const ElOnePTwoCLocalJacobian &); - -public: - ElOnePTwoCLocalJacobian() - {} - - /*! - * \brief Compute the partial derivatives to a primary variable at - * an degree of freedom. - * - * This method is overwritten here since this model requires a call of the model specific - * elementvolumevariables which updates the effective porosities correctly. - * - * The default implementation of this method uses numeric - * differentiation, i.e. forward or backward differences (2nd - * order), or central differences (3rd order). The method used is - * determined by the "NumericDifferenceMethod" property: - * - * - if the value of this property is smaller than 0, backward - * differences are used, i.e.: - * \f[ - \frac{\partial f(x)}{\partial x} \approx \frac{f(x) - f(x - \epsilon)}{\epsilon} - * \f] - * - * - if the value of this property is 0, central - * differences are used, i.e.: - * \f[ - \frac{\partial f(x)}{\partial x} \approx \frac{f(x + \epsilon) - f(x - \epsilon)}{2 \epsilon} - * \f] - * - * - if the value of this property is larger than 0, forward - * differences are used, i.e.: - * \f[ - \frac{\partial f(x)}{\partial x} \approx \frac{f(x + \epsilon) - f(x)}{\epsilon} - * \f] - * - * Here, \f$ f \f$ is the residual function for all equations, \f$x\f$ - * is the value of a sub-control volume's primary variable at the - * evaluation point and \f$\epsilon\f$ is a small value larger than 0. - * - * \param partialDeriv The vector storing the partial derivatives of all - * equations - * \param storageDeriv the mass matrix contributions - * \param col The block column index of the degree of freedom - * for which the partial derivative is calculated. - * Box: a sub-control volume index. - * Cell centered: a neighbor index. - * \param pvIdx The index of the primary variable - * for which the partial derivative is calculated - */ - void evalPartialDerivative_(ElementSolutionVector &partialDeriv, - PrimaryVariables &storageDeriv, - const int col, - const int pvIdx) - { - int dofIdxGlobal; - FVElementGeometry neighborFVGeom; - auto neighbor = this->element_(); - if (isBox) - { - dofIdxGlobal = this->vertexMapper_().subIndex(this->element_(), col, dim); - - } - else - { - neighbor = this->fvElemGeom_.neighbors[col]; - neighborFVGeom.updateInner(neighbor); - dofIdxGlobal = this->problemPtr_->elementMapper().index(neighbor); - - } - - PrimaryVariables priVars(this->model_().curSol()[dofIdxGlobal]); - VolumeVariables origVolVars(this->curVolVars_[col]); - - this->curVolVars_[col].setEvalPoint(&origVolVars); - Scalar eps = this->numericEpsilon(col, pvIdx); - Scalar delta = 0; - - if (this->numericDifferenceMethod_ >= 0) { - // we are not using backward differences, i.e. we need to - // calculate f(x + \epsilon) - - // deflect primary variables - priVars[pvIdx] += eps; - delta += eps; - - // calculate the residual - if (isBox){ - this->curVolVars_[col].update(priVars, - this->problem_(), - this->element_(), - this->fvElemGeom_, - col, - false); - // update the effective porosities - this->curVolVars_.updateEffPorosity(this->problem_(), - this->element_(), - this->fvElemGeom_); - } - else{ - this->curVolVars_[col].update(priVars, - this->problem_(), - neighbor, - neighborFVGeom, - /*scvIdx=*/0, - false); - // update the effective porosities - this->curVolVars_.updateEffPorosity(this->problem_(), - this->element_(), - this->fvElemGeom_); - } - - this->localResidual().eval(this->element_(), - this->fvElemGeom_, - this->prevVolVars_, - this->curVolVars_, - this->bcTypes_); - - // store the residual and the storage term - partialDeriv = this->localResidual().residual(); - if (isBox || col == 0) - storageDeriv = this->localResidual().storageTerm()[col]; - } - else { - // we are using backward differences, i.e. we don't need - // to calculate f(x + \epsilon) and we can recycle the - // (already calculated) residual f(x) - partialDeriv = this->residual_; - storageDeriv = this->storageTerm_[col]; - } - - - if (this->numericDifferenceMethod_ <= 0) { - // we are not using forward differences, i.e. we don't - // need to calculate f(x - \epsilon) - - // deflect the primary variables - priVars[pvIdx] -= delta + eps; - delta += eps; - - // calculate residual again - if (isBox){ - this->curVolVars_[col].update(priVars, - this->problem_(), - this->element_(), - this->fvElemGeom_, - col, - false); - // update the effective porosities - this->curVolVars_.updateEffPorosity(this->problem_(), - this->element_(), - this->fvElemGeom_); - } - else{ - this->curVolVars_[col].update(priVars, - this->problem_(), - neighbor, - neighborFVGeom, - /*scvIdx=*/0, - false); - // update the effective porosities - this->curVolVars_.updateEffPorosity(this->problem_(), - this->element_(), - this->fvElemGeom_); - } - - this->localResidual().eval(this->element_(), - this->fvElemGeom_, - this->prevVolVars_, - this->curVolVars_, - this->bcTypes_); - partialDeriv -= this->localResidual().residual(); - if (isBox || col == 0) - storageDeriv -= this->localResidual().storageTerm()[col]; - } - else { - // we are using forward differences, i.e. we don't need to - // calculate f(x - \epsilon) and we can recycle the - // (already calculated) residual f(x) - partialDeriv -= this->residual_; - if (isBox || col == 0) - storageDeriv -= this->storageTerm_[col]; - } - - // divide difference in residuals by the magnitude of the - // deflections between the two function evaluation - partialDeriv /= delta; - storageDeriv /= delta; - - // restore the original state of the element's volume variables - this->curVolVars_[col] = origVolVars; - // update the effective porosities - this->curVolVars_.updateEffPorosity(this->problem_(), - this->element_(), - this->fvElemGeom_); - -#if HAVE_VALGRIND - for (unsigned i = 0; i < partialDeriv.size(); ++i) - Valgrind::CheckDefined(partialDeriv[i]); -#endif - } -}; -} - -#endif diff --git a/dumux/geomechanics/el1p2c/localresidual.hh b/dumux/geomechanics/el1p2c/localresidual.hh deleted file mode 100644 index 2e2e7628784362e952c95e618be6c15dc33bdaff..0000000000000000000000000000000000000000 --- a/dumux/geomechanics/el1p2c/localresidual.hh +++ /dev/null @@ -1,388 +0,0 @@ -// -*- mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- -// vi: set et ts=4 sw=4 sts=4: -/***************************************************************************** - * See the file COPYING for full copying permissions. * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 2 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program. If not, see . * - *****************************************************************************/ -/*! - * \file - * - * \brief Element-wise calculation the local Jacobian for the linear elastic, - * single-phase, two-component model in the fully implicit scheme. - */ -#ifndef DUMUX_ELASTIC1P2C_LOCAL_RESIDUAL_HH -#define DUMUX_ELASTIC1P2C_LOCAL_RESIDUAL_HH - -#include "properties.hh" - -namespace Dumux -{ - /*! - * \ingroup ElOnePTwoCModel - * \ingroup ImplicitLocalResidual - * \brief Calculate the local Jacobian for a one-phase two-component - * flow in a linear-elastic porous medium. - * - * This class is used to fill the gaps in BoxLocalResidual for the - * one-phase two-component linear elasticity model. - */ - template - class ElOnePTwoCLocalResidual: public GET_PROP_TYPE(TypeTag, BaseLocalResidual) - { - protected: - typedef typename GET_PROP_TYPE(TypeTag, LocalResidual) Implementation; - typedef typename GET_PROP_TYPE(TypeTag, Scalar) Scalar; - typedef typename GET_PROP_TYPE(TypeTag, GridView) GridView; - - enum { dim = GridView::dimension }; - typedef Dune::FieldMatrix DimMatrix; - typedef Dune::FieldVector DimVector; - - typedef typename GET_PROP_TYPE(TypeTag, VolumeVariables) VolumeVariables; - typedef typename GET_PROP_TYPE(TypeTag, FluxVariables) FluxVariables; - typedef typename GET_PROP_TYPE(TypeTag, PrimaryVariables) PrimaryVariables; - typedef typename GET_PROP_TYPE(TypeTag, ElementVolumeVariables) ElementVolumeVariables; - typedef typename GET_PROP_TYPE(TypeTag, FluidSystem) FluidSystem; - typedef typename GET_PROP_TYPE(TypeTag, Indices) Indices; - - enum { - //phase index - phaseIdx = Indices::phaseIdx, - transportCompIdx = Indices::transportCompIdx - }; - // indices of the equations - enum { - conti0EqIdx = Indices::conti0EqIdx, - transportEqIdx = Indices::transportEqIdx - }; - - //! property that defines whether mole or mass fractions are used - static const bool useMoles = GET_PROP_VALUE(TypeTag, UseMoles); - - - public: - /*! - * \brief Constructor. Sets the upwind weight. - */ - ElOnePTwoCLocalResidual() - { - // retrieve the upwind weight for the mass conservation equations. Use the value - // specified via the property system as default, and overwrite - // it by the run-time parameter from the Dune::ParameterTree - upwindWeight_ = GET_PARAM_FROM_GROUP(TypeTag, Scalar, Implicit, MassUpwindWeight); - // retrieve the property which defines if the stabilization terms in the mass balance - // equations are switched on. Use the value specified via the property system as default, - // and overwrite it by the run-time parameter from the Dune::ParameterTree - withStabilization_ = GET_PARAM_FROM_GROUP(TypeTag, bool, Implicit, WithStabilization); - }; - - /*! - * \brief Evaluate the amount of all conservation quantities - * (e.g. phase mass) within a finite volume. - * - * \param storage The mass of the component within the sub-control volume - * \param scvIdx The index of the considered face of the sub-control volume - * \param usePrevSol Evaluate function with solution of current or previous time step - */ - void computeStorage(PrimaryVariables &storage, int scvIdx, - bool usePrevSol) const - { - // if flag usePrevSol is set, the solution from the previous - // time step is used, otherwise the current solution is - // used. The secondary variables are used accordingly. This - // is required to compute the derivative of the storage term - // using the implicit euler method. - const ElementVolumeVariables &elemVolVars = usePrevSol ? this->prevVolVars_() : this->curVolVars_(); - const VolumeVariables &volVars = elemVolVars[scvIdx]; - - storage = 0; - // this model assumes incompressible fluids and solids only the bulk - // density i.e. the ratio of solid phase and pore fluid can vary - // storage term of continuity equation - storage[conti0EqIdx] += volVars.divU; - - if(useMoles) - { - // storage term of the transport equation - mole fractions - storage[transportEqIdx] += volVars.moleFraction(transportCompIdx) - * volVars.effPorosity; - } - else - { - //storage term of the transport equation - mass fractions - storage[transportEqIdx] += volVars.massFraction(transportCompIdx) - * volVars.effPorosity; - } - } - - /*! - * \brief Evaluate the mass flux over a face of a sub-control - * volume. - * - * \param flux The flux over the SCV (sub-control-volume) face for each component - * \param fIdx The index of the considered face of the sub control volume - * \param onBoundary A boolean variable to specify whether the flux variables - * are calculated for interior SCV faces or boundary faces, default=false - */ - void computeFlux(PrimaryVariables &flux, int fIdx, const bool onBoundary=false) const - { - flux = 0; - FluxVariables fluxVars; - fluxVars.update(this->problem_(), - this->element_(), - this->fvGeometry_(), - fIdx, - this->curVolVars_()); - - this->computeAdvectiveFlux(flux, fluxVars); - this->computeDiffusiveFlux(flux, fluxVars); - this->computeStresses(flux, fluxVars, fIdx); - } - - /*! - * \brief Evaluates the advective mass flux of all phases over - * a face of a subcontrol volume. - * - * \param flux The advective flux over the sub-control-volume face for each component - * \param fluxVars The flux variables at the current SCV - */ - void computeAdvectiveFlux(PrimaryVariables &flux, - const FluxVariables &fluxVars) const - { - //////// - // advective fluxes of all components in all phases - //////// - - // data attached to upstream and the downstream vertices - // of the current phase - const VolumeVariables &up = - this->curVolVars_(fluxVars.upstreamIdx()); - const VolumeVariables &dn = - this->curVolVars_(fluxVars.downstreamIdx()); - - // calculate the stabilization term which helps in case of stability problems - // e.g. observed for small time steps (according to G.Aguilar, F.Gaspar, F.Lisbona - // and C.Rodrigo (2008)) - Scalar stabilizationTerm(0.0); - if(withStabilization_){ - // calculate distance h between nodes i and j - const auto geometry = this->element_().geometry(); - DimVector hVec = geometry.corner(fluxVars.face().j) - - geometry.corner(fluxVars.face().i); - Scalar h = hVec.two_norm(); - stabilizationTerm = (h * h) / - (4 * (fluxVars.lambda() - + 2 * fluxVars.mu())); - - stabilizationTerm *= fluxVars.timeDerivGradPNormal(); - } - - - // flux for mass balance of the solid-fluid mixture - // KmvpNormal is the Darcy velocity multiplied with the normal vector, - // calculated in 1p2cfluxvariables.hh - flux[conti0EqIdx] += - fluxVars.KmvpNormal() * - (( upwindWeight_)/up.viscosity() - + - ((1 - upwindWeight_)/dn.viscosity())); - - - // stabilization term - if(withStabilization_) - flux[conti0EqIdx] -= stabilizationTerm; - - if(useMoles) - { - // mass flux of the dissolved second component - massfraction - // advective flux of the component - flux[transportEqIdx] += - fluxVars.KmvpNormal() * - (( upwindWeight_)* up.moleFraction(transportCompIdx)/up.viscosity() - + - (1 - upwindWeight_)* dn.moleFraction(transportCompIdx)/dn.viscosity()); - - // flux of the dissolved second component due to solid displacement - flux[transportEqIdx] += - fluxVars.timeDerivUNormal() * - (( upwindWeight_)* up.moleFraction(transportCompIdx) - * up.effPorosity - + - (1 - upwindWeight_)*dn.moleFraction(transportCompIdx) - * up.effPorosity); - - // stabilization term - if(withStabilization_) - flux[transportEqIdx] -= - stabilizationTerm * - (( upwindWeight_)* up.moleFraction(transportCompIdx) - + - (1 - upwindWeight_)*dn.moleFraction(transportCompIdx)); - } - else - { - // mass flux of the dissolved second component - massfraction - // advective flux of the component - flux[transportEqIdx] += - fluxVars.KmvpNormal() * - (( upwindWeight_)* up.massFraction(transportCompIdx)/up.viscosity() - + - (1 - upwindWeight_)* dn.massFraction(transportCompIdx)/dn.viscosity()); - - // flux of the dissolved second component due to solid displacement - flux[transportEqIdx] += - fluxVars.timeDerivUNormal() * - (( upwindWeight_)* up.massFraction(transportCompIdx) - * up.effPorosity - + - (1 - upwindWeight_)*dn.massFraction(transportCompIdx) - * up.effPorosity); - - // stabilization term - if(withStabilization_) - flux[transportEqIdx] -= - stabilizationTerm * - (( upwindWeight_)* up.massFraction(transportCompIdx) - + - (1 - upwindWeight_)*dn.massFraction(transportCompIdx)); - } - } - - /*! - * \brief Adds the diffusive mass flux of all components over - * a face of a sub-control volume. - * - * \param flux The diffusive flux over the sub-control-volume face for each component - * \param fluxVars The flux variables at the current sub-control-volume face - */ - void computeDiffusiveFlux(PrimaryVariables &flux, - const FluxVariables &fluxVars) const - { - Scalar tmp(0); - - // diffusive flux of second component - if(useMoles) - { - // diffusive flux of the second component - mole fraction - tmp = -(fluxVars.moleFractionGrad(transportCompIdx)*fluxVars.face().normal); - tmp *= fluxVars.diffCoeffPM(); - - // dispersive flux of second component - mole fraction - DimVector normalDisp; - fluxVars.dispersionTensor().mv(fluxVars.face().normal, normalDisp); - tmp -= (normalDisp * fluxVars.moleFractionGrad(transportCompIdx)); - - flux[transportEqIdx] += tmp; - } - else - { - // diffusive flux of the second component - mass fraction - tmp = -(fluxVars.moleFractionGrad(transportCompIdx)*fluxVars.face().normal); - tmp *= fluxVars.diffCoeffPM(); - - // dispersive flux of second component - mass fraction - DimVector normalDisp; - fluxVars.dispersionTensor().mv(fluxVars.face().normal, normalDisp); - tmp -= (normalDisp * fluxVars.moleFractionGrad(transportCompIdx)); - - // convert it to a mass flux and add it - flux[transportEqIdx] += tmp * FluidSystem::molarMass(transportCompIdx); - } - } - - /*! - * \brief Evaluates the total stress induced by effective stresses and fluid - * pressure in the solid fluid mixture. - * \param stress The stress over the sub-control-volume face for each component - * \param fluxVars The variables at the current sub-control-volume face - * \param fIdx The index of the current sub-control-volume face - */ - void computeStresses(PrimaryVariables &stress, - const FluxVariables &fluxVars, const int fIdx) const - { - DimMatrix pressure(0.0), sigma(0.0); - // the normal vector corresponding to the current sub-control-volume face - const DimVector &normal(this->fvGeometry_().subContVolFace[fIdx].normal); - - // the pressure term of the momentum balance - for (int i = 0; i < dim; ++i) - pressure[i][i] += 1.0; - - pressure *= fluxVars.pressure(); - // effective stresses - sigma = fluxVars.sigma(); - // calculate total stresses by subtracting the pressure - sigma -= pressure; - - DimVector tmp(0.0); - // multiply total stress tensor with normal vector of current face - sigma.mv(normal, tmp); - - // set the stress term equal to the calculated vector - for (int i = 0; i < dim; ++i) - stress[Indices::momentum(i)] = tmp[i]; - } - - /*! - * \brief Calculate the source term of the equation - * \param source The source/sink in the SCV for each component - * \param scvIdx The index of the vertex of the sub control volume - * - */ - void computeSource(PrimaryVariables &source, const int scvIdx) - { - source = 0; - - const ElementVolumeVariables &elemVolVars = this->curVolVars_(); - const VolumeVariables &volVars = elemVolVars[scvIdx]; - - DimVector tmp1(0.0), tmp2(0.0); - - this->problem_().solDependentSource(source, - this->element_(), - this->fvGeometry_(), - scvIdx, - this->curVolVars_()); - - // the gravity term of the momentum balance equation is treated as a source term - // gravity contribution of solid matrix - tmp1 = this->problem_().gravity(); - tmp1 *= volVars.rockDensity(); - tmp1 *= (1. - volVars.effPorosity); - - // gravity contribution of the fluids - tmp2 = this->problem_().gravity(); - tmp2 *= volVars.density(); - tmp2 *= volVars.effPorosity; - - tmp1 += tmp2; - - for (int i = 0; i < dim; ++i) - source[Indices::momentum(i)] += tmp1[i]; - } - - Implementation *asImp_() - { return static_cast (this); } - const Implementation *asImp_() const - { return static_cast (this); } - - private: - Scalar upwindWeight_; - bool withStabilization_; - }; - -} - -#endif diff --git a/dumux/geomechanics/el1p2c/model.hh b/dumux/geomechanics/el1p2c/model.hh deleted file mode 100644 index a04dbe03a79f5dcb57671af90d24a64239c39d2d..0000000000000000000000000000000000000000 --- a/dumux/geomechanics/el1p2c/model.hh +++ /dev/null @@ -1,517 +0,0 @@ -// -*- mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- -// vi: set et ts=4 sw=4 sts=4: -/***************************************************************************** - * See the file COPYING for full copying permissions. * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 2 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program. If not, see . * - *****************************************************************************/ -/*! - * \file - * - * \brief Base class for all models which use the one-phase two-component linear elasticity model. - * Adaption of the fully implicit scheme to the one-phase two-component linear elasticity model. - */ -#ifndef DUMUX_ELASTIC1P2C_MODEL_HH -#define DUMUX_ELASTIC1P2C_MODEL_HH - -#include "properties.hh" -#include - -namespace Dumux { -/*! - * \ingroup ElOnePTwoCBoxModel - * \brief Adaption of the fully implicit scheme to the one-phase two-component linear elasticity model. - * - * This model implements a one-phase flow of an incompressible fluid, that consists of two components. - * The deformation of the solid matrix is described with a quasi-stationary momentum balance equation. - * The influence of the pore fluid is accounted for through the effective stress concept (Biot 1941). - * The total stress acting on a rock is partially supported by the rock matrix and partially supported - * by the pore fluid. The effective stress represents the share of the total stress which is supported - * by the solid rock matrix and can be determined as a function of the strain according to Hooke's law. - * - * As an equation for the conservation of momentum within the fluid phase Darcy's approach is used: - \f[ - v = - \frac{\textbf K}{\mu} - \left(\textbf{grad}\, p - \varrho_w {\textbf g} \right) - \f] - * - * Gravity can be enabled or disabled via the property system. - * By inserting this into the volume balance of the solid-fluid mixture, one gets - \f[ - \frac{\partial \text{div} \textbf{u}}{\partial t} - \text{div} \left\{ - \frac{\textbf K}{\mu} \left(\textbf{grad}\, p - \varrho_w {\textbf g} \right)\right\} = q \;, - \f] - * - * The transport of the components \f$\kappa \in \{ w, a \}\f$ is described by the following equation: - \f[ - \frac{ \partial \phi_{eff} X^\kappa}{\partial t} - - \text{div} \left\lbrace - X^\kappa \frac{{\textbf K}}{\mu} \left( \textbf{grad}\, p - \varrho_w {\textbf g} \right) - + D^\kappa_\text{pm} \frac{M^\kappa}{M_\alpha} \textbf{grad} x^\kappa - - \phi_{eff} X^\kappa \frac{\partial \boldsymbol{u}}{\partial t} - \right\rbrace = q. - \f] - * - * If the model encounters stability problems, a stabilization term can be switched on. The stabilization - * term is defined in Aguilar et al (2008): - \f[ - \beta \text{div} \textbf{grad} \frac{\partial p}{\partial t} - \f] - with \f$\beta\f$: - \f[ - \beta = h^2 / 4(\lambda + 2 \mu) - \f] - * where \f$h\f$ is the discretization length. - * - * The balance equations - * with the stabilization term are given below: - \f[ - \frac{\partial \text{div} \textbf{u}}{\partial t} - \text{div} \left\{ - \frac{\textbf K}{\mu} \left(\textbf{grad}\, p - \varrho_w {\textbf g} \right) - + \varrho_w \beta \textbf{grad} \frac{\partial p}{\partial t} - \right\} = q \;, - \f] - * - * The transport of the components \f$\kappa \in \{ w, a \}\f$ is described by the following equation: - * - \f[ - \frac{ \partial \phi_{eff} X^\kappa}{\partial t} - - \text{div} \left\lbrace - X^\kappa \frac{{\textbf K}}{\mu} \left( \textbf{grad}\, p - \varrho_w {\textbf g} \right) - + \varrho_w X^\kappa \beta \textbf{grad} \frac{\partial p}{\partial t} - + D^\kappa_\text{pm} \frac{M^\kappa}{M_\alpha} \textbf{grad} x^\kappa - - \phi_{eff} X^\kappa \frac{\partial \boldsymbol{u}}{\partial t} - \right\rbrace = q. - \f] - * - * - * The quasi-stationary momentum balance equation is: - \f[ - \text{div}\left( \boldsymbol{\sigma'}- p \boldsymbol{I} \right) + \left( \phi_{eff} \varrho_w + (1 - \phi_{eff}) * \varrho_s \right) - {\textbf g} = 0 \;, - \f] - * with the effective stress: - \f[ - \boldsymbol{\sigma'} = 2\,G\,\boldsymbol{\epsilon} + \lambda \,\text{tr} (\boldsymbol{\epsilon}) \, \boldsymbol{I}. - \f] - * - * and the strain tensor \f$\boldsymbol{\epsilon}\f$ as a function of the solid displacement gradient \f$\textbf{grad} \boldsymbol{u}\f$: - \f[ - \boldsymbol{\epsilon} = \frac{1}{2} \, (\textbf{grad} \boldsymbol{u} + \textbf{grad}^T \boldsymbol{u}). - \f] - * - * Here, the rock mechanics sign convention is switch off which means compressive stresses are < 0 and tensile stresses are > 0. - * The rock mechanics sign convention can be switched on for the vtk output via the property system. - * - * The effective porosity is calculated as a function of the solid displacement: - \f[ - \phi_{eff} = \frac{\phi_{init} + \text{div} \boldsymbol{u}}{1 + \text{div}} - \f] - * All equations are discretized using a vertex-centered finite volume (box) - * or cell-centered finite volume scheme as spatial - * and the implicit Euler method as time discretization. - * - * The primary variables are the pressure \f$p\f$ and the mole or mass fraction of dissolved component \f$x\f$ and the solid - * displacement vector \f$\boldsymbol{u}\f$. - */ - - -template -class ElOnePTwoCModel: public GET_PROP_TYPE(TypeTag, BaseModel) -{ - typedef typename GET_PROP_TYPE(TypeTag, FVElementGeometry) FVElementGeometry; - typedef typename GET_PROP_TYPE(TypeTag, FluxVariables) FluxVariables; - typedef typename GET_PROP_TYPE(TypeTag, ElementVolumeVariables) ElementVolumeVariables; - typedef typename GET_PROP_TYPE(TypeTag, ElementBoundaryTypes) ElementBoundaryTypes; - typedef typename GET_PROP_TYPE(TypeTag, SolutionVector) SolutionVector; - - typedef typename GET_PROP_TYPE(TypeTag, GridView) GridView; - - enum { - dim = GridView::dimension - }; - - typedef typename GET_PROP_TYPE(TypeTag, FluidSystem) FluidSystem; - - - typedef typename GET_PROP_TYPE(TypeTag, Scalar) Scalar; - typedef Dune::FieldVector DimVector; - typedef Dune::FieldMatrix DimMatrix; - -public: - /*! - * \brief \copybrief ImplicitModel::addOutputVtkFields - * - * Specialization for the ElOnePTwoCBoxModel, add one-phase two-component - * properties, solid displacement, stresses, effective properties and the - * process rank to the VTK writer. - */ - template - void addOutputVtkFields(const SolutionVector &sol, MultiWriter &writer) { - - // check whether compressive stresses are defined to be positive - // (rockMechanicsSignConvention_ == true) or negative - rockMechanicsSignConvention_ = GET_PARAM_FROM_GROUP(TypeTag, bool, Vtk, RockMechanicsSignConvention); - - typedef Dune::BlockVector > ScalarField; - typedef Dune::BlockVector > VectorField; - - // create the required scalar and vector fields - unsigned numVertices = this->gridView_().size(dim); - unsigned numElements = this->gridView_().size(0); - - // create the required fields for vertex data - ScalarField &pressure = *writer.allocateManagedBuffer(numVertices); - ScalarField &moleFraction0 = *writer.allocateManagedBuffer(numVertices); - ScalarField &moleFraction1 = *writer.allocateManagedBuffer(numVertices); - ScalarField &massFraction0 = *writer.allocateManagedBuffer(numVertices); - ScalarField &massFraction1 = *writer.allocateManagedBuffer(numVertices); - VectorField &displacement = *writer.template allocateManagedBuffer(numVertices); - ScalarField &density = *writer.allocateManagedBuffer(numVertices); - ScalarField &viscosity = *writer.allocateManagedBuffer(numVertices); - ScalarField &porosity = *writer.allocateManagedBuffer(numVertices); - ScalarField &Kx = *writer.allocateManagedBuffer(numVertices); - - // create the required fields for element data - // effective stresses - VectorField &effStressX = *writer.template allocateManagedBuffer(numElements); - VectorField &effStressY = *writer.template allocateManagedBuffer(numElements); - VectorField &effStressZ = *writer.template allocateManagedBuffer(numElements); - // total stresses - VectorField &totalStressX = *writer.template allocateManagedBuffer< - Scalar, dim>(numElements); - VectorField &totalStressY = *writer.template allocateManagedBuffer< - Scalar, dim>(numElements); - VectorField &totalStressZ = *writer.template allocateManagedBuffer< - Scalar, dim>(numElements); - - // principal stresses - ScalarField &principalStress1 = *writer.allocateManagedBuffer( - numElements); - ScalarField &principalStress2 = *writer.allocateManagedBuffer( - numElements); - ScalarField &principalStress3 = *writer.allocateManagedBuffer( - numElements); - - ScalarField &effPorosity = *writer.allocateManagedBuffer(numElements); - ScalarField &cellPorosity = *writer.allocateManagedBuffer(numElements); - ScalarField &cellKx = *writer.allocateManagedBuffer(numElements); - ScalarField &cellPressure = *writer.allocateManagedBuffer(numElements); - - // initialize cell stresses, cell-wise hydraulic parameters and cell pressure with zero - for (unsigned int eIdx = 0; eIdx < numElements; ++eIdx) { - effStressX[eIdx] = Scalar(0.0); - if (dim >= 2) - effStressY[eIdx] = Scalar(0.0); - if (dim >= 3) - effStressZ[eIdx] = Scalar(0.0); - - totalStressX[eIdx] = Scalar(0.0); - if (dim >= 2) - totalStressY[eIdx] = Scalar(0.0); - if (dim >= 3) - totalStressZ[eIdx] = Scalar(0.0); - - principalStress1[eIdx] = Scalar(0.0); - if (dim >= 2) - principalStress2[eIdx] = Scalar(0.0); - if (dim >= 3) - principalStress3[eIdx] = Scalar(0.0); - - effPorosity[eIdx] = Scalar(0.0); - cellPorosity[eIdx] = Scalar(0.0); - cellKx[eIdx] = Scalar(0.0); - cellPressure[eIdx] = Scalar(0.0); - } - ScalarField &rank = *writer.allocateManagedBuffer(numElements); - - - FVElementGeometry fvGeometry; - ElementVolumeVariables elemVolVars; - ElementBoundaryTypes elemBcTypes; - - // initialize start and end of element iterator - // loop over all elements (cells) - for (const auto& element : elements(this->gridView_(), Dune::Partitions::interior)) - { - unsigned int eIdx = this->problem_().model().elementMapper().index(element); - rank[eIdx] = this->gridView_().comm().rank(); - - fvGeometry.update(this->gridView_(), element); - elemBcTypes.update(this->problem_(), element, fvGeometry); - elemVolVars.update(this->problem_(), element, fvGeometry, false); - - // loop over all local vertices of the cell - int numScv = element.subEntities(dim); - - for (int scvIdx = 0; scvIdx < numScv; ++scvIdx) - { - unsigned int vIdxGlobal = this->dofMapper().subIndex(element, scvIdx, dim); - - pressure[vIdxGlobal] = elemVolVars[scvIdx].pressure(); - moleFraction0[vIdxGlobal] = elemVolVars[scvIdx].moleFraction(0); - moleFraction1[vIdxGlobal] = elemVolVars[scvIdx].moleFraction(1); - massFraction0[vIdxGlobal] = elemVolVars[scvIdx].massFraction(0); - massFraction1[vIdxGlobal] = elemVolVars[scvIdx].massFraction(1); - // in case of rock mechanics sign convention solid displacement is - // defined to be negative if it points in positive coordinate direction - if(rockMechanicsSignConvention_){ - DimVector tmpDispl; - tmpDispl = Scalar(0); - tmpDispl -= elemVolVars[scvIdx].displacement(); - displacement[vIdxGlobal] = tmpDispl; - } - - else - displacement[vIdxGlobal] = elemVolVars[scvIdx].displacement(); - - density[vIdxGlobal] = elemVolVars[scvIdx].density(); - viscosity[vIdxGlobal] = elemVolVars[scvIdx].viscosity(); - porosity[vIdxGlobal] = elemVolVars[scvIdx].porosity(); - Kx[vIdxGlobal] = this->problem_().spatialParams().intrinsicPermeability( - element, fvGeometry, scvIdx)[0][0]; - // calculate cell quantities by adding up scv quantities and dividing through numScv - cellPorosity[eIdx] += elemVolVars[scvIdx].porosity() / numScv; - cellKx[eIdx] += this->problem_().spatialParams().intrinsicPermeability( - element, fvGeometry, scvIdx)[0][0] / numScv; - cellPressure[eIdx] += elemVolVars[scvIdx].pressure() / numScv; - }; - - // calculate cell quantities for variables which are defined at the integration point - Scalar tmpEffPoro; - DimMatrix tmpEffStress; - tmpEffStress = Scalar(0); - tmpEffPoro = Scalar(0); - - // loop over all scv-faces of the cell - for (int fIdx = 0; fIdx < fvGeometry.numScvf; fIdx++) { - - //prepare the flux calculations (set up and prepare geometry, FE gradients) - FluxVariables fluxVars; - fluxVars.update(this->problem_(), - element, fvGeometry, - fIdx, - elemVolVars); - - // divide by number of scv-faces and sum up edge values - tmpEffPoro = fluxVars.effPorosity() / fvGeometry.numScvf; - tmpEffStress = fluxVars.sigma(); - tmpEffStress /= fvGeometry.numScvf; - - effPorosity[eIdx] += tmpEffPoro; - - // in case of rock mechanics sign convention compressive stresses - // are defined to be positive - if(rockMechanicsSignConvention_){ - effStressX[eIdx] -= tmpEffStress[0]; - if (dim >= 2) { - effStressY[eIdx] -= tmpEffStress[1]; - } - if (dim >= 3) { - effStressZ[eIdx] -= tmpEffStress[2]; - } - } - else{ - effStressX[eIdx] += tmpEffStress[0]; - if (dim >= 2) { - effStressY[eIdx] += tmpEffStress[1]; - } - if (dim >= 3) { - effStressZ[eIdx] += tmpEffStress[2]; - } - } - } - - // calculate total stresses - // in case of rock mechanics sign convention compressive stresses - // are defined to be positive and total stress is calculated by adding the pore pressure - if(rockMechanicsSignConvention_){ - totalStressX[eIdx][0] = effStressX[eIdx][0] + cellPressure[eIdx]; - totalStressX[eIdx][1] = effStressX[eIdx][1]; - totalStressX[eIdx][2] = effStressX[eIdx][2]; - if (dim >= 2) { - totalStressY[eIdx][0] = effStressY[eIdx][0]; - totalStressY[eIdx][1] = effStressY[eIdx][1] + cellPressure[eIdx]; - totalStressY[eIdx][2] = effStressY[eIdx][2]; - } - if (dim >= 3) { - totalStressZ[eIdx][0] = effStressZ[eIdx][0]; - totalStressZ[eIdx][1] = effStressZ[eIdx][1]; - totalStressZ[eIdx][2] = effStressZ[eIdx][2] + cellPressure[eIdx]; - } - } - else{ - totalStressX[eIdx][0] = effStressX[eIdx][0] - cellPressure[eIdx]; - totalStressX[eIdx][1] = effStressX[eIdx][1]; - totalStressX[eIdx][2] = effStressX[eIdx][2]; - if (dim >= 2) { - totalStressY[eIdx][0] = effStressY[eIdx][0]; - totalStressY[eIdx][1] = effStressY[eIdx][1] - cellPressure[eIdx]; - totalStressY[eIdx][2] = effStressY[eIdx][2]; - } - if (dim >= 3) { - totalStressZ[eIdx][0] = effStressZ[eIdx][0]; - totalStressZ[eIdx][1] = effStressZ[eIdx][1]; - totalStressZ[eIdx][2] = effStressZ[eIdx][2] - cellPressure[eIdx]; - } - } - } - - // calculate principal stresses i.e. the eigenvalues of the total stress tensor - Scalar a1, a2, a3; - DimMatrix totalStress; - DimVector eigenValues; - a1=Scalar(0); - a2=Scalar(0); - a3=Scalar(0); - - for (unsigned int eIdx = 0; eIdx < numElements; eIdx++) - { - eigenValues = Scalar(0); - totalStress = Scalar(0); - - totalStress[0] = totalStressX[eIdx]; - if (dim >= 2) - totalStress[1] = totalStressY[eIdx]; - if (dim >= 3) - totalStress[2] = totalStressZ[eIdx]; - - calculateEigenValues(eigenValues, totalStress); - - - for (int i = 0; i < dim; i++) - { - if (std::isnan(eigenValues[i])) - eigenValues[i] = 0.0; - } - - // sort principal stresses: principalStress1 >= principalStress2 >= principalStress3 - if (dim == 2) { - a1 = eigenValues[0]; - a2 = eigenValues[1]; - - if (a1 >= a2) { - principalStress1[eIdx] = a1; - principalStress2[eIdx] = a2; - } else { - principalStress1[eIdx] = a2; - principalStress2[eIdx] = a1; - } - } - - if (dim == 3) { - a1 = eigenValues[0]; - a2 = eigenValues[1]; - a3 = eigenValues[2]; - - if (a1 >= a2) { - if (a1 >= a3) { - principalStress1[eIdx] = a1; - if (a2 >= a3) { - principalStress2[eIdx] = a2; - principalStress3[eIdx] = a3; - } - else //a3 > a2 - { - principalStress2[eIdx] = a3; - principalStress3[eIdx] = a2; - } - } - else // a3 > a1 - { - principalStress1[eIdx] = a3; - principalStress2[eIdx] = a1; - principalStress3[eIdx] = a2; - } - } else // a2>a1 - { - if (a2 >= a3) { - principalStress1[eIdx] = a2; - if (a1 >= a3) { - principalStress2[eIdx] = a1; - principalStress3[eIdx] = a3; - } - else //a3>a1 - { - principalStress2[eIdx] = a3; - principalStress3[eIdx] = a1; - } - } - else //a3>a2 - { - principalStress1[eIdx] = a3; - principalStress2[eIdx] = a2; - principalStress3[eIdx] = a1; - } - } - } - - } - - writer.attachVertexData(pressure, "P"); - - char nameMoleFraction0[42], nameMoleFraction1[42]; - snprintf(nameMoleFraction0, 42, "x_%s", FluidSystem::componentName(0)); - snprintf(nameMoleFraction1, 42, "x_%s", FluidSystem::componentName(1)); - writer.attachVertexData(moleFraction0, nameMoleFraction0); - writer.attachVertexData(moleFraction1, nameMoleFraction1); - - char nameMassFraction0[42], nameMassFraction1[42]; - snprintf(nameMassFraction0, 42, "X_%s", FluidSystem::componentName(0)); - snprintf(nameMassFraction1, 42, "X_%s", FluidSystem::componentName(1)); - writer.attachVertexData(massFraction0, nameMassFraction0); - writer.attachVertexData(massFraction1, nameMassFraction1); - - writer.attachVertexData(displacement, "u", dim); - writer.attachVertexData(density, "rho"); - writer.attachVertexData(viscosity, "mu"); - writer.attachVertexData(porosity, "porosity"); - writer.attachVertexData(Kx, "Kx"); - writer.attachCellData(cellPorosity, "porosity"); - writer.attachCellData(cellKx, "Kx"); - writer.attachCellData(effPorosity, "effective porosity"); - - writer.attachCellData(totalStressX, "total stresses X", dim); - if (dim >= 2) - writer.attachCellData(totalStressY, "total stresses Y", dim); - if (dim >= 3) - writer.attachCellData(totalStressZ, "total stresses Z", dim); - - writer.attachCellData(effStressX, "effective stress changes X", dim); - if (dim >= 2) - writer.attachCellData(effStressY, "effective stress changes Y", dim); - if (dim >= 3) - writer.attachCellData(effStressZ, "effective stress changes Z", dim); - - writer.attachCellData(principalStress1, "principal stress 1"); - if (dim >= 2) - writer.attachCellData(principalStress2, "principal stress 2"); - if (dim >= 3) - writer.attachCellData(principalStress3, "principal stress 3"); - - writer.attachCellData(cellPressure, "P"); - - writer.attachCellData(rank, "rank"); - - } -private: - bool rockMechanicsSignConvention_; - -}; -} -#include "propertydefaults.hh" -#endif diff --git a/dumux/geomechanics/el1p2c/properties.hh b/dumux/geomechanics/el1p2c/properties.hh deleted file mode 100644 index 66970504124e9932b7cca2a646b6cde3e98de288..0000000000000000000000000000000000000000 --- a/dumux/geomechanics/el1p2c/properties.hh +++ /dev/null @@ -1,62 +0,0 @@ -// -*- mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- -// vi: set et ts=4 sw=4 sts=4: -/***************************************************************************** - * See the file COPYING for full copying permissions. * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 2 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program. If not, see . * - *****************************************************************************/ -/*! - * \ingroup Properties - * \ingroup ImplicitProperties - * \ingroup ElOnePTwoCBoxModel - * \file - * - * \brief Defines the properties required for the one-phase two-component - * linear elasticity model. - * - * This class inherits from the properties of the one-phase two-component model and - * from the properties of the linear elasticity model - */ - -#ifndef DUMUX_ELASTIC1P2C_PROPERTIES_HH -#define DUMUX_ELASTIC1P2C_PROPERTIES_HH - -#include -#include - - -namespace Dumux -{ -// \{ -namespace Properties -{ -////////////////////////////////////////////////////////////////// -// Type tags -////////////////////////////////////////////////////////////////// - -//! The type tag for the single-phase, two-component linear elasticity problems -NEW_TYPE_TAG(BoxElasticOnePTwoC, INHERITS_FROM(BoxModel)); - -////////////////////////////////////////////////////////////////// -// Property tags -////////////////////////////////////////////////////////////////// -//! Returns whether the stabilization terms are included in the balance equations -NEW_PROP_TAG(ImplicitWithStabilization); -//! Returns whether the output should be written according to rock mechanics sign convention (compressive stresses > 0) -NEW_PROP_TAG(VtkRockMechanicsSignConvention); -} -// \} -} - -#endif diff --git a/dumux/geomechanics/el1p2c/propertydefaults.hh b/dumux/geomechanics/el1p2c/propertydefaults.hh deleted file mode 100644 index 373a2fe316b3bfa33d6c36ffccb6d2d80f5f5de8..0000000000000000000000000000000000000000 --- a/dumux/geomechanics/el1p2c/propertydefaults.hh +++ /dev/null @@ -1,128 +0,0 @@ -// -*- mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- -// vi: set et ts=4 sw=4 sts=4: -/***************************************************************************** - * See the file COPYING for full copying permissions. * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 2 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program. If not, see . * - *****************************************************************************/ -/*! - * \ingroup Properties - * \ingroup ImplicitProperties - * \ingroup ElOnePTwoCBoxModel - * \file - * - * \brief Defines the properties required for the one-phase two-component - * linear-elastic model. - * - * This class inherits from the properties of the one-phase two-component model and - * from the properties of the simple linear-elastic model - */ - -#ifndef DUMUX_ELASTIC1P2C_PROPERTY_DEFAULTS_HH -#define DUMUX_ELASTIC1P2C_PROPERTY_DEFAULTS_HH - -#include "properties.hh" - -#include "model.hh" -#include "localresidual.hh" -#include "localjacobian.hh" -#include "fluxvariables.hh" -#include "elementvolumevariables.hh" -#include "volumevariables.hh" -#include "indices.hh" -#include -#include - - -namespace Dumux -{ -// \{ -namespace Properties -{ -////////////////////////////////////////////////////////////////// -// Property defaults -////////////////////////////////////////////////////////////////// -//!< set the number of equations to the space dimension of the problem -SET_PROP(BoxElasticOnePTwoC, NumEq) -{ -private: - typedef typename GET_PROP_TYPE(TypeTag, GridView) GridView; - enum{dim = GridView::dimension}; -public: - static const int value = dim + 2; -}; - -SET_INT_PROP(BoxElasticOnePTwoC, NumPhases, 1); //!< The number of phases in the 1p2c model is 1 -SET_INT_PROP(BoxElasticOnePTwoC, NumComponents, 2); //!< The number of components in the 1p2c model is 2 - -//! Use the linear elasticity local residual function for the elasticity model -SET_TYPE_PROP(BoxElasticOnePTwoC, - LocalResidual, - ElOnePTwoCLocalResidual); - -//! Use the linear elasticity local residual function for the elasticity model -SET_TYPE_PROP(BoxElasticOnePTwoC, - LocalJacobian, - ElOnePTwoCLocalJacobian); - -//! define the model -SET_TYPE_PROP(BoxElasticOnePTwoC, Model, ElOnePTwoCModel); - -//! define the ElementVolumeVariables -SET_TYPE_PROP(BoxElasticOnePTwoC, ElementVolumeVariables, ElOnePTwoCElementVolumeVariables); - -//! define the VolumeVariables -SET_TYPE_PROP(BoxElasticOnePTwoC, VolumeVariables, ElOnePTwoCVolumeVariables); - -//! define the FluxVariables -SET_TYPE_PROP(BoxElasticOnePTwoC, FluxVariables, ElOnePTwoCFluxVariables); - -//! Set the indices used by the linear elasticity model -SET_TYPE_PROP(BoxElasticOnePTwoC, Indices, ElOnePTwoCIndices); - -//! Set the phaseIndex per default to zero (important for two-phase fluidsystems). -SET_INT_PROP(BoxElasticOnePTwoC, PhaseIdx, 0); - -SET_PROP(BoxElasticOnePTwoC, FluidState){ - private: - typedef typename GET_PROP_TYPE(TypeTag, Scalar) Scalar; - typedef typename GET_PROP_TYPE(TypeTag, FluidSystem) FluidSystem; - public: - typedef CompositionalFluidState type; -}; - -//! set default upwind weights to 1.0, i.e. fully upwind -SET_SCALAR_PROP(BoxElasticOnePTwoC, ImplicitMassUpwindWeight, 1.0); -SET_SCALAR_PROP(BoxElasticOnePTwoC, ImplicitMobilityUpwindWeight, 1.0); - -// enable gravity by default -SET_BOOL_PROP(BoxElasticOnePTwoC, ProblemEnableGravity, true); - -// enable gravity by default -SET_BOOL_PROP(BoxElasticOnePTwoC, ImplicitWithStabilization, true); - -//! The model after Millington (1961) is used for the effective diffusivity -SET_PROP(BoxElasticOnePTwoC, EffectiveDiffusivityModel) -{ private : - typedef typename GET_PROP_TYPE(TypeTag, Scalar) Scalar; - public: - typedef DiffusivityMillingtonQuirk type; -}; - -// write the stress and displacement output according to rock mechanics sign convention (compressive stresses > 0) -SET_BOOL_PROP(BoxElasticOnePTwoC, VtkRockMechanicsSignConvention, false); -} -} - -#endif diff --git a/dumux/geomechanics/el1p2c/volumevariables.hh b/dumux/geomechanics/el1p2c/volumevariables.hh deleted file mode 100644 index f3773ece1077e80e287c82abb0b639c712e7a36c..0000000000000000000000000000000000000000 --- a/dumux/geomechanics/el1p2c/volumevariables.hh +++ /dev/null @@ -1,205 +0,0 @@ -// -*- mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- -// vi: set et ts=4 sw=4 sts=4: -/***************************************************************************** - * See the file COPYING for full copying permissions. * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 2 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program. If not, see . * - *****************************************************************************/ -/*! - * \file - * - * \brief Quantities required by the single-phase, two-component - * linear elasticity model which are defined on a vertex. - */ -#ifndef DUMUX_ELASTIC1P2C_VOLUME_VARIABLES_HH -#define DUMUX_ELASTIC1P2C_VOLUME_VARIABLES_HH - - -#include -#include - -#include "properties.hh" - -namespace Dumux { -/*! - * \ingroup ElOnePTwoCBoxModel - * \ingroup ImplicitVolumeVariables - * \brief Contains the quantities which are constant within a - * finite volume in the single-phase, two-component, linear elasticity model. - * - * This class inherits from the volumevariables of the one-phase - * two-component model - */ -template -class ElOnePTwoCVolumeVariables : public OnePTwoCVolumeVariables{ - - typedef OnePTwoCVolumeVariables ParentType; - - typedef typename GET_PROP_TYPE(TypeTag, Problem) Problem; - typedef typename GET_PROP_TYPE(TypeTag, VolumeVariables) Implementation; - typedef typename GET_PROP_TYPE(TypeTag, FVElementGeometry) FVElementGeometry; - typedef typename GET_PROP_TYPE(TypeTag, PrimaryVariables) PrimaryVariables; - typedef typename GET_PROP_TYPE(TypeTag, Indices) Indices; - - typedef typename GET_PROP_TYPE(TypeTag, GridView) GridView; - typedef typename GridView::template Codim<0>::Entity Element; - - enum { dim = GridView::dimension }; - - enum { phaseIdx = GET_PROP_VALUE(TypeTag, PhaseIdx) }; - - typedef typename GET_PROP_TYPE(TypeTag, Scalar) Scalar; - typedef Dune::FieldVector DimVector; - -public: - /*! - * \copydoc ImplicitVolumeVariables::update - */ - void update(const PrimaryVariables &priVars, - const Problem &problem, - const Element &element, - const FVElementGeometry &fvGeometry, - int scvIdx, - bool isOldSol) - { - - ParentType::update(priVars, problem, element, fvGeometry, scvIdx, isOldSol); - int vIdxGlobal = problem.vertexMapper().subIndex(element, scvIdx, dim); - - primaryVars_ = priVars; - prevPrimaryVars_ = problem.model().prevSol()[vIdxGlobal]; - - ParentType prev1p2cVolVars; - prev1p2cVolVars.update(problem.model().prevSol()[vIdxGlobal], - problem, - element, - fvGeometry, - scvIdx, - true); - - dPressure_ = this->pressure() - prev1p2cVolVars.pressure(); - - for (int i = 0; i < dim; ++i){ - displacement_[i] = primaryVars_[Indices::u(i)]; - prevDisplacement_[i] = prevPrimaryVars_[Indices::u(i)]; - } - - dU_ = displacement_ - prevDisplacement_; - - const Dune::FieldVector &lameParams = - problem.spatialParams().lameParams(element, fvGeometry, scvIdx); - - lambda_ = lameParams[0]; - mu_ = lameParams[1]; - - rockDensity_ = problem.spatialParams().rockDensity(element, scvIdx); - } - - /*! - * \brief Return the vector of primary variables - */ - const PrimaryVariables &primaryVars() const - { return primaryVars_; } - - /*! - * \brief Sets the evaluation point used in the by the local jacobian. - */ - void setEvalPoint(const Implementation *ep) - { } - - /*! - * \brief Return the Lame parameter lambda \f$\mathrm{[Pa]}\f$ within the control volume. - */ - Scalar lambda() const - { return lambda_; } - - /*! - * \brief Return the Lame parameter mu \f$\mathrm{[Pa]}\f$ within the control volume. - */ - Scalar mu() const - { return mu_; } - - /*! - * \brief Returns the rock density \f$\mathrm{[kg / m^3]}\f$ within the control volume . - */ - Scalar rockDensity() const - { return rockDensity_; } - - /*! - * \brief Returns the change in solid displacement \f$\mathrm{[m]}\f$ between - * the last and the current timestep for the space direction dimIdx within the control volume. - */ - Scalar dU(int dimIdx) const - { return dU_[dimIdx]; } - - /*! - * \brief Returns the change in pressure \f$\mathrm{[Pa]}\f$ between the last and the - * current timestep within the control volume. - */ - Scalar dPressure() const - { return dPressure_; } - - /*! - * \brief Returns the solid displacement \f$\mathrm{[m]}\f$ in space - * directions dimIdx within the control volume. - */ - Scalar displacement(int dimIdx) const - { return displacement_[dimIdx]; } - - /*! - * \brief Returns the solid displacement vector \f$\mathrm{[m]}\f$ - * within the control volume. - */ - const DimVector &displacement() const - { return displacement_; } - - - /*! - * \brief the effective porosity and volumetric strain divU is defined as mutable variable here since it - * is updated within the elementVolumeVariables. - */ - mutable Scalar effPorosity; - mutable Scalar divU; - - /*! - * \brief Returns the mass fraction of a given component in the - * given fluid phase within the control volume. - * - * \param compIdx The component index - */ - Scalar massFraction(const int compIdx) const - { return this->fluidState_.massFraction(phaseIdx, compIdx); } - - /*! - * \brief Returns the mole fraction of a given component in the - * given fluid phase within the control volume. - * - * \param compIdx The component index - */ - Scalar moleFraction(const int compIdx) const - { return this->fluidState_.moleFraction(phaseIdx, compIdx); } - -protected: - PrimaryVariables primaryVars_, prevPrimaryVars_; - DimVector displacement_, prevDisplacement_; - DimVector dU_; - Scalar dPressure_; - Scalar lambda_; - Scalar mu_; - Scalar rockDensity_; -}; - -} - -#endif diff --git a/dumux/geomechanics/el2p/CMakeLists.txt b/dumux/geomechanics/el2p/CMakeLists.txt deleted file mode 100644 index ab8c45b2f6cef4a4c01bb847084eb43e93e82bd9..0000000000000000000000000000000000000000 --- a/dumux/geomechanics/el2p/CMakeLists.txt +++ /dev/null @@ -1,18 +0,0 @@ - -#install headers -install(FILES -amgbackend.hh -assembler.hh -basemodel.hh -elementvolumevariables.hh -fluxvariables.hh -indices.hh -localjacobian.hh -localoperator.hh -localresidual.hh -model.hh -newtoncontroller.hh -properties.hh -propertydefaults.hh -volumevariables.hh -DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/dumux/geomechanics/el2p) diff --git a/dumux/geomechanics/el2p/amgbackend.hh b/dumux/geomechanics/el2p/amgbackend.hh deleted file mode 100644 index bef3c01da03396c5aef81cf7d576ac389b96666b..0000000000000000000000000000000000000000 --- a/dumux/geomechanics/el2p/amgbackend.hh +++ /dev/null @@ -1,235 +0,0 @@ -// -*- mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- -// vi: set et ts=4 sw=4 sts=4: -/***************************************************************************** - * See the file COPYING for full copying permissions. * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 2 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program. If not, see . * - *****************************************************************************/ -/*! - * \file - * \ingroup Linear - * - * \brief Wraps the AMG backend such that it can be used for the el2p model. - */ -#ifndef DUMUX_EL2P_AMGBACKEND_HH -#define DUMUX_EL2P_AMGBACKEND_HH - -#include - -namespace Dumux { - -/*! - * \brief Base class for the ElTwoP AMGBackend. - */ -template -class El2PAMGBackendBase : public AMGBackend -{ - typedef AMGBackend ParentType; - typedef typename GET_PROP_TYPE(TypeTag, Problem) Problem; - -public: - /*! - * \copydoc AMGBackend::AMGBackend() - */ - El2PAMGBackendBase(const Problem& problem) - : ParentType(problem) - {} -}; - -/*! - * \brief Specialization for the parallel setting. - */ -template -class El2PAMGBackendBase : public AMGBackend -{ - typedef AMGBackend ParentType; - typedef typename GET_PROP_TYPE(TypeTag, Problem) Problem; - typedef typename GET_PROP_TYPE(TypeTag, Scalar) Scalar; - enum { numEq = GET_PROP_VALUE(TypeTag, NumEq) }; - typedef typename Dune::FieldMatrix MatrixBlock; - typedef typename Dune::BCRSMatrix BlockMatrix; - typedef typename Dune::FieldVector VectorBlock; - typedef typename Dune::BlockVector BlockVector; - typedef typename GET_PROP_TYPE(TypeTag, GridView) GridView; - enum { dim = GridView::dimension }; - -public: - /*! - * \copydoc AMGBackend::AMGBackend() - */ - El2PAMGBackendBase(const Problem& problem) - : ParentType(problem) - { - createBlockMatrixAndVectors_(); - } - - /*! - * \copydoc AMGBackend::solve() - */ - template - bool solve(Matrix& A, Vector& x, Vector& b) - { - flatToBlocked_(A, x, b); - int converged = ParentType::solve(*aBlocked_, *xBlocked_, *bBlocked_); - blockedToFlat_(x, b); - return converged; - } - -private: - void createBlockMatrixAndVectors_() - { - int numVertices = this->problem().gridView().size(dim); - - aBlocked_ = std::make_shared(numVertices, numVertices, BlockMatrix::random); - xBlocked_ = std::make_shared(numVertices); - bBlocked_ = std::make_shared(numVertices); - - // find out the global indices of the neighboring vertices of - // each vertex - typedef std::set NeighborSet; - std::vector neighbors(numVertices); - for (const auto& element : elements(this->problem().gridView())) { - - // loop over all element vertices - int n = element.subEntities(dim); - for (int i = 0; i < n - 1; ++i) { - int globalI = this->problem().vertexMapper().subIndex(element, i, dim); - for (int j = i + 1; j < n; ++j) { - int globalJ = this->problem().vertexMapper().subIndex(element, j, dim); - // make sure that vertex j is in the neighbor set - // of vertex i and vice-versa - neighbors[globalI].insert(globalJ); - neighbors[globalJ].insert(globalI); - } - } - } - - // make vertices neighbors to themselfs - for (int i = 0; i < numVertices; ++i) - neighbors[i].insert(i); - - // allocate space for the rows of the matrix - for (int i = 0; i < numVertices; ++i) { - aBlocked_->setrowsize(i, neighbors[i].size()); - } - aBlocked_->endrowsizes(); - - // fill the rows with indices. each vertex talks to all of its - // neighbors. (it also talks to itself since vertices are - // sometimes quite egocentric.) - for (int i = 0; i < numVertices; ++i) { - auto nIt = neighbors[i].begin(); - const auto& nEndIt = neighbors[i].end(); - for (; nIt != nEndIt; ++nIt) { - aBlocked_->addindex(i, *nIt); - } - } - aBlocked_->endindices(); - } - - template - void flatToBlocked_(const FlatMatrix& aFlat, - const FlatVector& xFlat, - const FlatVector& bFlat) - { - unsigned numBlocks = xBlocked_->size(); - static const unsigned numMassEq = numEq - dim; - for (unsigned rowBlockIdx = 0; rowBlockIdx < numBlocks; ++rowBlockIdx) - { - for (unsigned rowEqIdx = 0; rowEqIdx < numEq; ++rowEqIdx) - { - unsigned rowFlatIdx; - if (rowEqIdx < numMassEq) - rowFlatIdx = rowBlockIdx*numMassEq + rowEqIdx; - else - rowFlatIdx = numBlocks*numMassEq + rowBlockIdx*dim + rowEqIdx - numMassEq; - - (*xBlocked_)[rowBlockIdx][rowEqIdx] = xFlat[rowFlatIdx]; - (*bBlocked_)[rowBlockIdx][rowEqIdx] = bFlat[rowFlatIdx]; - - for (auto colBlockIt = (*aBlocked_)[rowBlockIdx].begin(); - colBlockIt != (*aBlocked_)[rowBlockIdx].end(); ++colBlockIt) - { - unsigned colBlockIdx = colBlockIt.index(); - auto& aBlock = (*aBlocked_)[rowBlockIdx][colBlockIdx]; - - for (unsigned colEqIdx = 0; colEqIdx < numEq; ++colEqIdx) - { - unsigned colFlatIdx; - if (colEqIdx < numMassEq) - colFlatIdx = colBlockIdx*numMassEq + colEqIdx; - else - colFlatIdx = numBlocks*numMassEq + colBlockIdx*dim + colEqIdx - numMassEq; - - aBlock[rowEqIdx][colEqIdx] = aFlat[rowFlatIdx][colFlatIdx]; - } - } - } - } - } - - template - void blockedToFlat_(FlatVector& xFlat, - FlatVector& bFlat) - { - unsigned numBlocks = xBlocked_->size(); - static const unsigned numMassEq = numEq - dim; - for (unsigned rowBlockIdx = 0; rowBlockIdx < numBlocks; ++rowBlockIdx) - { - for (unsigned rowEqIdx = 0; rowEqIdx < numEq; ++rowEqIdx) - { - unsigned rowFlatIdx; - if (rowEqIdx < numMassEq) - rowFlatIdx = rowBlockIdx*numMassEq + rowEqIdx; - else - rowFlatIdx = numBlocks*numMassEq + rowBlockIdx*dim + rowEqIdx - numMassEq; - - xFlat[rowFlatIdx] = (*xBlocked_)[rowBlockIdx][rowEqIdx]; - bFlat[rowFlatIdx] = (*bBlocked_)[rowBlockIdx][rowEqIdx]; - } - } - } - - std::shared_ptr aBlocked_; - std::shared_ptr xBlocked_; - std::shared_ptr bBlocked_; -}; - -/*! - * \brief Wraps the AMG backend such that it can be used for the el2p model. - */ -template -class El2PAMGBackend : public El2PAMGBackendBase< - TypeTag, - Dune::Capabilities::canCommunicate::v> -{ - typedef typename GET_PROP_TYPE(TypeTag, Grid) Grid; - enum { dofCodim = Grid::dimension }; - enum { isParallel = Dune::Capabilities::canCommunicate::v }; - typedef El2PAMGBackendBase ParentType; - typedef typename GET_PROP_TYPE(TypeTag, Problem) Problem; - -public: - /*! - * \copydoc AMGBackend::AMGBackend() - */ - El2PAMGBackend(const Problem& problem) - : ParentType(problem) - {} -}; - -} // namespace Dumux - -#endif // DUMUX_EL2P_AMGBACKEND_HH diff --git a/dumux/geomechanics/el2p/assembler.hh b/dumux/geomechanics/el2p/assembler.hh deleted file mode 100644 index f995b84864d778cc6c742468dc2e5d07ec6d2b8c..0000000000000000000000000000000000000000 --- a/dumux/geomechanics/el2p/assembler.hh +++ /dev/null @@ -1,605 +0,0 @@ -// -*- mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- -// vi: set et ts=4 sw=4 sts=4: -/***************************************************************************** - * See the file COPYING for full copying permissions. * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 2 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program. If not, see . * - *****************************************************************************/ -/*! - * \file - * - * \brief This file contains an assembler for the Jacobian matrix - * of the two-phase linear-elastic model based on PDELab. - */ -#ifndef DUMUX_EL2P_ASSEMBLER_HH -#define DUMUX_EL2P_ASSEMBLER_HH - -#include "properties.hh" -#include "localoperator.hh" - -namespace Dumux { - -namespace Properties -{ -NEW_PROP_TAG(PressureFEM); //!< Finite element space used for pressure, saturation, ... -NEW_PROP_TAG(DisplacementFEM); //!< Finite element space used for displacement -NEW_PROP_TAG(PressureGridFunctionSpace); //!< Grid function space used for pressure, saturation, ... -NEW_PROP_TAG(DisplacementGridFunctionSpace); //!< Grid function space used for displacement -} - -namespace PDELab { - -/*! - * \brief An assembler for the Jacobian matrix - * of the two-phase linear-elastic model based on PDELab. - */ -template -class El2PAssembler -{ - typedef typename GET_PROP_TYPE(TypeTag, Model) Model; - typedef typename GET_PROP_TYPE(TypeTag, Problem) Problem; - typedef typename GET_PROP_TYPE(TypeTag, GridView) GridView; - typedef typename GET_PROP_TYPE(TypeTag, Scalar) Scalar; - typedef typename GET_PROP_TYPE(TypeTag, VertexMapper) VertexMapper; - typedef typename GET_PROP_TYPE(TypeTag, ElementMapper) ElementMapper; - - typedef typename GET_PROP_TYPE(TypeTag, PressureFEM) PressureFEM; - typedef typename GET_PROP_TYPE(TypeTag, PressureGridFunctionSpace) PressureGFS; - typedef typename PressureGFS::template Child<0>::Type PressureScalarGFS; - - typedef typename GET_PROP_TYPE(TypeTag, DisplacementFEM) DisplacementFEM; - typedef typename GET_PROP_TYPE(TypeTag, DisplacementGridFunctionSpace) DisplacementGFS; - typedef typename DisplacementGFS::template Child<0>::Type DisplacementScalarGFS; - - typedef typename GET_PROP_TYPE(TypeTag, GridFunctionSpace) GridFunctionSpace; - typedef typename GET_PROP_TYPE(TypeTag, Constraints) Constraints; - typedef typename GET_PROP_TYPE(TypeTag, ConstraintsTrafo) ConstraintsTrafo; - typedef typename GET_PROP_TYPE(TypeTag, LocalOperator) LocalOperator; - typedef typename GET_PROP_TYPE(TypeTag, GridOperator) GridOperator; - - typedef typename GET_PROP_TYPE(TypeTag, SolutionVector) SolutionVector; - typedef typename GET_PROP_TYPE(TypeTag, JacobianMatrix) JacobianMatrix; - typedef typename GET_PROP_TYPE(TypeTag, PrimaryVariables) PrimaryVariables; - - enum{dim = GridView::dimension}; - typedef typename GridView::template Codim<0>::Entity Element; - - typedef typename GridView::template Codim::Entity Vertex; - - enum { - enablePartialReassemble = GET_PROP_VALUE(TypeTag, ImplicitEnablePartialReassemble), - enableJacobianRecycling = GET_PROP_VALUE(TypeTag, ImplicitEnableJacobianRecycling), - }; - - // copying the jacobian assembler is not a good idea - El2PAssembler(const El2PAssembler &); - -public: - /*! - * \brief The colors of elements and vertices required for partial - * Jacobian reassembly. - */ - enum EntityColor { - /*! - * Vertex/element that needs to be reassembled because some - * relative error is above the tolerance - */ - Red, - - /*! - * Vertex/element that needs to be reassembled because a - * neighboring element/vertex is red - */ - Yellow, - - /*! - * Yellow vertex has only non-green neighbor elements. - * - * This means that its relative error is below the tolerance, - * but its defect can be linearized without any additional - * cost. This is just an "internal" color which is not used - * ouside of the jacobian assembler. - */ - Orange, - - /*! - * Vertex/element that does not need to be reassembled - */ - Green - }; - - El2PAssembler() - { - // set reassemble tolerance to 0, so that if partial - // reassembly of the jacobian matrix is disabled, the - // reassemble tolerance is always smaller than the current - // relative tolerance - reassembleTolerance_ = 0.0; - } - - /*! - * \brief Initialize the jacobian assembler. - * - * At this point we can assume that all objects in the problem and - * the model have been allocated. We can not assume that they are - * fully initialized, though. - * - * \param problem The problem object - */ - void init(Problem& problem) - { - problemPtr_ = &problem; - - constraints_ = std::make_shared(); - - pressureFEM_ = std::make_shared(problemPtr_->gridView()); - pressureScalarGFS_ = std::make_shared(problemPtr_->gridView(), *pressureFEM_, *constraints_); - pressureGFS_ = std::make_shared(*pressureScalarGFS_); - - displacementFEM_ = std::make_shared(problemPtr_->gridView()); - displacementScalarGFS_ = std::make_shared(problemPtr_->gridView(), *displacementFEM_, *constraints_); - displacementGFS_ = std::make_shared(*displacementScalarGFS_); - - gridFunctionSpace_ = std::make_shared(*pressureGFS_, *displacementGFS_); - - constraintsTrafo_ = std::make_shared(); - - // initialize the grid operator spaces - localOperator_ = std::make_shared(problemPtr_->model()); - gridOperator_ = - std::make_shared(*gridFunctionSpace_, *constraintsTrafo_, - *gridFunctionSpace_, *constraintsTrafo_, *localOperator_); - - // allocate raw matrix - matrix_ = std::make_shared(*gridOperator_); - - // initialize the jacobian matrix and the right hand side - // vector - *matrix_ = 0; - reuseMatrix_ = false; - - residual_ = std::make_shared(*gridFunctionSpace_); - - int numVertices = gridView_().size(dim); - int numElements = gridView_().size(0); - - totalElems_ = gridView_().comm().sum(numElements); - - // initialize data needed for partial reassembly - if (enablePartialReassemble) { - vertexColor_.resize(numVertices); - vertexDelta_.resize(numVertices); - elementColor_.resize(numElements); - } - reassembleAll(); - } - - /*! - * \brief Assemble the local jacobian of the problem. - * - * The current state of affairs (esp. the previous and the current - * solutions) is represented by the model object. - */ - void assemble() - { - *matrix_ = 0; - gridOperator_->jacobian(problemPtr_->model().curSol(), *matrix_); - - *residual_ = 0; - gridOperator_->residual(problemPtr_->model().curSol(), *residual_); - - return; - } - - /*! - * \brief If Jacobian matrix recycling is enabled, this method - * specifies whether the next call to assemble() just - * rescales the storage term or does a full reassembly - * - * \param yesno If true, only rescale; else do full Jacobian assembly. - */ - void setMatrixReuseable(bool yesno = true) - { - if (enableJacobianRecycling) - reuseMatrix_ = yesno; - } - - /*! - * \brief If partial Jacobian matrix reassembly is enabled, this - * method causes all elements to be reassembled in the next - * assemble() call. - */ - void reassembleAll() - { - nextReassembleTolerance_ = 0.0; - - if (enablePartialReassemble) { - std::fill(vertexColor_.begin(), - vertexColor_.end(), - Red); - std::fill(elementColor_.begin(), - elementColor_.end(), - Red); - std::fill(vertexDelta_.begin(), - vertexDelta_.end(), - 0.0); - } - } - - /*! - * \brief Returns the relative error below which a vertex is - * considered to be "green" if partial Jacobian reassembly - * is enabled. - * - * This returns the _actual_ relative computed seen by - * computeColors(), not the tolerance which it was given. - */ - Scalar reassembleTolerance() const - { return reassembleTolerance_; } - - /*! - * \brief Update the distance where the non-linear system was - * originally insistently linearized and the point where it - * will be linerized the next time. - * - * This only has an effect if partial reassemble is enabled. - */ - void updateDiscrepancy(const SolutionVector &u, - const SolutionVector &uDelta) - { - if (!enablePartialReassemble) - return; - - // update the vector with the distances of the current - // evaluation point used for linearization from the original - // evaluation point - using std::abs; - for (int i = 0; i < vertexDelta_.size(); ++i) { - PrimaryVariables uCurrent(u[i]); - PrimaryVariables uNext(uCurrent); - uNext -= uDelta[i]; - - // we need to add the distance the solution was moved for - // this vertex - Scalar dist = model_().relativeErrorVertex(i, - uCurrent, - uNext); - vertexDelta_[i] += abs(dist); - } - - } - - /*! - * \brief Determine the colors of vertices and elements for partial - * reassembly given a relative tolerance. - * - * The following approach is used: - * - * - Set all vertices and elements to 'green' - * - Mark all vertices as 'red' which exhibit an relative error above - * the tolerance - * - Mark all elements which feature a 'red' vetex as 'red' - * - Mark all vertices which are not 'red' and are part of a - * 'red' element as 'yellow' - * - Mark all elements which are not 'red' and contain a - * 'yellow' vertex as 'yellow' - * - * \param relTol The relative error below which a vertex won't be - * reassembled. Note that this specifies the - * worst-case relative error between the last - * linearization point and the current solution and - * _not_ the delta vector of the Newton iteration! - */ - void computeColors(Scalar relTol) - { - if (!enablePartialReassemble) - return; - - // mark the red vertices and update the tolerance of the - // linearization which actually will get achieved - nextReassembleTolerance_ = 0; - for (int i = 0; i < vertexColor_.size(); ++i) { - vertexColor_[i] = Green; - if (vertexDelta_[i] > relTol) { - // mark vertex as red if discrepancy is larger than - // the relative tolerance - vertexColor_[i] = Red; - } - using std::max; - nextReassembleTolerance_ = - max(nextReassembleTolerance_, vertexDelta_[i]); - }; - - // Mark all red elements - for (const auto& element : elements(gridView_())) { - // find out whether the current element features a red - // vertex - bool isRed = false; - int numVertices = element.subEntities(dim); - for (int i=0; i < numVertices; ++i) { - int globalI = vertexMapper_().subIndex(element, i, dim); - if (vertexColor_[globalI] == Red) { - isRed = true; - break; - } - }; - - // if yes, the element color is also red, else it is not - // red, i.e. green for the mean time - int eIdxGlobal = elementMapper_().index(element); - if (isRed) - elementColor_[eIdxGlobal] = Red; - else - elementColor_[eIdxGlobal] = Green; - } - - // Mark yellow vertices (as orange for the mean time) - for (const auto& element : elements(gridView_())) { - int eIdx = this->elementMapper_().index(element); - if (elementColor_[eIdx] != Red) - continue; // non-red elements do not tint vertices - // yellow! - - int numVertices = element.subEntities(dim); - for (int i=0; i < numVertices; ++i) { - int globalI = vertexMapper_().subIndex(element, i, dim); - // if a vertex is already red, don't recolor it to - // yellow! - if (vertexColor_[globalI] != Red) - vertexColor_[globalI] = Orange; - }; - } - - // Mark yellow elements - for (const auto& element : elements(gridView_())) { - int eIdx = this->elementMapper_().index(element); - if (elementColor_[eIdx] == Red) { - continue; // element is red already! - } - - // check whether the element features a yellow - // (resp. orange at this point) vertex - bool isYellow = false; - int numVertices = element.subEntities(dim); - for (int i=0; i < numVertices; ++i) { - int globalI = vertexMapper_().subIndex(element, i, dim); - if (vertexColor_[globalI] == Orange) { - isYellow = true; - break; - } - }; - - if (isYellow) - elementColor_[eIdx] = Yellow; - } - - // Demote orange vertices to yellow ones if it has at least - // one green element as a neighbor. - for (const auto& element : elements(gridView_())) { - int eIdx = this->elementMapper_().index(element); - if (elementColor_[eIdx] != Green) - continue; // yellow and red elements do not make - // orange vertices yellow! - - int numVertices = element.subEntities(dim); - for (int i=0; i < numVertices; ++i) { - int globalI = vertexMapper_().subIndex(element, i, dim); - // if a vertex is orange, recolor it to yellow! - if (vertexColor_[globalI] == Orange) - vertexColor_[globalI] = Yellow; - }; - } - - // promote the remaining orange vertices to red - for (int i=0; i < vertexColor_.size(); ++i) { - // if a vertex is green or yellow don't do anything! - if (vertexColor_[i] == Green || vertexColor_[i] == Yellow) - continue; - - // make sure the vertex is red (this is a no-op vertices - // which are already red!) - vertexColor_[i] = Red; - - // set the error of this vertex to 0 because the system - // will be consistently linearized at this vertex - vertexDelta_[i] = 0.0; - }; - }; - - /*! - * \brief Returns the reassemble color of a vertex - * - * \param element An element which contains the vertex - * \param vIdx The local index of the vertex in the element. - */ - int vertexColor(const Element &element, int vIdx) const - { - if (!enablePartialReassemble) - return Red; // reassemble unconditionally! - - int vIdxGlobal = vertexMapper_().subIndex(element, vIdx, dim); - - return vertexColor_[vIdxGlobal]; - } - - /*! - * \brief Returns the reassemble color of a vertex - * - * \param vIdxGlobal The global index of the vertex. - */ - int vertexColor(int vIdxGlobal) const - { - if (!enablePartialReassemble) - return Red; // reassemble unconditionally! - return vertexColor_[vIdxGlobal]; - } - - /*! - * \brief Returns the Jacobian reassemble color of an element - * - * \param element The Codim-0 DUNE entity - */ - int elementColor(const Element &element) const - { - if (!enablePartialReassemble) - return Red; // reassemble unconditionally! - - int eIdxGlobal = elementMapper_().index(element); - return elementColor_[eIdxGlobal]; - } - - /*! - * \brief Returns the Jacobian reassemble color of an element - * - * \param globalElementIdx The global index of the element. - */ - int elementColor(int globalElementIdx) const - { - if (!enablePartialReassemble) - return Red; // reassemble unconditionally! - return elementColor_[globalElementIdx]; - } - - /*! - * \brief Returns a pointer to the PDELab's grid function space. - */ - const GridFunctionSpace& gridFunctionSpace() const - { - return *gridFunctionSpace_; - } - - /*! - * \brief Returns a pointer to the PDELab's constraints - * transformation. - */ - const ConstraintsTrafo& constraintsTrafo() const - { - return *constraintsTrafo_; - } - - /*! - * \brief Return constant reference to global Jacobian matrix. - */ - const JacobianMatrix& matrix() const - { return *matrix_; } - - /*! - * \brief Return reference to global Jacobian matrix. - */ - JacobianMatrix& matrix() - { return *matrix_; } - - /*! - * \brief Return constant reference to global residual vector. - */ - const SolutionVector& residual() const - { return *residual_; } - - - /*! - * \brief Return reference to global residual vector. - */ - SolutionVector& residual() - { return *residual_; } - - const GridOperator &gridOperator() const - { return *gridOperator_;} - -private: - // reset the global linear system of equations. if partial - // reassemble is enabled, this means that the jacobian matrix must - // only be erased partially! - void resetSystem_() - { - // always reset the right hand side. - *residual_ = 0.0; - - if (!enablePartialReassemble) { - // If partial reassembly of the jacobian is not enabled, - // we can just reset everything! - (*matrix_) = 0; - return; - } - - // reset all entries corrosponding to a red vertex - for (int rowIdx = 0; rowIdx < matrix_->N(); ++rowIdx) { - if (vertexColor_[rowIdx] == Green) - continue; // the equations for this control volume are - // already below the treshold - - // set all entries in the row to 0 - typedef typename JacobianMatrix::ColIterator ColIterator; - ColIterator colIt = (*matrix_)[rowIdx].begin(); - const ColIterator &colEndIt = (*matrix_)[rowIdx].end(); - for (; colIt != colEndIt; ++colIt) { - (*colIt) = 0.0; - } - }; - } - - Problem &problem_() - { return *problemPtr_; } - const Problem &problem_() const - { return *problemPtr_; } - const Model &model_() const - { return problem_().model(); } - Model &model_() - { return problem_().model(); } - const GridView &gridView_() const - { return problem_().gridView(); } - const VertexMapper &vertexMapper_() const - { return problem_().vertexMapper(); } - const ElementMapper &elementMapper_() const - { return problem_().elementMapper(); } - - Problem *problemPtr_; - - // the jacobian matrix - std::shared_ptr matrix_; - // the right-hand side - std::shared_ptr residual_; - - // attributes required for jacobian matrix recycling - bool reuseMatrix_; - - // attributes required for partial jacobian reassembly - std::vector vertexColor_; - std::vector elementColor_; - std::vector vertexDelta_; - - int totalElems_; - int greenElems_; - - Scalar nextReassembleTolerance_; - Scalar reassembleTolerance_; - - - std::shared_ptr constraints_; - std::shared_ptr pressureFEM_; - std::shared_ptr displacementFEM_; - std::shared_ptr pressureScalarGFS_; - std::shared_ptr displacementScalarGFS_; - std::shared_ptr pressureGFS_; - std::shared_ptr displacementGFS_; - std::shared_ptr gridFunctionSpace_; - std::shared_ptr constraintsTrafo_; - std::shared_ptr localOperator_; - std::shared_ptr gridOperator_; -}; - -} // namespace PDELab - -} // namespace Dumux - -#endif diff --git a/dumux/geomechanics/el2p/basemodel.hh b/dumux/geomechanics/el2p/basemodel.hh deleted file mode 100644 index 35f1a67ff36eb1bdf4d829d4463eea4b5926a9be..0000000000000000000000000000000000000000 --- a/dumux/geomechanics/el2p/basemodel.hh +++ /dev/null @@ -1,984 +0,0 @@ -// -*- mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- -// vi: set et ts=4 sw=4 sts=4: -/***************************************************************************** - * See the file COPYING for full copying permissions. * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 2 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program. If not, see . * - *****************************************************************************/ -/*! - * \file - * \brief Base class for fully-implicit models - */ -#ifndef DUMUX_ELASTIC2P_BASE_MODEL_HH -#define DUMUX_ELASTIC2P_BASE_MODEL_HH - -#include -#include - -#include -#include -#include - -namespace Dumux -{ - -/*! - * \ingroup ElTwoPBoxModel - * \brief base class for the two-phase geomechanics model - */ -template -class ElTwoPBaseModel -{ - typedef typename GET_PROP_TYPE(TypeTag, Model) Implementation; - typedef typename GET_PROP_TYPE(TypeTag, Problem) Problem; - typedef typename GET_PROP_TYPE(TypeTag, GridView) GridView; - typedef typename GET_PROP_TYPE(TypeTag, Scalar) Scalar; - typedef typename GET_PROP_TYPE(TypeTag, ElementMapper) ElementMapper; - typedef typename GET_PROP_TYPE(TypeTag, VertexMapper) VertexMapper; - typedef typename GET_PROP_TYPE(TypeTag, SolutionVector) SolutionVector; - typedef typename GET_PROP_TYPE(TypeTag, PrimaryVariables) PrimaryVariables; - typedef typename GET_PROP_TYPE(TypeTag, JacobianAssembler) JacobianAssembler; - typedef typename GET_PROP_TYPE(TypeTag, ElementVolumeVariables) ElementVolumeVariables; - typedef typename GET_PROP_TYPE(TypeTag, VolumeVariables) VolumeVariables; - - enum { - numEq = GET_PROP_VALUE(TypeTag, NumEq), - dim = GridView::dimension - }; - - typedef typename GET_PROP_TYPE(TypeTag, FVElementGeometry) FVElementGeometry; - typedef typename GET_PROP_TYPE(TypeTag, LocalJacobian) LocalJacobian; - typedef typename GET_PROP_TYPE(TypeTag, LocalResidual) LocalResidual; - typedef typename GET_PROP_TYPE(TypeTag, NewtonMethod) NewtonMethod; - typedef typename GET_PROP_TYPE(TypeTag, NewtonController) NewtonController; - - typedef typename GridView::ctype CoordScalar; - typedef typename GridView::template Codim<0>::Entity Element; - - typedef typename Dune::ReferenceElements ReferenceElements; - typedef typename Dune::ReferenceElement ReferenceElement; - - enum { isBox = GET_PROP_VALUE(TypeTag, ImplicitIsBox) }; - enum { dofCodim = isBox ? dim : 0 }; - - // copying a model is not a good idea - ElTwoPBaseModel(const ElTwoPBaseModel &); - -public: - /*! - * \brief The constructor. - */ - ElTwoPBaseModel() - : problemPtr_(0) - { - enableHints_ = GET_PARAM_FROM_GROUP(TypeTag, bool, Implicit, EnableHints); - } - - /*! - * \brief Apply the initial conditions to the model. - * - * \param problem The object representing the problem which needs to - * be simulated. - */ - void init(Problem &problem) - { - problemPtr_ = &problem; - - updateBoundaryIndices_(); - - int numDofs = asImp_().numDofs(); - if (isBox) - boxVolume_.resize(numDofs); - - localJacobian_.init(problem_()); - jacAsm_ = std::make_shared(); - jacAsm_->init(problem_()); - - uCur_ = std::make_shared(jacAsm_->gridFunctionSpace()); - uPrev_ = std::make_shared(jacAsm_->gridFunctionSpace()); - - asImp_().applyInitialSolution_(); - - // resize the hint vectors - if (isBox && enableHints_) { - int numVertices = gridView_().size(dim); - curHints_.resize(numVertices); - prevHints_.resize(numVertices); - hintsUsable_.resize(numVertices); - std::fill(hintsUsable_.begin(), - hintsUsable_.end(), - false); - } - - // also set the solution of the "previous" time step to the - // initial solution. - *uPrev_ = *uCur_; - } - - void setHints(const Element &element, - ElementVolumeVariables &prevVolVars, - ElementVolumeVariables &curVolVars) const - { - if (!isBox || !enableHints_) - return; - - int n = element.subEntities(dim); - prevVolVars.resize(n); - curVolVars.resize(n); - for (int i = 0; i < n; ++i) { - int vIdxGlobal = vertexMapper().subIndex(element, i, dim); - - if (!hintsUsable_[vIdxGlobal]) { - curVolVars[i].setHint(NULL); - prevVolVars[i].setHint(NULL); - } - else { - curVolVars[i].setHint(&curHints_[vIdxGlobal]); - prevVolVars[i].setHint(&prevHints_[vIdxGlobal]); - } - } - } - - void setHints(const Element &element, - ElementVolumeVariables &curVolVars) const - { - if (!isBox || !enableHints_) - return; - - int n = element.subEntities(dim); - curVolVars.resize(n); - for (int i = 0; i < n; ++i) { - int vIdxGlobal = vertexMapper().subIndex(element, i, dim); - - if (!hintsUsable_[vIdxGlobal]) - curVolVars[i].setHint(NULL); - else - curVolVars[i].setHint(&curHints_[vIdxGlobal]); - } - } - - void updatePrevHints() - { - if (!isBox || !enableHints_) - return; - - prevHints_ = curHints_; - } - - void updateCurHints(const Element &element, - const ElementVolumeVariables &elemVolVars) const - { - if (!isBox || !enableHints_) - return; - - for (unsigned int i = 0; i < elemVolVars.size(); ++i) { - int vIdxGlobal = vertexMapper().subIndex(element, i, dim); - curHints_[vIdxGlobal] = elemVolVars[i]; - if (!hintsUsable_[vIdxGlobal]) - prevHints_[vIdxGlobal] = elemVolVars[i]; - hintsUsable_[vIdxGlobal] = true; - } - } - - - /*! - * \brief Compute the global residual for an arbitrary solution - * vector. - * - * \param residual Stores the result - * \param u The solution for which the residual ought to be calculated - */ - Scalar globalResidual(SolutionVector &residual, - const SolutionVector &u) - { - jacAsm_->gridOperator().residual(u, residual); - - // calculate the square norm of the residual - Scalar result2 = residual.base().two_norm2(); - if (gridView_().comm().size() > 1) - result2 = gridView_().comm().sum(result2); - - // add up the residuals on the process borders - if (isBox && gridView_().comm().size() > 1) { - VertexHandleSum - sumHandle(residual, vertexMapper()); - gridView_().communicate(sumHandle, - Dune::InteriorBorder_InteriorBorder_Interface, - Dune::ForwardCommunication); - } - - using std::sqrt; - return sqrt(result2); - } - - /*! - * \brief Compute the global residual for the current solution - * vector. - * - * \param residual Stores the result - */ - Scalar globalResidual(SolutionVector &residual) - { - return globalResidual(residual, curSol()); - } - - /*! - * \brief Compute the integral over the domain of the storage - * terms of all conservation quantities. - * - * \param storage Stores the result - */ - void globalStorage(PrimaryVariables &storage) - { - storage = 0; - - for (const auto& element : elements(gridView_(), Dune::Partitions::interior)) - { - localResidual().evalStorage(element); - - if (isBox) - { - for (int i = 0; i < element.subEntities(dim); ++i) - storage += localResidual().storageTerm()[i]; - } - else - { - storage += localResidual().storageTerm()[0]; - } - } - - if (gridView_().comm().size() > 1) - storage = gridView_().comm().sum(storage); - } - - /*! - * \brief Returns the volume \f$\mathrm{[m^3]}\f$ of a given control volume. - * - * \param vIdxGlobal The global index of the control volume's - * associated vertex - */ - Scalar boxVolume(const int vIdxGlobal) const - { - if (isBox) - { - return boxVolume_[vIdxGlobal][0]; - } - else - { - DUNE_THROW(Dune::InvalidStateException, - "requested box volume for cell-centered model"); - } - } - - /*! - * \brief Reference to the current solution as a block vector. - */ - const SolutionVector &curSol() const - { return *uCur_; } - - /*! - * \brief Reference to the current solution as a block vector. - */ - SolutionVector &curSol() - { return *uCur_; } - - /*! - * \brief Reference to the previous solution as a block vector. - */ - const SolutionVector &prevSol() const - { return *uPrev_; } - - /*! - * \brief Reference to the previous solution as a block vector. - */ - SolutionVector &prevSol() - { return *uPrev_; } - - /*! - * \brief Returns the operator assembler for the global jacobian of - * the problem. - */ - JacobianAssembler &jacobianAssembler() - { return *jacAsm_; } - - /*! - * \copydoc jacobianAssembler() - */ - const JacobianAssembler &jacobianAssembler() const - { return *jacAsm_; } - - /*! - * \brief Returns the local jacobian which calculates the local - * stiffness matrix for an arbitrary element. - * - * The local stiffness matrices of the element are used by - * the jacobian assembler to produce a global linerization of the - * problem. - */ - LocalJacobian &localJacobian() - { return localJacobian_; } - /*! - * \copydoc localJacobian() - */ - const LocalJacobian &localJacobian() const - { return localJacobian_; } - - /*! - * \brief Returns the local residual function. - */ - LocalResidual &localResidual() - { return localJacobian().localResidual(); } - /*! - * \copydoc localResidual() - */ - const LocalResidual &localResidual() const - { return localJacobian().localResidual(); } - - /*! - * \brief Returns the maximum relative shift between two vectors of - * primary variables. - * - * \param priVars1 The first vector of primary variables - * \param priVars2 The second vector of primary variables - */ - Scalar relativeShiftAtDof(const PrimaryVariables &priVars1, - const PrimaryVariables &priVars2) - { - Scalar result = 0.0; - using std::abs; - using std::max; - for (int j = 0; j < numEq; ++j) { - Scalar eqErr = abs(priVars1[j] - priVars2[j]); - eqErr /= max(1.0, abs(priVars1[j] + priVars2[j])/2); - - result = max(result, eqErr); - } - return result; - } - - /*! - * \brief Try to progress the model to the next timestep. - * - * \param solver The non-linear solver - * \param controller The controller which specifies the behaviour - * of the non-linear solver - */ - bool update(NewtonMethod &solver, - NewtonController &controller) - { -#if HAVE_VALGRIND - for (size_t i = 0; i < curSol().base().size(); ++i) - Valgrind::CheckDefined(curSol().base()[i]); -#endif // HAVE_VALGRIND - - asImp_().updateBegin(); - - bool converged = solver.execute(controller); - if (converged) { - asImp_().updateSuccessful(); - } - else - asImp_().updateFailed(); - -#if HAVE_VALGRIND - for (size_t i = 0; i < curSol().base().size(); ++i) { - Valgrind::CheckDefined(curSol().base()[i]); - } -#endif // HAVE_VALGRIND - - return converged; - } - - /*! - * \brief Check the plausibility of the current solution - * - * This has to be done by the actual model, it knows - * best, what (ranges of) variables to check. - * This is primarily a hook - * which the actual model can overload. - */ - void checkPlausibility() const - { } - - /*! - * \brief Called by the update() method before it tries to - * apply the newton method. This is primarily a hook - * which the actual model can overload. - */ - void updateBegin() - { } - - - /*! - * \brief Called by the update() method if it was - * successful. This is primarily a hook which the actual - * model can overload. - */ - void updateSuccessful() - { } - - /*! - * \brief Called by the update() method if it was - * unsuccessful. This is primarily a hook which the actual - * model can overload. - */ - void updateFailed() - { - // Reset the current solution to the one of the - // previous time step so that we can start the next - // update at a physically meaningful solution. - *uCur_ = *uPrev_; - if (isBox) - curHints_ = prevHints_; - - jacAsm_->reassembleAll(); - } - - /*! - * \brief Called by the problem if a time integration was - * successful, post processing of the solution is done and - * the result has been written to disk. - * - * This should prepare the model for the next time integration. - */ - void advanceTimeLevel() - { - // make the current solution the previous one. - *uPrev_ = *uCur_; - if (isBox) - prevHints_ = curHints_; - - updatePrevHints(); - } - - /*! - * \brief Serializes the current state of the model. - * - * \tparam Restarter The type of the serializer class - * - * \param res The serializer object - */ - template - void serialize(Restarter &res) - { - if (isBox) - res.template serializeEntities(asImp_(), gridView_()); - else - res.template serializeEntities<0>(asImp_(), gridView_()); - } - - /*! - * \brief Deserializes the state of the model. - * - * \tparam Restarter The type of the serializer class - * - * \param res The serializer object - */ - template - void deserialize(Restarter &res) - { - if (isBox) - res.template deserializeEntities(asImp_(), gridView_()); - else - res.template deserializeEntities<0>(asImp_(), gridView_()); - - prevSol() = curSol(); - } - - /*! - * \brief Write the current solution for a vertex to a restart - * file. - * - * \param outstream The stream into which the vertex data should - * be serialized to - * \param entity The entity which's data should be - * serialized, i.e. a vertex for the box method - * and an element for the cell-centered method - */ - template - void serializeEntity(std::ostream &outstream, - const Entity &entity) - { - int dofIdxGlobal = dofMapper().index(entity); - - // write phase state - if (!outstream.good()) { - DUNE_THROW(Dune::IOError, - "Could not serialize vertex " - << dofIdxGlobal); - } - - for (int eqIdx = 0; eqIdx < numEq; ++eqIdx) { - outstream << curSol()[dofIdxGlobal][eqIdx] << " "; - } - } - - /*! - * \brief Reads the current solution variables for a vertex from a - * restart file. - * - * \param instream The stream from which the vertex data should - * be deserialized from - * \param entity The entity which's data should be - * serialized, i.e. a vertex for the box method - * and an element for the cell-centered method - */ - template - void deserializeEntity(std::istream &instream, - const Entity &entity) - { - int dofIdxGlobal = dofMapper().index(entity); - - for (int eqIdx = 0; eqIdx < numEq; ++eqIdx) { - if (!instream.good()) - DUNE_THROW(Dune::IOError, - "Could not deserialize vertex " - << dofIdxGlobal); - instream >> curSol()[dofIdxGlobal][eqIdx]; - } - } - - /*! - * \brief Returns the number of global degrees of freedoms (DOFs) - */ - size_t numDofs() const - { - if (isBox) - return gridView_().size(dim); - else - return gridView_().size(0); - } - - /*! - * \brief Mapper for the entities where degrees of freedoms are - * defined to indices. - * - * Is the box method is used, this means a mapper - * for vertices, if the cell centered method is used, - * this means a mapper for elements. - */ - template - const typename std::enable_if::type &dofMapper() const - { - return problem_().vertexMapper(); - } - template - const typename std::enable_if::type &dofMapper() const - { - return problem_().elementMapper(); - } - - /*! - * \brief Mapper for vertices to indices. - */ - const VertexMapper &vertexMapper() const - { return problem_().vertexMapper(); } - - /*! - * \brief Mapper for elements to indices. - */ - const ElementMapper &elementMapper() const - { return problem_().elementMapper(); } - - /*! - * \brief Resets the Jacobian matrix assembler, so that the - * boundary types can be altered. - */ - void resetJacobianAssembler () - { - jacAsm_.template reset(0); - jacAsm_ = std::make_shared(); - jacAsm_->init(problem_()); - } - - /*! - * \brief Update the weights of all primary variables within an - * element given the complete set of volume variables - * - * \param element The DUNE codim 0 entity - * \param volVars All volume variables for the element - */ - void updatePVWeights(const Element &element, - const ElementVolumeVariables &volVars) const - { } - - /*! - * \brief Add the vector fields for analysing the convergence of - * the newton method to the a VTK multi writer. - * - * \tparam MultiWriter The type of the VTK multi writer - * - * \param writer The VTK multi writer object on which the fields should be added. - * \param u The solution function - * \param deltaU The delta of the solution function before and after the Newton update - */ - template - void addConvergenceVtkFields(MultiWriter &writer, - const SolutionVector &u, - const SolutionVector &deltaU) - { - typedef Dune::BlockVector > ScalarField; - - SolutionVector residual(u); - asImp_().globalResidual(residual, u); - - // create the required scalar fields - unsigned numDofs = asImp_().numDofs(); - - // global defect of the two auxiliary equations - ScalarField* def[numEq]; - ScalarField* delta[numEq]; - ScalarField* x[numEq]; - for (int eqIdx = 0; eqIdx < numEq; ++eqIdx) { - x[eqIdx] = writer.allocateManagedBuffer(numDofs); - delta[eqIdx] = writer.allocateManagedBuffer(numDofs); - def[eqIdx] = writer.allocateManagedBuffer(numDofs); - } - - for (unsigned int vIdxGlobal = 0; vIdxGlobal < u.base().size(); vIdxGlobal++) - { - for (int eqIdx = 0; eqIdx < numEq; ++eqIdx) - { - (*x[eqIdx])[vIdxGlobal] = u.base()[vIdxGlobal][eqIdx]; - (*delta[eqIdx])[vIdxGlobal] = - deltaU.base()[vIdxGlobal][eqIdx]; - (*def[eqIdx])[vIdxGlobal] = residual.base()[vIdxGlobal][eqIdx]; - } - } - - for (int eqIdx = 0; eqIdx < numEq; ++eqIdx) { - std::ostringstream oss; - oss.str(""); oss << "x_" << eqIdx; - if (isBox) - writer.attachVertexData(*x[eqIdx], oss.str()); - else - writer.attachCellData(*x[eqIdx], oss.str()); - oss.str(""); oss << "delta_" << eqIdx; - if (isBox) - writer.attachVertexData(*delta[eqIdx], oss.str()); - else - writer.attachCellData(*delta[eqIdx], oss.str()); - oss.str(""); oss << "defect_" << eqIdx; - if (isBox) - writer.attachVertexData(*def[eqIdx], oss.str()); - else - writer.attachCellData(*def[eqIdx], oss.str()); - } - - asImp_().addOutputVtkFields(u, writer); - } - - /*! - * \brief Add the quantities of a time step which ought to be written to disk. - * - * This should be overwritten by the actual model if any secondary - * variables should be written out. Read: This should _always_ be - * overwritten by well behaved models! - * - * \tparam MultiWriter The type of the VTK multi writer - * - * \param sol The global vector of primary variable values. - * \param writer The VTK multi writer where the fields should be added. - */ - template - void addOutputVtkFields(const SolutionVector &sol, - MultiWriter &writer) - { - typedef Dune::BlockVector > ScalarField; - - // create the required scalar fields - unsigned numDofs = asImp_().numDofs(); - - // global defect of the two auxiliary equations - ScalarField* x[numEq]; - for (int eqIdx = 0; eqIdx < numEq; ++eqIdx) { - x[eqIdx] = writer.allocateManagedBuffer(numDofs); - } - - for (int vIdxGlobal = 0; vIdxGlobal < sol.size(); vIdxGlobal++) - { - for (int eqIdx = 0; eqIdx < numEq; ++eqIdx) { - (*x[eqIdx])[vIdxGlobal] = sol[vIdxGlobal][eqIdx]; - } - } - - for (int eqIdx = 0; eqIdx < numEq; ++eqIdx) { - std::ostringstream oss; - oss << "primaryVar_" << eqIdx; - if (isBox) - writer.attachVertexData(*x[eqIdx], oss.str()); - else - writer.attachCellData(*x[eqIdx], oss.str()); - } - } - - /*! - * \brief Reference to the grid view of the spatial domain. - */ - const GridView &gridView() const - { return problem_().gridView(); } - - /*! - * \brief Returns true if the entity indicated by 'dofIdxGlobal' - * is located on / touches the grid's boundary. - * - * \param dofIdxGlobal The global index of the entity - */ - bool onBoundary(const int dofIdxGlobal) const - { return boundaryIndices_[dofIdxGlobal]; } - - /*! - * \brief Returns true if a vertex is located on the grid's - * boundary. - * - * \param element A DUNE Codim<0> entity which contains the control - * volume's associated vertex. - * \param vIdx The local vertex index inside element - */ - bool onBoundary(const Element &element, const int vIdx) const - { - if (isBox) - return onBoundary(vertexMapper().subIndex(element, vIdx, dim)); - else - DUNE_THROW(Dune::InvalidStateException, - "requested for cell-centered model"); - } - - - /*! - * \brief Returns true if the control volume touches - * the grid's boundary. - * - * \param element A DUNE Codim<0> entity coinciding with the control - * volume. - */ - bool onBoundary(const Element &element) const - { - if (!isBox) - return onBoundary(elementMapper().index(element)); - else - DUNE_THROW(Dune::InvalidStateException, - "requested for box model"); - } - - /*! - * \brief Fill the fluid state according to the primary variables. - * - * Taking the information from the primary variables, - * the fluid state is filled with every information that is - * necessary to evaluate the model's local residual. - * - * \param priVars The primary variables of the model. - * \param problem The problem at hand. - * \param element The current element. - * \param fvGeometry The finite volume element geometry. - * \param scvIdx The index of the subcontrol volume. - * \param fluidState The fluid state to fill. - */ - template - static void completeFluidState(const PrimaryVariables& priVars, - const Problem& problem, - const Element& element, - const FVElementGeometry& fvGeometry, - const int scvIdx, - FluidState& fluidState) - { - VolumeVariables::completeFluidState(priVars, problem, element, - fvGeometry, scvIdx, fluidState); - } -protected: - /*! - * \brief A reference to the problem on which the model is applied. - */ - Problem &problem_() - { return *problemPtr_; } - /*! - * \copydoc problem_() - */ - const Problem &problem_() const - { return *problemPtr_; } - - /*! - * \brief Reference to the grid view of the spatial domain. - */ - const GridView &gridView_() const - { return problem_().gridView(); } - - /*! - * \brief Reference to the local residal object - */ - LocalResidual &localResidual_() - { return localJacobian_.localResidual(); } - - /*! - * \brief Applies the initial solution for all vertices of the grid. - */ - void applyInitialSolution_() - { - // first set the whole domain to zero - *uCur_ = Scalar(0.0); - boxVolume_ = Scalar(0.0); - - FVElementGeometry fvGeometry; - - // iterate through leaf grid and evaluate initial - // condition at the center of each sub control volume - // - // the initial condition needs to be unique for - // each vertex. we should think about the API... - for (const auto& element : elements(gridView_())) { - // deal with the current element - fvGeometry.update(gridView_(), element); - - // loop over all element vertices, i.e. sub control volumes - for (int scvIdx = 0; scvIdx < fvGeometry.numScv; scvIdx++) - { - // get the global index of the degree of freedom - int dofIdxGlobal = dofMapper().subIndex(element, scvIdx, dofCodim); - - // let the problem do the dirty work of nailing down - // the initial solution. - PrimaryVariables initPriVars; - Valgrind::SetUndefined(initPriVars); - problem_().initial(initPriVars, - element, - fvGeometry, - scvIdx); - Valgrind::CheckDefined(initPriVars); - - if (isBox) - { - // add up the initial values of all sub-control - // volumes. If the initial values disagree for - // different sub control volumes, the initial value - // will be the arithmetic mean. - initPriVars *= fvGeometry.subContVol[scvIdx].volume; - boxVolume_[dofIdxGlobal] += fvGeometry.subContVol[scvIdx].volume; - } - - uCur_->base()[dofIdxGlobal] += initPriVars; - Valgrind::CheckDefined(uCur_->base()[dofIdxGlobal]); - } - } - - // add up the primary variables and the volumes of the boxes - // which cross process borders - if (isBox && gridView_().comm().size() > 1) { - VertexHandleSum, - Dune::BlockVector >, - VertexMapper> sumVolumeHandle(boxVolume_, vertexMapper()); - gridView_().communicate(sumVolumeHandle, - Dune::InteriorBorder_InteriorBorder_Interface, - Dune::ForwardCommunication); - - VertexHandleSum - sumPVHandle(uCur_->base(), vertexMapper()); - gridView_().communicate(sumPVHandle, - Dune::InteriorBorder_InteriorBorder_Interface, - Dune::ForwardCommunication); - } - - if (isBox) - { - // divide all primary variables by the volume of their boxes - for (unsigned int i = 0; i < uCur_->base().size(); ++i) { - uCur_->base()[i] /= boxVolume(i); - } - } - } - - /*! - * \brief Find all indices of boundary vertices (box) / elements (cell centered). - */ - void updateBoundaryIndices_() - { - boundaryIndices_.resize(numDofs()); - std::fill(boundaryIndices_.begin(), boundaryIndices_.end(), false); - - for (const auto& element : elements(gridView_())) { - Dune::GeometryType geomType = element.geometry().type(); - const ReferenceElement &refElement = ReferenceElements::general(geomType); - - for (const auto& intersection : intersections(gridView_(), element)) { - if (intersection.boundary()) { - if (isBox) - { - // add all vertices on the intersection to the set of - // boundary vertices - int fIdx = intersection.indexInInside(); - int numFaceVerts = refElement.size(fIdx, 1, dim); - for (int faceVertexIdx = 0; - faceVertexIdx < numFaceVerts; - ++faceVertexIdx) - { - int vIdx = refElement.subEntity(fIdx, - 1, - faceVertexIdx, - dim); - int vIdxGlobal = vertexMapper().subIndex(element, vIdx, dim); - boundaryIndices_[vIdxGlobal] = true; - } - } - else - { - int eIdxGlobal = elementMapper().index(element); - boundaryIndices_[eIdxGlobal] = true; - } - } - } - } - } - - // the hint cache for the previous and the current volume - // variables - mutable std::vector hintsUsable_; - mutable std::vector curHints_; - mutable std::vector prevHints_; - - // the problem we want to solve. defines the constitutive - // relations, matxerial laws, etc. - Problem *problemPtr_; - - // calculates the local jacobian matrix for a given element - LocalJacobian localJacobian_; - // Linearizes the problem at the current time step using the - // local jacobian - std::shared_ptr jacAsm_; - - // the set of all indices of vertices on the boundary - std::vector boundaryIndices_; - - // cur is the current iterative solution, prev the converged - // solution of the previous time step - std::shared_ptr uCur_; - std::shared_ptr uPrev_; - - Dune::BlockVector > boxVolume_; - -private: - /*! - * \brief Returns whether messages should be printed - */ - bool verbose_() const - { return gridView_().comm().rank() == 0; } - - Implementation &asImp_() - { return *static_cast(this); } - const Implementation &asImp_() const - { return *static_cast(this); } - - bool enableHints_; -}; -} // end namespace Dumux - -#endif diff --git a/dumux/geomechanics/el2p/elementvolumevariables.hh b/dumux/geomechanics/el2p/elementvolumevariables.hh deleted file mode 100644 index 0b2f3690023a15b469358f594e55dbc32aeae797..0000000000000000000000000000000000000000 --- a/dumux/geomechanics/el2p/elementvolumevariables.hh +++ /dev/null @@ -1,303 +0,0 @@ -// -*- mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- -// vi: set et ts=4 sw=4 sts=4: -/***************************************************************************** - * See the file COPYING for full copying permissions. * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 2 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program. If not, see . * - *****************************************************************************/ -/*! - * \file - * \brief Volume variables gathered on an element - */ -#ifndef DUMUX_BOX_EL2P_ELEMENT_VOLUME_VARIABLES_HH -#define DUMUX_BOX_EL2P_ELEMENT_VOLUME_VARIABLES_HH - -#include - -#include -#include "properties.hh" - -namespace Dumux -{ - -/*! - * \ingroup ElTwoPBoxModel - * - * \brief This class stores an array of VolumeVariables objects, one - * volume variables object for each of the element's vertices - */ -template -class ElTwoPElementVolumeVariables : public std::vector -{ - typedef typename GET_PROP_TYPE(TypeTag, VolumeVariables) VolumeVariables; - typedef typename GET_PROP_TYPE(TypeTag, Problem) Problem; - typedef typename GET_PROP_TYPE(TypeTag, Scalar) Scalar; - typedef typename GET_PROP_TYPE(TypeTag, FVElementGeometry) FVElementGeometry; - typedef typename GET_PROP_TYPE(TypeTag, SolutionVector) SolutionVector; - typedef typename GET_PROP_TYPE(TypeTag, PrimaryVariables) PrimaryVariables; - - typedef typename GET_PROP_TYPE(TypeTag, GridView) GridView; - typedef typename GridView::template Codim<0>::Entity Element; - typedef typename Element::Geometry::JacobianInverseTransposed JacobianInverseTransposed; - - enum { dim = GridView::dimension }; - enum { dimWorld = GridView::dimensionworld }; - typedef typename GET_PROP_TYPE(TypeTag, GridFunctionSpace) GridFunctionSpace; - - typedef Dune::PDELab::LocalFunctionSpace LocalFunctionSpace; - - typedef Dune::FieldVector GlobalPosition; - - typedef typename GET_PROP_TYPE(TypeTag, Indices) Indices; - enum { - pressureIdx = Indices::pressureIdx, - saturationIdx = Indices::saturationIdx - }; - -public: - /*! - * \brief The constructor. - */ - ElTwoPElementVolumeVariables() - { } - - /*! - * \brief Construct the volume variables for all vertices of an element. - * - * \param problem The problem which needs to be simulated. - * \param element The DUNE Codim<0> entity for which the volume variables ought to be calculated - * \param fvGeometry The finite volume geometry of the element - * \param isOldSol Tells whether the model's previous or current solution should be used. - * - * This class is required for the update of the effective porosity values at the - * vertices since it is a function of the divergence of the solid displacement - * at the integration points - */ - void update(const Problem &problem, - const Element &element, - const FVElementGeometry &fvGeometry, - bool isOldSol) - { - // retrieve the current or the previous solution vector and write the values into globalSol - const SolutionVector &globalSol = - isOldSol? - problem.model().prevSol(): - problem.model().curSol(); - - const GridFunctionSpace& gridFunctionSpace = problem.model().jacobianAssembler().gridFunctionSpace(); - const typename GridFunctionSpace::Ordering& ordering = gridFunctionSpace.ordering(); - // copy the values of the globalSol vector to the localFunctionSpace values of the current element - LocalFunctionSpace localFunctionSpace(gridFunctionSpace); - localFunctionSpace.bind(element); - std::vector values(localFunctionSpace.size()); - for (typename LocalFunctionSpace::Traits::IndexContainer::size_type k=0; k::Type PressSatLFS; - const PressSatLFS& pressSatLFS = localFunctionSpace.template child<0>(); - // local function space for pressure - typedef typename PressSatLFS::template Child<0>::Type PressLFS; - const PressLFS& pressLFS = pressSatLFS.template child<0>(); - // local function space for saturation - typedef typename PressSatLFS::template Child<1>::Type SatLFS; - const SatLFS& satLFS = pressSatLFS.template child<1>(); - // local function space for solid displacement - typedef typename LocalFunctionSpace::template Child<1>::Type DisplacementLFS; - const DisplacementLFS& displacementLFS = localFunctionSpace.template child<1>(); - typedef typename DisplacementLFS::template Child<0>::Type ScalarDispLFS; - - int numScv = element.subEntities(dim); - this->resize(numScv); - - for (int scvIdx = 0; scvIdx < numScv; scvIdx++) - { - // solution vector solI for each vertex - PrimaryVariables solI; - // pressure and saturation values - solI[pressureIdx] = values[pressLFS.localIndex(scvIdx)]; - solI[saturationIdx] = values[satLFS.localIndex(scvIdx)]; - // solid displacement values for each coordinate direction - for (int coordDir = 0; coordDir < dim; coordDir++) - { - const ScalarDispLFS& scalarDispLFS = displacementLFS.child(coordDir); - solI[Indices::u(coordDir)] = values[scalarDispLFS.localIndex(scvIdx)]; - } - // reset evaluation point to zero - (*this)[scvIdx].setEvalPoint(0); - - (*this)[scvIdx].update(solI, - problem, - element, - fvGeometry, - scvIdx, - isOldSol); - - Valgrind::CheckDefined((*this)[scvIdx]); - } - this->updateEffPorosity(problem, element, fvGeometry, isOldSol); - - if (isOldSol) - prevValues_ = values; - else - dofValues_ = values; - } - - /*! - * \brief Update the effective porosities for all vertices of an element. - * - * \param problem The problem which needs to be simulated. - * \param element The DUNE Codim<0> entity for which the volume variables ought to be calculated - * \param fvGeometry The finite volume geometry of the element - * \param isOldSol Specifies whether this is the previous solution or the current one - * - * This function is required for the update of the effective porosity values at the - * vertices. - * - * During the partial derivative calculation, changes of the solid displacement - * at vertex i can affect effective porosities of all element vertices. - * To correctly update the effective porosities of all element vertices - * an iteration over all scv faces is required. - * The remaining volvars are only updated for the vertex whose primary variable - * is changed for the derivative calculation. - */ - void updateEffPorosity(const Problem &problem, - const Element &element, - const FVElementGeometry &fvGeometry, - bool isOldSol) - { - int numScv = element.subEntities(dim); - - // retrieve the current or the previous solution vector and write the values into globalSol - const SolutionVector &globalSol = - isOldSol? - problem.model().prevSol(): - problem.model().curSol(); - - // copy the values of the globalSol vector to the localFunctionSpace values of the current element - const GridFunctionSpace& gridFunctionSpace = problem.model().jacobianAssembler().gridFunctionSpace(); - const typename GridFunctionSpace::Ordering& ordering = gridFunctionSpace.ordering(); - LocalFunctionSpace localFunctionSpace(gridFunctionSpace); - localFunctionSpace.bind(element); - std::vector values(localFunctionSpace.size()); - for (typename LocalFunctionSpace::Traits::IndexContainer::size_type k=0; k::Type DisplacementLFS; - const DisplacementLFS& displacementLFS = localFunctionSpace.template child<1>(); - const unsigned int dispSize = displacementLFS.child(0).size(); - typedef typename DisplacementLFS::template Child<0>::Type ScalarDispLFS; - // further types required for gradient calculations - typedef typename ScalarDispLFS::Traits::FiniteElementType:: - Traits::LocalBasisType::Traits::JacobianType JacobianType_V; - typedef typename ScalarDispLFS::Traits::FiniteElementType:: - Traits::LocalBasisType::Traits::RangeFieldType RF; - typedef Dune::FieldMatrix Tensor; - - for (int scvIdx = 0; scvIdx < numScv; scvIdx++) - (*this)[scvIdx].effPorosity = 0.0; - - for (int scvIdx = 0; scvIdx < numScv; scvIdx++) - { - GlobalPosition scvCenter = fvGeometry.subContVol[scvIdx].localCenter; - - // evaluate gradient of displacement shape functions at the center of - // the sub control volume in the reference element - std::vector vRefShapeGradient(dispSize); - displacementLFS.child(0).finiteElement().localBasis().evaluateJacobian(scvCenter, vRefShapeGradient); - - // transform gradient to element in global coordinates - const JacobianInverseTransposed jacInvT = element.geometry().jacobianInverseTransposed(scvCenter); - std::vector > vShapeGradient(dispSize); - - // loop over element vertices - for (size_t i = 0; i < dispSize; i++) - { - vShapeGradient[i] = 0.0; - jacInvT.umv(vRefShapeGradient[i][0],vShapeGradient[i]); - } - - // calculate gradient of current displacement - // (gradient of a vector is a tensor) - Tensor uGradient(0.0); - // loop over coordinate directions - for(int coordDir = 0; coordDir < dim; ++coordDir) - { - const ScalarDispLFS & scalarDispLFS = displacementLFS.child(coordDir); - // loop over element vertices - for (size_t i = 0; i < scalarDispLFS.size(); i++) - uGradient[coordDir].axpy((*this)[i].displacement(coordDir), vShapeGradient[i]); - } - - // calculate the divergence of u - (*this)[scvIdx].divU = 0.0; - - for (int coordDir = 0; coordDir < dim; coordDir++) - (*this)[scvIdx].divU += uGradient[coordDir][coordDir]; - - // calculate the effective porosity - if(problem.coupled() == true) - { - if ((*this)[scvIdx].divU < -(*this)[scvIdx].porosity()) - { - (*this)[scvIdx].effPorosity = (*this)[scvIdx].porosity(); - std::cout<<"volume change too large"<& dofValues() const - { - return dofValues_; - } - - Scalar& dofValues(int k) - { - return dofValues_[k]; - } - - const std::vector& prevValues() const - { - return prevValues_; - } - -private: - std::vector dofValues_; - std::vector prevValues_; -}; - -} // namespace Dumux - -#endif diff --git a/dumux/geomechanics/el2p/fluxvariables.hh b/dumux/geomechanics/el2p/fluxvariables.hh deleted file mode 100644 index 157e010c6f244b15a345599d8799fbe57c227b80..0000000000000000000000000000000000000000 --- a/dumux/geomechanics/el2p/fluxvariables.hh +++ /dev/null @@ -1,245 +0,0 @@ -// -*- mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- -// vi: set et ts=4 sw=4 sts=4: -/***************************************************************************** - * See the file COPYING for full copying permissions. * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 2 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program. If not, see . * - *****************************************************************************/ -/*! - * \file - * - * \brief This file contains the calculation of all the fluxes over the surface of the - * finite volume that make up the volume, the mass and the momentum balance - * for the two-phase linear-elastic model. - * - * This means pressure, concentration and solid-displacement gradients, phase densities at - * the integration point, etc. - * - * This class inherits from the two-phase model FluxVariables - */ -#ifndef DUMUX_EL2P_FLUX_VARIABLES_HH -#define DUMUX_EL2P_FLUX_VARIABLES_HH - -#include -#include -#include "properties.hh" - -namespace Dumux -{ - -namespace Properties -{ -// forward declaration of properties -NEW_PROP_TAG(SpatialParams); -} -/*! - * \ingroup ElTwoPBoxModel - * \ingroup ImplicitFluxVariables - * \brief This template class contains the data which is required to - * calculate the fluxes over the surface of the - * finite volume that make up the volume, the mass and the momentum balance - * for the two-phase linear-elastic model. - * - * This means pressure, concentration and solid-displacement gradients, phase densities at - * the integration point, etc. - * - */ -template -class ElTwoPFluxVariables: public ImplicitDarcyFluxVariables -{ - friend class ImplicitDarcyFluxVariables; // be friends with parent - typedef ImplicitDarcyFluxVariables ParentType; - - typedef typename GET_PROP_TYPE(TypeTag, Problem) Problem; - typedef typename GET_PROP_TYPE(TypeTag, SpatialParams) SpatialParams; - typedef typename GET_PROP_TYPE(TypeTag, ElementVolumeVariables) ElementVolumeVariables; - - typedef typename GET_PROP_TYPE(TypeTag, GridView) GridView; - typedef typename GridView::template Codim<0>::Entity Element; - enum - { - dim = GridView::dimension, - dimWorld = GridView::dimensionworld - }; - - typedef typename GridView::ctype CoordScalar; - typedef typename GET_PROP_TYPE(TypeTag, Scalar) Scalar; - typedef Dune::FieldVector GlobalPosition; - typedef Dune::FieldVector DimVector; - typedef Dune::FieldMatrix DimMatrix; - - typedef typename GET_PROP_TYPE(TypeTag, FVElementGeometry) FVElementGeometry; - typedef typename FVElementGeometry::SubControlVolumeFace SCVFace; - - enum {numEq = GET_PROP_VALUE(TypeTag, NumEq)}; - -public: - /*! - * \brief Compute / update the flux variables - * - * \param problem The problem - * \param element The finite element - * \param fvGeometry The finite-volume geometry - * \param fIdx The local index of the SCV (sub-control-volume) face - * \param elemVolVars The volume variables of the current element - * \param onBoundary A boolean variable to specify whether the flux variables - * are calculated for interior SCV faces or boundary faces, default=false - */ - void update(const Problem &problem, - const Element &element, - const FVElementGeometry &fvGeometry, - const int fIdx, - const ElementVolumeVariables &elemVolVars, - const bool onBoundary = false) - { - ParentType::update(problem, element, fvGeometry, fIdx, elemVolVars); - - dU_ = 0.0; - timeDerivUNormal_ = 0.0; - - elTwoPGradients_(problem, element, elemVolVars); - calculateDDt_(problem, element, elemVolVars); - } - -public: - /*! - * \brief Return change of u [m] with time at integration point - * point. - */ - Scalar dU(int dimIdx) const - { - return dU_[dimIdx]; - } - - /*! - * \brief Return time derivative of u [m/s] in normal - * direction at integration point - */ - Scalar timeDerivUNormal() const - { - return timeDerivUNormal_; - } - - /* - * \brief Return the intrinsic permeability. - */ - const DimMatrix &intrinsicPermeability() const - { - return K_; - } - - /* - * \brief Return the gradient of the potential for each phase. - */ - DimVector potentialGrad(int phaseIdx) const - { - return this->potentialGrad_[phaseIdx]; - } - - const SCVFace &face() const - { - return this->fvGeometry_().subContVolFace[this->faceIdx_]; - } - -protected: - /*! - * \brief Calculation of the solid displacement gradients. - * - * \param problem The considered problem file - * \param element The considered element of the grid - * \param elemVolVars The parameters stored in the considered element - */ - void elTwoPGradients_(const Problem &problem, - const Element &element, - const ElementVolumeVariables &elemVolVars) - { - typedef typename GET_PROP_TYPE(TypeTag, GridFunctionSpace) GridFunctionSpace; - typedef Dune::PDELab::LocalFunctionSpace LocalFunctionSpace; - const GridFunctionSpace& gridFunctionSpace = problem.model().jacobianAssembler().gridFunctionSpace(); - const typename GridFunctionSpace::Ordering& ordering = gridFunctionSpace.ordering(); - LocalFunctionSpace localFunctionSpace(gridFunctionSpace); - localFunctionSpace.bind(element); - // copy values of previous solution into prevSolutionValues Vector - std::vector prevSolutionValues(localFunctionSpace.size()); - // copy values of current solution into curSolutionValues Vector - std::vector curSolutionValues(localFunctionSpace.size()); - for (typename LocalFunctionSpace::Traits::IndexContainer::size_type k=0; k::Type DisplacementLFS; - const DisplacementLFS& displacementLFS = localFunctionSpace.template child<1>(); - // number of degrees of freedom for each displacement value (here number of element vertices) - const unsigned int dispSize = displacementLFS.child(0).size(); - // type of function space of solid displacement value (one for each coordinate direction) - typedef typename DisplacementLFS::template Child<0>::Type ScalarDispLFS; - typedef typename ScalarDispLFS::Traits::FiniteElementType::Traits::LocalBasisType::Traits::RangeType RT_V; - - for(int coordDir = 0; coordDir < dim; ++coordDir) { - // get displacement function space for coordinate direction coordDir - const ScalarDispLFS & scalarDispLFS = displacementLFS.child(coordDir); - std::vector vShape(dispSize); - // evaluate shape functions of all element vertices for current integration point and write it into vector vShape - scalarDispLFS.finiteElement().localBasis().evaluateFunction(face().ipLocal, vShape); - - dU_[coordDir] = 0; - // subtract previous displacement value from current displacement value for each coordinate direction - // coordDir and for each node i and interpolate values at integration point via the shape function vShape. - // TODO: Check if evaluation of prevVolVars is possible - for (size_t i = 0; i < dispSize; i++){ - dU_[coordDir] += (elemVolVars[i].primaryVars()[(numEq - dim)+coordDir] - - prevSolutionValues[scalarDispLFS.localIndex(i)])*vShape[i]; - } - } - } - - /*! - * \brief Calculation of the time derivative of solid displacement - * \param problem The considered problem file - * \param element The considered element of the grid - * \param elemVolVars The parameters stored in the considered element - */ - void calculateDDt_(const Problem &problem, - const Element &element, - const ElementVolumeVariables &elemVolVars) - { - Scalar dt = problem.timeManager().timeStepSize(); - - DimVector tmp(0.0); - // calculate time derivative of solid displacement vector - for (int coordDir = 0; coordDir < dim; ++coordDir) - tmp[coordDir] = dU(coordDir) / dt; - - // multiply time derivative of solid displacement vector with - // normal vector of current scv-face - timeDerivUNormal_ = tmp * face().normal; - } - - //! time derivative of solid displacement times normal vector at integration point - Scalar timeDerivUNormal_; - //! change of solid displacement with time at integration point - GlobalPosition dU_; - // intrinsic permeability - DimMatrix K_; -}; - -} // end namespace - -#endif diff --git a/dumux/geomechanics/el2p/indices.hh b/dumux/geomechanics/el2p/indices.hh deleted file mode 100644 index c0675daf9bf5070c13c576310187c8fe54a57984..0000000000000000000000000000000000000000 --- a/dumux/geomechanics/el2p/indices.hh +++ /dev/null @@ -1,58 +0,0 @@ -// -*- mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- -// vi: set et ts=4 sw=4 sts=4: -/***************************************************************************** - * See the file COPYING for full copying permissions. * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 2 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program. If not, see . * - *****************************************************************************/ -/*! - * \file - * - * \brief Defines the primary variable and equation indices used by - * the two-phase linear elasticity model. - */ -#ifndef DUMUX_ELASTIC2P_INDICES_HH -#define DUMUX_ELASTIC2P_INDICES_HH - -#include -#include - -namespace Dumux -{ -// \{ - -namespace Properties -{ - -/*! - * \ingroup ElTwoPBoxModel - * \ingroup ImplicitIndices - * \brief The indices for the two-phase linear elasticity model. - * - * This class inherits from the TwoPIndices and from the ElasticIndices - */ - -// PVOffset is set to 0 for the TwoPIndices and to 2 for the ElasticIndices since -// the first two primary variables are the primary variables of the two-phase -// model followed by the primary variables of the elastic model -template -class ElTwoPIndices : public ElasticIndices, public TwoPIndices -{}; - -} -} - -#endif diff --git a/dumux/geomechanics/el2p/localjacobian.hh b/dumux/geomechanics/el2p/localjacobian.hh deleted file mode 100644 index 67a960a31e5f04369f833bcd35d3956b6ba03397..0000000000000000000000000000000000000000 --- a/dumux/geomechanics/el2p/localjacobian.hh +++ /dev/null @@ -1,257 +0,0 @@ -// -*- mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- -// vi: set et ts=4 sw=4 sts=4: -/***************************************************************************** - * See the file COPYING for full copying permissions. * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 2 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program. If not, see . * - *****************************************************************************/ -/*! - * \file - * \brief Calculates the partial derivatives of the local residual for the Jacobian of the - * two-phase linear elasticity model. - */ -#ifndef DUMUX_EL2P_LOCAL_JACOBIAN_HH -#define DUMUX_EL2P_LOCAL_JACOBIAN_HH - -#include -#include -#include "properties.hh" - -namespace Dumux -{ -/*! - * \ingroup ElTwoPBoxModel - * \brief Calculates the partial derivatives of the local residual for the Jacobian - * - * Except for the evalPartialDerivatives function all functions are taken from the - * base class ImplicitLocalJacobian - */ -template -class ElTwoPLocalJacobian : public ImplicitLocalJacobian -{ -private: - typedef typename GET_PROP_TYPE(TypeTag, GridView) GridView; - enum { - dim = GridView::dimension, - }; - typedef typename GET_PROP_TYPE(TypeTag, ElementSolutionVector) ElementSolutionVector; - typedef typename GET_PROP_TYPE(TypeTag, PrimaryVariables) PrimaryVariables; - typedef typename GET_PROP_TYPE(TypeTag, VolumeVariables) VolumeVariables; - typedef typename GET_PROP_TYPE(TypeTag, Scalar) Scalar; - - typedef typename GET_PROP_TYPE(TypeTag, Indices) Indices; - enum { - pressureIdx = Indices::pressureIdx, - saturationIdx = Indices::saturationIdx - }; - // copying a local jacobian is not a good idea - ElTwoPLocalJacobian(const ElTwoPLocalJacobian &); - -public: - ElTwoPLocalJacobian() {} - - /*! - * \brief Compute the partial derivatives to a primary variable at - * an degree of freedom. - * - * This method is overwritten here since this model requires a call of the model specific - * elementvolumevariables which updates the effective porosities correctly. - * - * The default implementation of this method uses numeric - * differentiation, i.e. forward or backward differences (2nd - * order), or central differences (3rd order). The method used is - * determined by the "NumericDifferenceMethod" property: - * - * - if the value of this property is smaller than 0, backward - * differences are used, i.e.: - * \f[ - \frac{\partial f(x)}{\partial x} \approx \frac{f(x) - f(x - \epsilon)}{\epsilon} - * \f] - * - * - if the value of this property is 0, central - * differences are used, i.e.: - * \f[ - \frac{\partial f(x)}{\partial x} \approx \frac{f(x + \epsilon) - f(x - \epsilon)}{2 \epsilon} - * \f] - * - * - if the value of this property is larger than 0, forward - * differences are used, i.e.: - * \f[ - \frac{\partial f(x)}{\partial x} \approx \frac{f(x + \epsilon) - f(x)}{\epsilon} - * \f] - * - * Here, \f$ f \f$ is the residual function for all equations, \f$x\f$ - * is the value of a sub-control volume's primary variable at the - * evaluation point and \f$\epsilon\f$ is a small value larger than 0. - * - * \param partialDeriv The vector storing the partial derivatives of all - * equations - * \param storageDeriv the mass matrix contributions - * \param col The block column index of the degree of freedom - * for which the partial derivative is calculated. - * Box: a sub-control volume index. - * Cell centered: a neighbor index. - * \param pvIdx The index of the primary variable - * for which the partial derivative is calculated - */ - void evalPartialDerivative_(ElementSolutionVector &partialDeriv, - PrimaryVariables &storageDeriv, - int col, - int pvIdx) - { - typedef typename GET_PROP_TYPE(TypeTag, GridFunctionSpace) GridFunctionSpace; - typedef Dune::PDELab::LocalFunctionSpace LocalFunctionSpace; - - // copy the values of the globalSol vector to the localFunctionSpace values of the current element - const GridFunctionSpace& gridFunctionSpace = this->problemPtr_->model().jacobianAssembler().gridFunctionSpace(); - const typename GridFunctionSpace::Ordering& ordering = gridFunctionSpace.ordering(); - LocalFunctionSpace localFunctionSpace(gridFunctionSpace); - localFunctionSpace.bind(this->element_()); - std::vector elementValues(localFunctionSpace.size()); - for (typename LocalFunctionSpace::Traits::IndexContainer::size_type k=0; kproblemPtr_->model().curSol()[ci]; - } - // pressure and saturation local function space (mass balance equations) - typedef typename LocalFunctionSpace::template Child<0>::Type PressSatLFS; - const PressSatLFS& pressSatLFS = localFunctionSpace.template child<0>(); - // local function space for pressure - typedef typename PressSatLFS::template Child<0>::Type PressLFS; - const PressLFS& pressLFS = pressSatLFS.template child<0>(); - // local function space for saturation - typedef typename PressSatLFS::template Child<1>::Type SatLFS; - const SatLFS& satLFS = pressSatLFS.template child<1>(); - // local function space for solid displacement - typedef typename LocalFunctionSpace::template Child<1>::Type DisplacementLFS; - const DisplacementLFS& displacementLFS = localFunctionSpace.template child<1>(); - typedef typename DisplacementLFS::template Child<0>::Type ScalarDispLFS; - - //primary variable vector priVars for each vertex - PrimaryVariables priVars; - priVars[pressureIdx] = elementValues[pressLFS.localIndex(col)]; - priVars[saturationIdx] = elementValues[satLFS.localIndex(col)]; - for (int coordDir = 0; coordDir < dim; coordDir++) - { - const ScalarDispLFS& scalarDispLFS = displacementLFS.child(coordDir); - priVars[Indices::u(coordDir)] = elementValues[scalarDispLFS.localIndex(col)]; - } - - VolumeVariables origVolVars(this->curVolVars_[col]); - this->curVolVars_[col].setEvalPoint(&origVolVars); - Scalar eps = this->numericEpsilon(col, pvIdx); - Scalar delta = 0; - - if (this->numericDifferenceMethod_ >= 0) { - // we are not using backward differences, i.e. we need to - // calculate f(x + \epsilon) - - // deflect primary variables - priVars[pvIdx] += eps; - delta += eps; - - // calculate the residual - this->curVolVars_[col].update(priVars, - this->problem_(), - this->element_(), - this->fvElemGeom_, - col, - false); - // update the effective porosities - this->curVolVars_.updateEffPorosity(this->problem_(), - this->element_(), - this->fvElemGeom_, - false); - - this->localResidual().eval(this->element_(), - this->fvElemGeom_, - this->prevVolVars_, - this->curVolVars_, - this->bcTypes_); - - // store the residual - partialDeriv = this->localResidual().residual(); - storageDeriv = this->localResidual().storageTerm()[col]; - } - else { - // we are using backward differences, i.e. we don't need - // to calculate f(x + \epsilon) and we can recycle the - // (already calculated) residual f(x) - partialDeriv = this->residual_; - storageDeriv = this->storageTerm_[col]; - } - - - if (this->numericDifferenceMethod_ <= 0) { - // we are not using forward differences, i.e. we don't - // need to calculate f(x - \epsilon) - - // deflect the primary variables - priVars[pvIdx] -= delta + eps; - delta += eps; - - // calculate residual again - this->curVolVars_[col].update(priVars, - this->problem_(), - this->element_(), - this->fvElemGeom_, - col, - false); - // update the effective porosities - this->curVolVars_.updateEffPorosity(this->problem_(), - this->element_(), - this->fvElemGeom_, - false); - this->localResidual().eval(this->element_(), - this->fvElemGeom_, - this->prevVolVars_, - this->curVolVars_, - this->bcTypes_); - partialDeriv -= this->localResidual().residual(); - storageDeriv -= this->localResidual().storageTerm()[col]; - - } - else { - // we are using forward differences, i.e. we don't need to - // calculate f(x - \epsilon) and we can recycle the - // (already calculated) residual f(x) - partialDeriv -= this->residual_; - storageDeriv -= this->storageTerm_[col]; - } - - // divide difference in residuals by the magnitude of the - // deflections between the two function evaluation -// if(partialDeriv[col][pvIdx] == -350045) - - partialDeriv /= delta; - storageDeriv /= delta; - // restore the orignal state of the element's volume variables - this->curVolVars_[col] = origVolVars; - // update the effective porosities - this->curVolVars_.updateEffPorosity(this->problem_(), - this->element_(), - this->fvElemGeom_, - false); - -#if HAVE_VALGRIND - for (unsigned i = 0; i < partialDeriv.size(); ++i) - Valgrind::CheckDefined(partialDeriv[i]); -#endif - } -}; -} - -#endif diff --git a/dumux/geomechanics/el2p/localoperator.hh b/dumux/geomechanics/el2p/localoperator.hh deleted file mode 100644 index 3720aff1ec3f4ac880657575108b0b979556b93c..0000000000000000000000000000000000000000 --- a/dumux/geomechanics/el2p/localoperator.hh +++ /dev/null @@ -1,636 +0,0 @@ -// -*- mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- -// vi: set et ts=4 sw=4 sts=4: -/***************************************************************************** - * See the file COPYING for full copying permissions. * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 2 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program. If not, see . * - *****************************************************************************/ -/*! - * \file - * - * \brief This file contains a local operator for PDELab which - * wraps the contributions from - * el2plocalresidual (box discretized mass balances) - * and alphaMomentum (FE discretized momentum balance). - */ -#ifndef DUMUX_EL2P_LOCAL_OPERATOR_HH -#define DUMUX_EL2P_LOCAL_OPERATOR_HH - -#include -#include - -#include -#include -#include -#include -#include -#include "properties.hh" - -namespace Dumux { - -namespace PDELab { - -/*! - * \brief A local operator for PDELab which wraps the contributions from - * el2plocalresidual (box discretized mass balances) - * and alphaMomentum (FE discretized momentum balance). - */ -template -class El2PLocalOperator - : - public Dune::PDELab::FullVolumePattern, - public Dune::PDELab::LocalOperatorDefaultFlags -{ - // copying the local operator for PDELab is not a good idea - El2PLocalOperator(const El2PLocalOperator &); - - typedef typename GET_PROP_TYPE(TypeTag, Model) Model; - typedef typename GET_PROP_TYPE(TypeTag, Scalar) Scalar; - typedef typename GET_PROP_TYPE(TypeTag, FVElementGeometry) FVElementGeometry; - typedef typename GET_PROP_TYPE(TypeTag, MaterialLaw) MaterialLaw; - typedef typename GET_PROP_TYPE(TypeTag, MaterialLawParams) MaterialLawParams; - typedef typename GET_PROP_TYPE(TypeTag, GridView) GridView; - typedef typename GridView::template Codim<0>::Entity::Geometry::JacobianInverseTransposed JacobianInverseTransposed; - typedef typename GridView::Intersection Intersection; - typedef typename Dune::PDELab::IntersectionGeometry::ctype DT; - - enum{numEq = GET_PROP_VALUE(TypeTag, NumEq)}; - enum{dim = GridView::dimension}; - enum{dimWorld = GridView::dimensionworld}; - typedef Dune::FieldVector GlobalPosition; - typedef Dune::FieldVector DimVector; - typedef typename GET_PROP_TYPE(TypeTag, Indices) Indices; - typedef typename GET_PROP_TYPE(TypeTag, BoundaryTypes) BoundaryTypes; - typedef typename GET_PROP_TYPE(TypeTag, PrimaryVariables) PrimaryVariables; - typedef typename GET_PROP_TYPE(TypeTag, VolumeVariables) VolumeVariables; - - enum { - wPhaseIdx = Indices::wPhaseIdx, - nPhaseIdx = Indices::nPhaseIdx - }; - -public: - // pattern assembly flags - enum { doPatternVolume = true }; - - // residual assembly flags - enum { doAlphaVolume = true }; - - /*! - * \param model The physical model for the box scheme. - */ - El2PLocalOperator(Model &model) - : model_(model) - {} - - /*! - * \brief Volume integral depending on test and ansatz functions - * - * \tparam EG The entity geometry type from PDELab - * \tparam LFSU The type of the local function space of the ansatz functions - * \tparam X The type of the container for the coefficients for the ansatz functions - * \tparam LFSV The type of the local function space of the test functions - * \tparam R The range type (usually FieldVector) - * - * \param eg The entity geometry object - * \param lfsu The local function space object of the ansatz functions - * \param x The object of the container for the coefficients for the ansatz functions - * \param lfsv The local function space object of the test functions - * \param r The object storing the volume integral - */ - template - void alpha_volume (const EG& eg, const LFSU& lfsu, const X& x, - const LFSV& lfsv, R& r) const - { - typedef typename LFSU::Traits::SizeType size_type; - - // evaluate the local residual of the box mass balance equation for the current element - model_.localResidual().eval(eg.entity()); - - // pressure and saturation local function space (mass balance equations) - typedef typename LFSU::template Child<0>::Type PressSatLFS; - // local function space for pressure - typedef typename PressSatLFS::template Child<0>::Type PressLFS; - const PressSatLFS& pressSatLFS = lfsu.template child<0>(); - const PressLFS& pressLFS = pressSatLFS.template child<0>(); - // local function space for saturation - typedef typename PressSatLFS::template Child<1>::Type SatLFS; - const SatLFS& satLFS = pressSatLFS.template child<1>(); - - unsigned int numScv = eg.entity().subEntities(dim); - - for (size_type i = 0; i < (numEq-dim) * numScv; i++) - { - // retrieve the local residual value for vertex=i%Vertices and equation i/numScv (here 0 or 1) - Scalar tmp = model_.localResidual().residual(i%numScv)[i/numScv]; - // get residual for brine phase mass balance equation - if(i < numScv) - r.rawAccumulate(pressLFS, i, tmp); - // get residual for CO2 phase mass balance equation - else - r.rawAccumulate(satLFS,i-numScv, tmp); - } - // get residual for momentum balance equation - alphaMomentum(eg, lfsu, x, lfsv, r); - } - - - /*! - * \brief Calculate the local residual of the momentum balance equation - * with the finite element method. This requires numerical - * integration which is done via a quadrature rule. - * - * \tparam EG The entity geometry type from PDELab - * \tparam LFSU The type of the local function space of the ansatz functions - * \tparam X The type of the container for the coefficients for the ansatz functions - * \tparam LFSV The type of the local function space of the test functions - * \tparam R The range type (usually FieldVector) - * - * \param eg The entity geometry object - * \param lfsu The local function space object of the ansatz functions - * \param x The object of the container for the coefficients for the ansatz functions - * \param lfsv The local function space object of the test functions - * \param r The object storing the volume integral - * - * - */ - template - void alphaMomentum (const EG& eg, const LFSU& lfsu, const X& x, - const LFSV& lfsv, R& r) const - { - FVElementGeometry fvGeometry; - fvGeometry.update(model_.problem().gridView(), eg.entity()); - // retrieve lame parameters for calculation of effective stresses - const Dune::FieldVector lameParams = model_.problem().spatialParams().lameParams(eg.entity(), fvGeometry, 0); - Scalar lambda = lameParams[0]; - Scalar mu = lameParams[1]; - // retrieve materialParams for calculate of capillary pressure - const MaterialLawParams& materialParams = - model_.problem().spatialParams().materialLawParams(eg.entity(), fvGeometry, 0); - // retrieve initial porosity - Scalar porosity = model_.problem().spatialParams().porosity(eg.entity(), fvGeometry, 0); - - // order of quadrature rule - const int qorder = 3; - - // extract local function spaces - // pressure and saturation local function space (mass balance equations) - typedef typename LFSU::template Child<0>::Type PressSatLFS; - const PressSatLFS& pressSatLFS = lfsu.template child<0>(); - // local function space for pressure - typedef typename PressSatLFS::template Child<0>::Type PressLFS; - const PressLFS& pressLFS = pressSatLFS.template child<0>(); - const unsigned int pressSize = pressLFS.size(); - // local function space for saturation - typedef typename PressSatLFS::template Child<1>::Type SatLFS; - const SatLFS& satLFS = pressSatLFS.template child<1>(); - // local function space for solid displacement - typedef typename LFSU::template Child<1>::Type DisplacementLFS; - typedef typename DisplacementLFS::template Child<0>::Type DisplacementScalarLFS; - const DisplacementLFS& displacementLFS = lfsu.template child<1>(); - const DisplacementScalarLFS& uScalarLFS = displacementLFS.template child<0>(); - const unsigned int dispSize = displacementLFS.template child<0>().size(); - - // domain and range field type - typedef typename DisplacementScalarLFS::Traits::FiniteElementType:: - Traits::LocalBasisType::Traits::RangeFieldType RF; - typedef typename DisplacementScalarLFS::Traits::FiniteElementType:: - Traits::LocalBasisType::Traits::RangeType RT_V; - typedef typename DisplacementScalarLFS::Traits::FiniteElementType:: - Traits::LocalBasisType::Traits::JacobianType JacobianType_V; - typedef typename PressLFS::Traits::FiniteElementType:: - Traits::LocalBasisType::Traits::DomainFieldType DF; - typedef typename PressLFS::Traits::FiniteElementType:: - Traits::LocalBasisType::Traits::RangeType RT_P; - - // select quadrature rule for the element geometry type and with the order=qorder - const auto geometry = eg.geometry(); - Dune::GeometryType geomType = geometry.type(); - const Dune::QuadratureRule& rule = Dune::QuadratureRules::rule(geomType,qorder); - - // loop over quadrature points - for (typename Dune::QuadratureRule::const_iterator it=rule.begin(); it!=rule.end(); ++it) - { - // evaluate reference element gradients of shape functions at quadrature point - // (we assume Galerkin method lfsu=lfsv) - std::vector vGradRef(dispSize); - uScalarLFS.finiteElement().localBasis().evaluateJacobian(it->position(),vGradRef); - - - // get inverse transposed jacobian for quadrature point - const JacobianInverseTransposed jacobian = geometry.jacobianInverseTransposed(it->position()); - - // calculate shape function gradients at the quadrature point in global coordinates. This is done - // by multiplying the reference element shape functions with the inverse transposed jacobian - std::vector > vGrad(dispSize); - for (size_t i = 0; i < dispSize; i++) - { - vGrad[i] = 0.0; - jacobian.umv(vGradRef[i][0],vGrad[i]); - } - - // calculate the gradient of the solid displacement vector uGrad - // x(uLFS,i) is the solid displacement entry of the solution vector - // for element vertex i and coordinate direction coordDir - - Dune::FieldMatrix uGrad(0.0); - for(int coordDir = 0; coordDir < dim; ++coordDir) { - const DisplacementScalarLFS& uLFS = displacementLFS.child(coordDir); - // compute gradient of u - for (size_t i = 0; i < dispSize; i++) - uGrad[coordDir].axpy(x(uLFS,i),vGrad[i]); - } - // calculate the strain tensor epsilon - Dune::FieldMatrix epsilon; - for(int i = 0; i < dim; ++i) - for(int j = 0; j < dim; ++j) - epsilon[i][j] = 0.5*(uGrad[i][j] + uGrad[j][i]); - - RF traceEpsilon = 0; - for(int i = 0; i < dim; ++i) - traceEpsilon += epsilon[i][i]; - - // calculate the effective stress tensor effStress - Dune::FieldMatrix effStress(0.0); - for(int i = 0; i < dim; ++i) - { - effStress[i][i] = lambda*traceEpsilon; - for(int j = 0; j < dim; ++j) - effStress[i][j] += 2.0*mu*epsilon[i][j]; - } - - // retrieve the shape functions for interpolating the primary variables at the - // current quadrature point - std::vector q(pressSize); - pressLFS.finiteElement().localBasis().evaluateFunction(it->position(),q); - - RT_P pw(0.0); - RT_P sn(0.0); - RT_P ux(0.0); - RT_P uy(0.0); - RT_P uz(0.0); - - // interpolate primary variables at current quadrature point - for (size_t i = 0; i < pressLFS.size(); i++) - { - pw += x(pressLFS,i) * q[i]; - sn += x(satLFS,i) * q[i]; - ux += x(displacementLFS.child(0),i) * q[i]; - if (dim > 1) - uy += x(displacementLFS.child(1),i) * q[i]; - if (dim > 2) - uz += x(displacementLFS.child(2),i) * q[i]; - } - RT_P sw = 1.0 - sn; - RT_P pn = pw + MaterialLaw::pc(materialParams, sw); - RT_P pEff; - - const GlobalPosition& globalPos = geometry.global(it->position()); - - // calculate change in effective pressure with respect to initial conditions pInit (pInit is negativ) - pEff = pw*sw + pn*sn + model_.problem().pInit(globalPos, it->position(), eg.entity()); - RF uDiv = traceEpsilon; - RF porosityEff; - - // assume deformation induced porosity changes - if(model_.problem().coupled() == true){ - if (porosity + uDiv < 1e-3*porosity){ - DUNE_THROW(NumericalProblem, "volume change too large"); - } - else - // this equation would be correct if the bulk volume could change (Vol_new = Vol_init * (1+div u)), however, we - // have a constant bulk volume therefore we should apply phi_eff = phi_init + div u - // but this causes convergence problems. Since div u is very small here the chosen relation is - // assumed to be a good approximation - porosityEff = (porosity + uDiv)/(1.0 + uDiv); - } - // neglect deformation induced porosity changes - else - porosityEff = porosity; - - // fill primary variable vector for current quadrature point - PrimaryVariables primVars; - - primVars[wPhaseIdx] = pw; - primVars[nPhaseIdx] = sn; - primVars[Indices::uxIdx] = ux; - if (dim > 1) - primVars[Indices::uyIdx] = uy; - if (dim > 2) - primVars[Indices::uzIdx] = uz; - - VolumeVariables volVars; - // evaluate volume variables for this quadrature point - // NOTE: this overwrites the entries of the volumevariables of node 0 - // and can cause errors - volVars.update(primVars, model_.problem(), eg.entity(), fvGeometry, 0, false); - - // calculate the density difference for the gravity term - RF rhoDiff = volVars.density(nPhaseIdx) - volVars.density(wPhaseIdx); - - // geometric weight need for quadrature rule evaluation (numerical integration) - RF qWeight = it->weight() * geometry.integrationElement(it->position()); - - // evaluate basis functions - std::vector vBasis(dispSize); - displacementLFS.child(0).finiteElement().localBasis().evaluateFunction(it->position(), vBasis); - - for(int coordDir = 0; coordDir < dim; ++coordDir) { - const DisplacementScalarLFS& uLFS = displacementLFS.child(coordDir); - // assemble momentum balance equation - for (size_t i = 0; i < dispSize; i++){ - // multiply effective stress with gradient of weighting function and geometric weight of quadrature rule - Scalar tmp = (effStress[coordDir] * vGrad[i]) * qWeight; - r.rawAccumulate(uLFS,i,tmp); - - // subtract effective pressure change contribution multiplied with gradient of weighting function - // and geometric weight of quadrature rule (soil mechanics sign conventions, compressive stresses are negative) - tmp = -(pEff * vGrad[i][coordDir]) * qWeight; - r.rawAccumulate(uLFS,i,tmp); - - // evaluate gravity term (soil mechanics sign conventions, compressive stresses are negative) - // multiplied with weighting function and geometric weight of quadrature rule. - // This assumes that the solid phase density remains constant, that the changes in porosity are very small, - // and that the density of the brine phase remains constant - tmp = sn*porosityEff*rhoDiff*model_.problem().gravity()[coordDir]*vBasis[i]* qWeight; - r.rawAccumulate(uLFS,i,tmp); - } - } - } - // include boundary conditions - // iterate over element intersections of codim dim-1 - for (const auto& intersection : intersections(model_.problem().gridView(), eg.entity())) - { - // handle only faces on the boundary - if (!intersection.boundary()) - continue; - - // select quadrature rule for intersection faces (dim-1) - Dune::GeometryType gtface = intersection.geometryInInside().type(); - const Dune::QuadratureRule& faceRule = Dune::QuadratureRules::rule(gtface,qorder); - - // get face index of this intersection - int fIdx = intersection.indexInInside(); - // get dimension of face - const int dimIs = Dune::PDELab::IntersectionGeometry::Entity::Geometry::mydimension; - - // get reference element for intersection geometry (reference element for face if dim = 3) - const Dune::ReferenceElement& refElement = Dune::ReferenceElements::general(geomType); - // get reference element for edges of intersection geometry (reference element for edge if dim = 3), needed for Dirichlet BC - const Dune::ReferenceElement &face_refElement = - Dune::ReferenceElements::general(intersection.geometryInInside().type()); - - // Treat Neumann boundary conditions - // loop over quadrature points and integrate normal stress changes (traction changes) - for (typename Dune::QuadratureRule::const_iterator it=faceRule.begin(); it!=faceRule.end(); ++it) - { - // position of quadrature point in local coordinates of element - DimVector local = intersection.geometryInInside().global(it->position()); - - GlobalPosition globalPos = geometry.global(local); - - // evaluate boundary condition type - BoundaryTypes boundaryTypes; - model_.problem().boundaryTypesAtPos(boundaryTypes, globalPos); - - // skip rest if we are on Dirichlet boundary - if (!boundaryTypes.hasNeumann()) - continue; - - // evaluate basis functions of all all element vertices for quadrature point location "local" - std::vector vBasis(dispSize); - displacementLFS.child(0).finiteElement().localBasis().evaluateFunction(local, vBasis); - - // evaluate stress boundary condition. The stress change is assumed to be in normal direction (i.e. traction) - PrimaryVariables traction; - model_.problem().neumannAtPos(traction, globalPos); - - // get quadrature rule weight for intersection - const RF qWeight = it->weight() * intersection.geometry().integrationElement(it->position()); - - for(unsigned int coordDir=0; coordDir(fIdx).global(face_refElement.position(j, codim-1)); - - GlobalPosition globalPos = geometry.global(local); - - // evaluate boundary condition type - BoundaryTypes boundaryTypes; - model_.problem().boundaryTypesAtPos(boundaryTypes, globalPos); - - if (boundaryTypes.isDirichlet(Indices::u(coordDir))) - { - // set value of dirichlet BC - PrimaryVariables dirichletValues; - model_.problem().dirichletAtPos(dirichletValues, globalPos); - // retrieve residual value which has already been calculated for the given vertex before it - // was clear that we are on a Dirichlet boundary - Scalar tmpResVal = r.container().base()[(numEq-dim)*dispSize + coordDir*dispSize + i]; - // subtract the dirichletValue and the stored residual value from the solution vector entry - // if the solution vector entry equals the dirichletValue the residual will be zero - Scalar tmp = x(uLFS,i) - dirichletValues[Indices::u(coordDir)] - tmpResVal; - // write result into the residual vector - r.rawAccumulate(uLFS,i,tmp); - } - } - } - } - } - } - } - - /*! - * \brief Jacobian of volume term - * - * \tparam EG The entity geometry type from PDELab - * \tparam LFSU The type of the local function space of the ansatz functions - * \tparam X The type of the container for the coefficients for the ansatz functions - * \tparam LFSV The type of the local function space of the test functions - * \tparam M The matrix type - * - * \param eg The entity geometry object - * \param lfsu The local function space object of the ansatz functions - * \param x The object of the container for the coefficients for the ansatz functions - * \param lfsv The local function space object of the test functions - * \param mat The object containing the local jacobian matrix - */ - template - void jacobian_volume (const EG& eg, - const LFSU& lfsu, - const X& x, - const LFSV& lfsv, - M& mat) const - { - typedef typename LFSU::Traits::SizeType size_type; - - model_.localJacobian().assemble(eg.entity()); - // pressure and saturation local function space (mass balance equations) - typedef typename LFSU::template Child<0>::Type PressSatLFS; - typedef typename PressSatLFS::template Child<0>::Type PressLFS; - const PressSatLFS& pressSatLFS = lfsu.template child<0>(); - const PressLFS& pressLFS = pressSatLFS.template child<0>(); - typedef typename PressSatLFS::template Child<1>::Type SatLFS; - const SatLFS& satLFS = pressSatLFS.template child<1>(); - // local function space for solid displacement - typedef typename LFSU::template Child<1>::Type DisplacementLFS; - typedef typename DisplacementLFS::template Child<0>::Type DisplacementScalarLFS; - const DisplacementLFS& displacementLFS = lfsu.template child<1>(); - - // type of local residual vector - typedef typename M::value_type R; - typedef Dune::PDELab::LocalVector LocalResidualVector; - typedef Dune::PDELab::WeightedVectorAccumulationView ResidualView; - - unsigned int numScv = eg.entity().subEntities(dim); - - // loop over all degrees of freedom of the current element - for (size_type j = 0; j < numScv*numEq; j++) - { - // assemble entries for mass balance equations - for (size_type i = 0; i < (numEq-dim)*numScv; i++) - { - // local jacobian value of location idxI=i%numScv, idxJ=j%numScv for equation i/numScv and unknown j/numScv - Scalar tmp = (model_.localJacobian().mat(i%numScv,j%numScv))[i/numScv][j/numScv]; - // mass balance entries for pressure - if (j < numScv){ - if(i < numScv) - mat.rawAccumulate(pressLFS,i,pressLFS,j,tmp); - else - mat.rawAccumulate(satLFS,i-numScv,pressLFS,j,tmp); - } - // mass balance entries for saturation - else if (j < 2*numScv){ - if(i < numScv) - mat.rawAccumulate(pressLFS,i,satLFS,j-numScv,tmp); - else - mat.rawAccumulate(satLFS,i-numScv,satLFS,j-numScv,tmp); - } - // mass balance entries for solid displacement in x-direction - else if (j < 3*numScv) - { - const DisplacementScalarLFS& uScalarLFS = displacementLFS.template child<0>(); - if(i < numScv) - mat.rawAccumulate(pressLFS,i,uScalarLFS,j-2*numScv,tmp); - else - mat.rawAccumulate(satLFS,i-numScv,uScalarLFS,j-2*numScv,tmp); - } - // mass balance entries for solid displacement in y-direction - else if (j < 4*numScv && dim >=2) - { - const DisplacementScalarLFS& uScalarLFS = displacementLFS.template child<1>(); - if(i < numScv) - mat.rawAccumulate(pressLFS,i,uScalarLFS,j-3*numScv,tmp); - else - mat.rawAccumulate(satLFS,i-numScv,uScalarLFS,j-3*numScv,tmp); - } - // mass balance entries for solid displacement in z-direction - else if(j < 5*numScv && dim >=3) - { - const DisplacementScalarLFS& uScalarLFS = displacementLFS.template child(); - if(i < numScv) - mat.rawAccumulate(pressLFS,i,uScalarLFS,j-(numEq-1)*numScv,tmp); - else - mat.rawAccumulate(satLFS,i-numScv,uScalarLFS,j-(numEq-1)*numScv,tmp); - } - - } - } - - // calculate local jacobian entries and assemble for momentum balance equation - const int m=lfsv.size(); - const int n=lfsu.size(); - - X u(x); - LocalResidualVector down(mat.nrows(),0); - - // evaluate momentum residual for momentum balance equation - ResidualView downView = down.weightedAccumulationView(1.0); - alphaMomentum(eg, lfsu, u, lfsv, downView); - - // loop over all columns (number of element vertices * number of equations) - using std::abs; - for (int j = 0; j < n; j++) - { - // vary the solution vector entry (lfsu,j) by a small value delta (forward differencing) - // this comprises presure, saturation, ux, uy and uz - Scalar delta = 1e-4*(1.0+abs(u(lfsu,j))); - u(lfsu,j) += delta; - - // evaluate momentum balance residual for the varied solution vector - LocalResidualVector up(mat.nrows(), 0); - ResidualView upView = up.weightedAccumulationView(1.0); - alphaMomentum(eg, lfsu, u, lfsv, upView); - - // calculate partial derivative for momentum balance equations and assemble - for (int i = (numEq-dim)*numScv; i < m; i++) - { - Scalar entry = (up(lfsv, i) - down(lfsv, i))/delta; - // accumulate resulting partial derivatives into jacobian - mat.rawAccumulate(lfsv,i, lfsu,j,entry); - } - - // reset solution - u(lfsu,j) = x(lfsu,j); - } - } - -private: - Model& model_; -}; - -} // namespace PDELab -} // namespace Dumux - -#endif diff --git a/dumux/geomechanics/el2p/localresidual.hh b/dumux/geomechanics/el2p/localresidual.hh deleted file mode 100644 index 1896555fbd3eb11e975c63bc4e1da94a12d49573..0000000000000000000000000000000000000000 --- a/dumux/geomechanics/el2p/localresidual.hh +++ /dev/null @@ -1,233 +0,0 @@ -// -*- mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- -// vi: set et ts=4 sw=4 sts=4: -/***************************************************************************** - * See the file COPYING for full copying permissions. * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 2 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program. If not, see . * - *****************************************************************************/ -/*! - * \file - * - * \brief Element-wise calculation of the residual for the linear elastic, - * two-phase model in the fully implicit scheme. - */ -#ifndef DUMUX_ELASTIC2P_LOCAL_RESIDUAL_HH -#define DUMUX_ELASTIC2P_LOCAL_RESIDUAL_HH - -#include -#include "properties.hh" - -namespace Dumux { -/*! - * \ingroup ElTwoPModel - * \ingroup ImplicitLocalResidual - * - * \brief Element-wise calculation of the Jacobian matrix for problems - * using the two-phase linear-elasticity fully implicit model. - */ -template -class ElTwoPLocalResidual: public BoxLocalResidual { -protected: - typedef typename GET_PROP_TYPE(TypeTag, LocalResidual) Implementation; - typedef typename GET_PROP_TYPE(TypeTag, Scalar) Scalar; - typedef typename GET_PROP_TYPE(TypeTag, GridView) GridView; - - enum { - dim = GridView::dimension - }; - - typedef Dune::FieldMatrix DimMatrix; - typedef Dune::FieldVector DimVector; - - typedef typename GET_PROP_TYPE(TypeTag, VolumeVariables) VolumeVariables; - typedef typename GET_PROP_TYPE(TypeTag, FluxVariables) FluxVariables; - typedef typename GET_PROP_TYPE(TypeTag, PrimaryVariables) PrimaryVariables; - typedef typename GET_PROP_TYPE(TypeTag, ElementVolumeVariables) ElementVolumeVariables; - typedef typename GET_PROP_TYPE(TypeTag, Indices) Indices; - typedef typename GET_PROP_TYPE(TypeTag, EffectivePermeabilityModel) EffectivePermeabilityModel; - - enum { - numFluidPhases = GET_PROP_VALUE(TypeTag, NumPhases) - }; - enum { - contiWEqIdx = Indices::contiWEqIdx, - contiNEqIdx = Indices::contiNEqIdx, - wPhaseIdx = Indices::wPhaseIdx, - nPhaseIdx = Indices::nPhaseIdx - }; - -public: - /*! - * \brief Constructor. Sets the upwind weight. - */ - ElTwoPLocalResidual() { - // retrieve the upwind weight for the mass conservation equations. Use the value - // specified via the property system as default, and overwrite - // it by the run-time parameter from the Dune::ParameterTree - massUpwindWeight_ = GET_PARAM_FROM_GROUP(TypeTag, Scalar, Implicit, - MassUpwindWeight); - } - ; - - /*! - * \brief Evaluate the amount all conservation quantities - * (e.g. phase mass) within a finite sub-control volume. - * - * \param storage The phase mass within the sub-control volume - * \param scvIdx The SCV (sub-control-volume) index - * \param usePrevSol Evaluate function with solution of current or previous time step - */ - void computeStorage(PrimaryVariables &storage, int scvIdx, - bool usePrevSol) const { - // if flag usePrevSol is set, the solution from the previous - // time step is used, otherwise the current solution is - // used. The secondary variables are used accordingly. This - // is required to compute the derivative of the storage term - // using the implicit Euler method. - const ElementVolumeVariables &elemVolVars = - usePrevSol ? this->prevVolVars_() : this->curVolVars_(); - const VolumeVariables &volVars = elemVolVars[scvIdx]; - - storage = Scalar(0); - - // wetting phase mass - storage[contiWEqIdx] = volVars.density(wPhaseIdx) - * volVars.saturation(wPhaseIdx) * volVars.effPorosity; - // non-wetting phase mass - storage[contiNEqIdx] = volVars.density(nPhaseIdx) - * volVars.saturation(nPhaseIdx) * volVars.effPorosity; - } - - /*! - * \brief Evaluates the mass flux over a face of a sub-control - * volume. - * - * \param flux The flux over the SCV (sub-control-volume) face for each phase - * \param fIdx The index of the SCV face - * \param onBoundary A boolean variable to specify whether the flux variables - * are calculated for interior SCV faces or boundary faces, default=false - */ - void computeFlux(PrimaryVariables &flux, int fIdx, const bool onBoundary = false) const - { - FluxVariables fluxVars; - fluxVars.update(this->problem_(), - this->element_(), - this->fvGeometry_(), - fIdx, - this->curVolVars_()); - - flux = 0; - this->computeAdvectiveFlux(flux, fluxVars); - } - - /*! - * \brief Evaluates the advective mass flux of all components over - * a face of a sub-control volume. - * - * \param flux The advective flux over the sub-control-volume face for each phase - * \param fluxVars The flux variables at the current SCV - * - * This method is called by compute flux and is mainly there for - * derived models to ease adding equations selectively. - */ - void computeAdvectiveFlux(PrimaryVariables &flux, - const FluxVariables &fluxVars) const { - // calculate effective permeability based on effective porosity - // according to the relation given in Rutqvist and Tsang (2002) - // this evaluation should be moved to another location - DimVector tmpVec; - - DimMatrix Keff, Keff_i, Keff_j; - Keff_i = EffectivePermeabilityModel::effectivePermeability(this->curVolVars_()[fluxVars.face().i], - this->problem_().spatialParams(), - this->element_(), - this->fvGeometry_(), - fluxVars.face().i); - Keff_j = EffectivePermeabilityModel::effectivePermeability(this->curVolVars_()[fluxVars.face().j], - this->problem_().spatialParams(), - this->element_(), - this->fvGeometry_(), - fluxVars.face().j); - - this->problem_().spatialParams().meanK(Keff, Keff_i, Keff_j); - // loop over all phases - for (int phaseIdx = 0; phaseIdx < numFluidPhases; ++phaseIdx) { - // data attached to upstream and the downstream vertices - // of the current phase - // calculate the flux in the normal direction of the - // current sub control volume face - - // if geomechanical feedback on flow is taken into account the effective permeability is - // applied for the flux calculations - if (this->problem_().coupled() == true) { - Keff.mv(fluxVars.potentialGrad(phaseIdx), tmpVec); - } else { - fluxVars.intrinsicPermeability().mv( - fluxVars.potentialGrad(phaseIdx), tmpVec); - } - Scalar normalFlux = -(tmpVec * fluxVars.face().normal); - - // data attached to upstream and the downstream vertices - // of the current phase - const VolumeVariables &up = this->curVolVars_( - fluxVars.upstreamIdx(phaseIdx)); - const VolumeVariables &dn = this->curVolVars_( - fluxVars.downstreamIdx(phaseIdx)); - - // add advective flux of current phase - int eqIdx = (phaseIdx == wPhaseIdx) ? contiWEqIdx : contiNEqIdx; - flux[eqIdx] += normalFlux - * ((massUpwindWeight_) * up.density(phaseIdx) - * up.mobility(phaseIdx) - + (massUpwindWeight_) * dn.density(phaseIdx) - * dn.mobility(phaseIdx)); - - // if geomechanical feedback on flow is taken into account add the flux contribution - // of the displacement velocity - - if (this->problem_().coupled() == true) { - // use upwind displacement velocity to calculate phase transport (?) - flux[eqIdx] += up.effPorosity * up.saturation(phaseIdx) - * up.density(phaseIdx) * fluxVars.timeDerivUNormal(); - } - - } - } - - /*! - * \brief Calculate the source term of the equation - * - * \param q The source/sink in the SCV for each phase - * \param scvIdx The index of the SCV - * - */ - void computeSource(PrimaryVariables &q, int scvIdx) { - // retrieve the source term intrinsic to the problem - this->problem_().source(q, this->element_(), this->fvGeometry_(), - scvIdx); - } - -protected: - Implementation *asImp_() { - return static_cast(this); - } - const Implementation *asImp_() const { - return static_cast(this); - } - -private: - Scalar massUpwindWeight_; -}; -} -#endif diff --git a/dumux/geomechanics/el2p/model.hh b/dumux/geomechanics/el2p/model.hh deleted file mode 100644 index 19a8610d6e6a1a39f09bad42325a4a18f8667cc6..0000000000000000000000000000000000000000 --- a/dumux/geomechanics/el2p/model.hh +++ /dev/null @@ -1,717 +0,0 @@ -// -*- mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- -// vi: set et ts=4 sw=4 sts=4: -/***************************************************************************** - * See the file COPYING for full copying permissions. * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 2 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program. If not, see . * - *****************************************************************************/ - -/*! -* \file -* -* \brief Adaption of the fully implicit scheme to the two-phase linear elasticity model. -*/ - -#ifndef DUMUX_ELASTIC2P_MODEL_HH -#define DUMUX_ELASTIC2P_MODEL_HH - -#include -#include -#include "properties.hh" - -namespace Dumux { - -namespace Properties { -NEW_PROP_TAG(InitialDisplacement); //!< The initial displacement function -NEW_PROP_TAG(InitialPressSat); //!< The initial pressure and saturation function -} - -/*! - * \ingroup ElTwoPBoxModel - * \brief Adaption of the fully implicit scheme to the two-phase linear elasticity model. - * - * This model implements a two-phase flow of compressible immiscible fluids \f$\alpha \in \{ w, n \}\f$. - * The deformation of the solid matrix is described with a quasi-stationary momentum balance equation. - * The influence of the pore fluid is accounted for through the effective stress concept (Biot 1941). - * The total stress acting on a rock is partially supported by the rock matrix and partially supported - * by the pore fluid. The effective stress represents the share of the total stress which is supported - * by the solid rock matrix and can be determined as a function of the strain according to Hooke's law. - * - * As an equation for the conservation of momentum within the fluid phases the standard multiphase Darcy's approach is used: - \f[ - v_\alpha = - \frac{k_{r\alpha}}{\mu_\alpha} \textbf{K} - \left(\textbf{grad}\, p_\alpha - \varrho_{\alpha} {\textbf g} \right) - \f] - * - * Gravity can be enabled or disabled via the property system. - * By inserting this into the continuity equation, one gets -\f[ - \frac{\partial \phi_{eff} \varrho_\alpha S_\alpha}{\partial t} - - \text{div} \left\{ \varrho_\alpha \frac{k_{r\alpha}}{\mu_\alpha} - \mathbf{K}_\text{eff} \left(\textbf{grad}\, p_\alpha - \varrho_{\alpha} \mathbf{g} \right) - - \phi_{eff} \varrho_\alpha S_\alpha \frac{\partial \mathbf{u}}{\partial t} - \right\} - q_\alpha = 0 \;, - \f] - * - * - * A quasi-stationary momentum balance equation is solved for the changes with respect to the initial conditions (Darcis 2012), note - * that this implementation assumes the soil mechanics sign convention (i.e. compressive stresses are negative): - \f[ - \text{div}\left( \boldsymbol{\Delta \sigma'}- \Delta p_{eff} \boldsymbol{I} \right) + \Delta \varrho_b {\textbf g} = 0 \;, - \f] - * with the effective stress: - \f[ - \boldsymbol{\sigma'} = 2\,G\,\boldsymbol{\epsilon} + \lambda \,\text{tr} (\boldsymbol{\epsilon}) \, \mathbf{I}. - \f] - * - * and the strain tensor \f$\boldsymbol{\epsilon}\f$ as a function of the solid displacement gradient \f$\textbf{grad} \mathbf{u}\f$: - \f[ - \boldsymbol{\epsilon} = \frac{1}{2} \, (\textbf{grad} \mathbf{u} + \textbf{grad}^T \mathbf{u}). - \f] - * - * Here, the rock mechanics sign convention is switch off which means compressive stresses are < 0 and tensile stresses are > 0. - * The rock mechanics sign convention can be switched on for the vtk output via the property system. - * - * The effective porosity and the effective permeability are calculated as a function of the solid displacement: - \f[ - \phi_{eff} = \frac{\phi_{init} + \text{div} \mathbf{u}}{1 + \text{div} \mathbf{u}} - \f] - \f[ - K_{eff} = K_{init} \text{exp}\left( 22.2(\phi_{eff}/\phi_{init} -1 )\right) - \f] - * The mass balance equations are discretized using a vertex-centered finite volume (box) - * or cell-centered finite volume scheme as spatial and the implicit Euler method as time discretization. - * The momentum balance equations are discretized using a standard Galerkin Finite Element method as - * spatial discretization scheme. - * - * - * The primary variables are the wetting phase pressure \f$p_w\f$, the nonwetting phase saturation \f$S_n\f$ and the solid - * displacement vector \f$\mathbf{u}\f$ (changes in solid displacement with respect to initial conditions). - */ -template -class ElTwoPModel: public GET_PROP_TYPE(TypeTag, BaseModel) -{ - typedef typename GET_PROP_TYPE(TypeTag, FVElementGeometry) FVElementGeometry; - typedef typename GET_PROP_TYPE(TypeTag, ElementVolumeVariables) ElementVolumeVariables; - typedef typename GET_PROP_TYPE(TypeTag, Problem) Problem; - typedef typename GET_PROP_TYPE(TypeTag, Scalar) Scalar; - - typedef typename GET_PROP_TYPE(TypeTag, Indices) Indices; - enum { - numEq = GET_PROP_VALUE(TypeTag, NumEq), - nPhaseIdx = Indices::nPhaseIdx, - wPhaseIdx = Indices::wPhaseIdx - }; - - typedef typename GET_PROP_TYPE(TypeTag, GridView) GridView; - enum { - dim = GridView::dimension, - dimWorld = GridView::dimensionworld - }; - typedef typename GridView::template Codim<0>::Entity Element; - typedef typename Element::Geometry::JacobianInverseTransposed JacobianInverseTransposed; - - typedef Dune::FieldVector GlobalPosition; - typedef Dune::FieldVector DimVector; - typedef Dune::FieldMatrix DimMatrix; - - typedef typename GET_PROP_TYPE(TypeTag, SolutionVector) SolutionVector; - typedef typename GET_PROP_TYPE(TypeTag, GridFunctionSpace) GridFunctionSpace; - typedef Dune::PDELab::LocalFunctionSpace LocalFunctionSpace; - -public: - - /*! - * \brief Write the current solution to a restart file. - * - * \param outStream The output stream of one vertex for the restart file - * \param entity The Entity - * - * Due to the mixed discretization schemes which are combined via pdelab for this model - * the solution vector has a different form than in the pure box models - * it sorts the primary variables in the following way: - * p_vertex0 S_vertex0 p_vertex1 S_vertex1 p_vertex2 ....p_vertexN S_vertexN - * ux_vertex0 uy_vertex0 uz_vertex0 ux_vertex1 uy_vertex1 uz_vertex1 ... - * - * Therefore, the serializeEntity function has to be modified. - */ - template - void serializeEntity(std::ostream &outStream, - const Entity &entity) - { - // vertex index - int dofIdxGlobal = this->dofMapper().index(entity); - - // write phase state - if (!outStream.good()) { - DUNE_THROW(Dune::IOError, - "Could not serialize vertex " - << dofIdxGlobal); - } - int numScv = this->gridView().size(dim); - // get p and S entries for this vertex - for (int eqIdx = 0; eqIdx < numEq-dim; ++eqIdx) { - outStream << this->curSol().base()[dofIdxGlobal*(numEq-dim) + eqIdx][0]<<" "; - } - // get ux, uy, uz entries for this vertex - for (int j = 0; j< dim; ++j) - outStream << this->curSol().base()[numScv*(numEq-dim) + dofIdxGlobal*dim + j][0] <<" "; - - int vIdxGlobal = this->dofMapper().index(entity); - if (!outStream.good()) - DUNE_THROW(Dune::IOError, "Could not serialize vertex " << vIdxGlobal); - } - - /*! - * \brief Reads the current solution for a vertex from a restart - * file. - * - * \param inStream The input stream of one vertex from the restart file - * \param entity The Entity - * - * Due to the mixed discretization schemes which are combined via pdelab for this model - * the solution vector has a different form than in the pure box models - * it sorts the primary variables in the following way: - * p_vertex0 S_vertex0 p_vertex1 S_vertex1 p_vertex2 ....p_vertexN S_vertexN - * ux_vertex0 uy_vertex0 uz_vertex0 ux_vertex1 uy_vertex1 uz_vertex1 ... - * - * Therefore, the deserializeEntity function has to be modified. - */ - template - void deserializeEntity(std::istream &inStream, const Entity &entity) - { - int dofIdxGlobal = this->dofMapper().index(entity); - - if (!inStream.good()){ - DUNE_THROW(Dune::IOError, - "Could not deserialize vertex " - << dofIdxGlobal); - } - int numScv = this->gridView().size(dim); - for (int eqIdx = 0; eqIdx < numEq-dim; ++eqIdx) { - // read p and S entries for this vertex - inStream >> this->curSol().base()[dofIdxGlobal*(numEq-dim) + eqIdx][0];} - for (int j = 0; j< dim; ++j){ - // read ux, uy, uz entries for this vertex - inStream >> this->curSol().base()[numScv*(numEq-dim) + dofIdxGlobal*dim + j][0];} - } - - - /*! - * \brief \copybrief ImplicitModel::addOutputVtkFields - * - * Specialization for the ElOnePTwoCBoxModel, add one-phase two-component - * properties, solid displacement, stresses, effective properties and the - * process rank to the VTK writer. - */ - template - void addOutputVtkFields(const SolutionVector &sol, MultiWriter &writer) { - // check whether compressive stresses are defined to be positive - // (rockMechanicsSignConvention_ == true) or negative - rockMechanicsSignConvention_ = GET_PARAM_FROM_GROUP(TypeTag, bool, Vtk, RockMechanicsSignConvention); - - typedef Dune::BlockVector > ScalarField; - typedef Dune::BlockVector > VectorField; - - // create the required scalar and vector fields - unsigned numVertices = this->gridView_().size(dim); - unsigned numElements = this->gridView_().size(0); - - // create the required fields for vertex data - ScalarField &pw = *writer.allocateManagedBuffer(numVertices); - ScalarField &pn = *writer.allocateManagedBuffer(numVertices); - ScalarField &pc = *writer.allocateManagedBuffer(numVertices); - ScalarField &sw = *writer.allocateManagedBuffer(numVertices); - ScalarField &sn = *writer.allocateManagedBuffer(numVertices); - VectorField &displacement = *writer.template allocateManagedBuffer(numVertices); - ScalarField &rhoW = *writer.allocateManagedBuffer(numVertices); - ScalarField &rhoN = *writer.allocateManagedBuffer(numVertices); - ScalarField &Te = *writer.allocateManagedBuffer(numVertices); - - // create the required fields for element data - // effective stresses - VectorField &deltaEffStressX = *writer.template allocateManagedBuffer(numElements); - VectorField &deltaEffStressY = *writer.template allocateManagedBuffer(numElements); - VectorField &deltaEffStressZ = *writer.template allocateManagedBuffer(numElements); - // total stresses - VectorField &totalStressX = *writer.template allocateManagedBuffer< - Scalar, dim>(numElements); - VectorField &totalStressY = *writer.template allocateManagedBuffer< - Scalar, dim>(numElements); - VectorField &totalStressZ = *writer.template allocateManagedBuffer< - Scalar, dim>(numElements); - // initial stresses - VectorField &initStressX = *writer.template allocateManagedBuffer< - Scalar, dim>(numElements); - VectorField &initStressY = *writer.template allocateManagedBuffer< - Scalar, dim>(numElements); - VectorField &initStressZ = *writer.template allocateManagedBuffer< - Scalar, dim>(numElements); - // principal stresses - ScalarField &principalStress1 = *writer.allocateManagedBuffer( - numElements); - ScalarField &principalStress2 = *writer.allocateManagedBuffer( - numElements); - ScalarField &principalStress3 = *writer.allocateManagedBuffer( - numElements); - - - ScalarField &effKx = *writer.allocateManagedBuffer(numElements); - ScalarField &effPorosity = *writer.allocateManagedBuffer(numElements); - ScalarField &effectivePressure = *writer.allocateManagedBuffer(numElements); - ScalarField &deltaEffPressure = *writer.allocateManagedBuffer(numElements); - - - ScalarField &Pcrtens = *writer.allocateManagedBuffer(numElements); - ScalarField &Pcrshe = *writer.allocateManagedBuffer(numElements); - - // initialize cell stresses, cell-wise hydraulic parameters and cell pressure with zero - - - for (unsigned int eIdx = 0; eIdx < numElements; ++eIdx) { - deltaEffStressX[eIdx] = Scalar(0.0); - if (dim >= 2) - deltaEffStressY[eIdx] = Scalar(0.0); - if (dim >= 3) - deltaEffStressZ[eIdx] = Scalar(0.0); - - totalStressX[eIdx] = Scalar(0.0); - if (dim >= 2) - totalStressY[eIdx] = Scalar(0.0); - if (dim >= 3) - totalStressZ[eIdx] = Scalar(0.0); - - initStressX[eIdx] = Scalar(0.0); - if (dim >= 2) - initStressY[eIdx] = Scalar(0.0); - if (dim >= 3) - initStressZ[eIdx] = Scalar(0.0); - - principalStress1[eIdx] = Scalar(0.0); - if (dim >= 2) - principalStress2[eIdx] = Scalar(0.0); - if (dim >= 3) - principalStress3[eIdx] = Scalar(0.0); - - effPorosity[eIdx] = Scalar(0.0); - effKx[eIdx] = Scalar(0.0); - effectivePressure[eIdx] = Scalar(0.0); - deltaEffPressure[eIdx] = Scalar(0.0); - - Pcrtens[eIdx] = Scalar(0.0); - Pcrshe[eIdx] = Scalar(0.0); - } - - ScalarField &rank = *writer.allocateManagedBuffer(numElements); - - - FVElementGeometry fvGeometry; - ElementVolumeVariables elemVolVars; - - const GridFunctionSpace& gridFunctionSpace = this->problem_().model().jacobianAssembler().gridFunctionSpace(); - const typename GridFunctionSpace::Ordering& ordering = gridFunctionSpace.ordering(); - // initialize start and end of element iterator - // loop over all elements (cells) - for (const auto& element : elements(this->gridView_(), Dune::Partitions::interior)) - { - // get FE function spaces to calculate gradients (gradient data of momentum balance - // equation is not stored in fluxvars since it is not evaluated at box integration point) - // copy the values of the sol vector to the localFunctionSpace values of the current element - LocalFunctionSpace localFunctionSpace(gridFunctionSpace); - localFunctionSpace.bind(element); - std::vector values(localFunctionSpace.size()); - for (typename LocalFunctionSpace::Traits::IndexContainer::size_type k=0; k::Type DisplacementLFS; - const DisplacementLFS& displacementLFS =localFunctionSpace.template child<1>(); - const unsigned int dispSize = displacementLFS.child(0).size(); - typedef typename DisplacementLFS::template Child<0>::Type ScalarDispLFS; - // further types required for gradient calculations - typedef typename ScalarDispLFS::Traits::FiniteElementType::Traits::LocalBasisType::Traits::JacobianType JacobianType_V; - typedef typename ScalarDispLFS::Traits::FiniteElementType::Traits::LocalBasisType::Traits::RangeFieldType RF; - - unsigned int eIdx = this->problem_().model().elementMapper().index(element); - rank[eIdx] = this->gridView_().comm().rank(); - - fvGeometry.update(this->gridView_(), element); - elemVolVars.update(this->problem_(), element, fvGeometry, false); - - // loop over all local vertices of the cell - int numScv = element.subEntities(dim); - - for (int scvIdx = 0; scvIdx < numScv; ++scvIdx) - { - unsigned int vIdxGlobal = this->dofMapper().subIndex(element, scvIdx, dim); - - Te[vIdxGlobal] = elemVolVars[scvIdx].temperature(); - pw[vIdxGlobal] = elemVolVars[scvIdx].pressure(wPhaseIdx); - pn[vIdxGlobal] = elemVolVars[scvIdx].pressure(nPhaseIdx); - pc[vIdxGlobal] = elemVolVars[scvIdx].capillaryPressure(); - sw[vIdxGlobal] = elemVolVars[scvIdx].saturation(wPhaseIdx); - sn[vIdxGlobal] = elemVolVars[scvIdx].saturation(nPhaseIdx); - rhoW[vIdxGlobal] = elemVolVars[scvIdx].density(wPhaseIdx); - rhoN[vIdxGlobal] = elemVolVars[scvIdx].density(nPhaseIdx); - // the following lines are correct for rock mechanics sign convention - // but lead to a very counter-intuitive output therefore, they are commented. - // in case of rock mechanics sign convention solid displacement is - // defined to be negative if it points in positive coordinate direction -// if(rockMechanicsSignConvention_){ -// DimVector tmpDispl; -// tmpDispl = Scalar(0); -// tmpDispl -= elemVolVars[scvIdx].displacement(); -// displacement[vIdxGlobal] = tmpDispl; -// } -// -// else - displacement[vIdxGlobal] = elemVolVars[scvIdx].displacement(); - - double Keff; - double exponent; - exponent = 22.2 * (elemVolVars[scvIdx].effPorosity - / elemVolVars[scvIdx].porosity() - 1); - Keff = this->problem_().spatialParams().intrinsicPermeability( element, fvGeometry, scvIdx)[0][0]; - using std::exp; - Keff *= exp(exponent); - effKx[eIdx] += Keff/ numScv; - effectivePressure[eIdx] += (pn[vIdxGlobal] * sn[vIdxGlobal] - + pw[vIdxGlobal] * sw[vIdxGlobal]) - / numScv; - effPorosity[eIdx] +=elemVolVars[scvIdx].effPorosity / numScv; - }; - - const auto geometry = element.geometry(); - - const GlobalPosition& cellCenter = geometry.center(); - const GlobalPosition& cellCenterLocal = geometry.local(cellCenter); - - deltaEffPressure[eIdx] = effectivePressure[eIdx] + this->problem().pInit(cellCenter, cellCenterLocal, element); - // determin changes in effective stress from current solution - // evaluate gradient of displacement shape functions - std::vector vRefShapeGradient(dispSize); - displacementLFS.child(0).finiteElement().localBasis().evaluateJacobian(cellCenterLocal, vRefShapeGradient); - - // get jacobian to transform the gradient to physical element - const JacobianInverseTransposed jacInvT = geometry.jacobianInverseTransposed(cellCenterLocal); - std::vector < Dune::FieldVector > vShapeGradient(dispSize); - for (size_t i = 0; i < dispSize; i++) { - vShapeGradient[i] = 0.0; - jacInvT.umv(vRefShapeGradient[i][0], vShapeGradient[i]); - } - // calculate gradient of current displacement - typedef Dune::FieldMatrix DimMatrix; - DimMatrix uGradient(0.0); - for (int coordDir = 0; coordDir < dim; ++coordDir) { - const ScalarDispLFS & scalarDispLFS = displacementLFS.child(coordDir); - - for (size_t i = 0; i < scalarDispLFS.size(); i++) - uGradient[coordDir].axpy(values[scalarDispLFS.localIndex(i)],vShapeGradient[i]); - } - - const Dune::FieldVector lameParams = this->problem_().spatialParams().lameParams(element,fvGeometry, 0); - const Scalar lambda = lameParams[0]; - const Scalar mu = lameParams[1]; - - // calculate strain tensor - Dune::FieldMatrix epsilon; - for (int i = 0; i < dim; ++i) - for (int j = 0; j < dim; ++j) - epsilon[i][j] = 0.5 * (uGradient[i][j] + uGradient[j][i]); - - RF traceEpsilon = 0; - for (int i = 0; i < dim; ++i) - traceEpsilon += epsilon[i][i]; - - // calculate effective stress tensor - Dune::FieldMatrix sigma(0.0); - for (int i = 0; i < dim; ++i) { - sigma[i][i] = lambda * traceEpsilon; - for (int j = 0; j < dim; ++j) - sigma[i][j] += 2.0 * mu * epsilon[i][j]; - } - - // in case of rock mechanics sign convention compressive stresses - // are defined to be positive - if(rockMechanicsSignConvention_){ - deltaEffStressX[eIdx] -= sigma[0]; - if (dim >= 2) { - deltaEffStressY[eIdx] -= sigma[1]; - } - if (dim >= 3) { - deltaEffStressZ[eIdx] -= sigma[2]; - } - } - else{ - deltaEffStressX[eIdx] = sigma[0]; - if (dim >= 2) { - deltaEffStressY[eIdx] = sigma[1]; - } - if (dim >= 3) { - deltaEffStressZ[eIdx] = sigma[2]; - } - } - - // retrieve prescribed initial stresses from problem file - DimVector tmpInitStress = this->problem_().initialStress(cellCenter, 0); - if(rockMechanicsSignConvention_){ - initStressX[eIdx][0] = tmpInitStress[0]; - if (dim >= 2) { - initStressY[eIdx][1] = tmpInitStress[1]; - } - if (dim >= 3) { - initStressZ[eIdx][2] = tmpInitStress[2]; - } - } - else{ - initStressX[eIdx][0] -= tmpInitStress[0]; - if (dim >= 2) { - initStressY[eIdx][1] -= tmpInitStress[1]; - } - if (dim >= 3) { - initStressZ[eIdx][2] -= tmpInitStress[2]; - } - } - - // calculate total stresses - // in case of rock mechanics sign convention compressive stresses - // are defined to be positive and total stress is calculated by adding the pore pressure - if(rockMechanicsSignConvention_){ - totalStressX[eIdx][0] = initStressX[eIdx][0] + deltaEffStressX[eIdx][0] + deltaEffPressure[eIdx]; - if (dim >= 2) { - totalStressX[eIdx][1] = initStressX[eIdx][1] + deltaEffStressX[eIdx][1]; - totalStressY[eIdx][0] = initStressY[eIdx][0] + deltaEffStressY[eIdx][0]; - totalStressY[eIdx][1] = initStressY[eIdx][1] + deltaEffStressY[eIdx][1] + deltaEffPressure[eIdx]; - } - if (dim >= 3) { - totalStressX[eIdx][2] = initStressX[eIdx][2] + deltaEffStressX[eIdx][2]; - totalStressY[eIdx][2] = initStressY[eIdx][2] + deltaEffStressY[eIdx][2]; - totalStressZ[eIdx][0] = initStressZ[eIdx][0] + deltaEffStressZ[eIdx][0]; - totalStressZ[eIdx][1] = initStressZ[eIdx][1] + deltaEffStressZ[eIdx][1]; - totalStressZ[eIdx][2] = initStressZ[eIdx][2] + deltaEffStressZ[eIdx][2] + deltaEffPressure[eIdx]; - } - } - else{ - totalStressX[eIdx][0] = initStressX[eIdx][0] + deltaEffStressX[eIdx][0] - deltaEffPressure[eIdx]; - if (dim >= 2) { - totalStressX[eIdx][1] = initStressX[eIdx][1] + deltaEffStressX[eIdx][1]; - totalStressY[eIdx][0] = initStressY[eIdx][0] + deltaEffStressY[eIdx][0]; - totalStressY[eIdx][1] = initStressY[eIdx][1] + deltaEffStressY[eIdx][1] - deltaEffPressure[eIdx]; - } - if (dim >= 3) { - totalStressX[eIdx][2] = initStressX[eIdx][2] + deltaEffStressX[eIdx][2]; - totalStressY[eIdx][2] = initStressY[eIdx][2] + deltaEffStressY[eIdx][2]; - totalStressZ[eIdx][0] = initStressZ[eIdx][0] + deltaEffStressZ[eIdx][0]; - totalStressZ[eIdx][1] = initStressZ[eIdx][1] + deltaEffStressZ[eIdx][1]; - totalStressZ[eIdx][2] = initStressZ[eIdx][2] + deltaEffStressZ[eIdx][2] - deltaEffPressure[eIdx]; - } - } - } - - // calculate principal stresses i.e. the eigenvalues of the total stress tensor - Scalar a1, a2, a3; - DimMatrix totalStress; - DimVector eigenValues; - - for (unsigned int eIdx = 0; eIdx < numElements; eIdx++) - { - eigenValues = Scalar(0); - totalStress = Scalar(0); - - totalStress[0] = totalStressX[eIdx]; - if (dim >= 2) - totalStress[1] = totalStressY[eIdx]; - if (dim >= 3) - totalStress[2] = totalStressZ[eIdx]; - - calculateEigenValues(eigenValues, totalStress); - - - for (int i = 0; i < dim; i++) - { - using std::isnan; - if (isnan(eigenValues[i])) - eigenValues[i] = 0.0; - } - - // sort principal stresses: principalStress1 >= principalStress2 >= principalStress3 - if (dim == 2) { - a1 = eigenValues[0]; - a2 = eigenValues[1]; - - if (a1 >= a2) { - principalStress1[eIdx] = a1; - principalStress2[eIdx] = a2; - } else { - principalStress1[eIdx] = a2; - principalStress2[eIdx] = a1; - } - } - - if (dim == 3) { - a1 = eigenValues[0]; - a2 = eigenValues[1]; - a3 = eigenValues[2]; - - if (a1 >= a2) { - if (a1 >= a3) { - principalStress1[eIdx] = a1; - if (a2 >= a3) { - principalStress2[eIdx] = a2; - principalStress3[eIdx] = a3; - } - else //a3 > a2 - { - principalStress2[eIdx] = a3; - principalStress3[eIdx] = a2; - } - } - else // a3 > a1 - { - principalStress1[eIdx] = a3; - principalStress2[eIdx] = a1; - principalStress3[eIdx] = a2; - } - } else // a2>a1 - { - if (a2 >= a3) { - principalStress1[eIdx] = a2; - if (a1 >= a3) { - principalStress2[eIdx] = a1; - principalStress3[eIdx] = a3; - } - else //a3>a1 - { - principalStress2[eIdx] = a3; - principalStress3[eIdx] = a1; - } - } - else //a3>a2 - { - principalStress1[eIdx] = a3; - principalStress2[eIdx] = a2; - principalStress3[eIdx] = a1; - } - } - } - Scalar taum = 0.0; - Scalar sigmam = 0.0; - Scalar Peff = effectivePressure[eIdx]; - - Scalar theta = M_PI / 6; - Scalar S0 = 0.0; - taum = (principalStress1[eIdx] - principalStress3[eIdx]) / 2; - sigmam = (principalStress1[eIdx] + principalStress3[eIdx]) / 2; - - using std::abs; - using std::sin; - using std::cos; - Scalar Psc = -abs(taum) / sin(theta) + S0 * cos(theta) / sin(theta) - + sigmam; - // Pressure margins according to J. Rutqvist et al. / International Journal of Rock Mecahnics & Mining Sciences 45 (2008), 132-143 - Pcrtens[eIdx] = Peff - principalStress3[eIdx]; - Pcrshe[eIdx] = Peff - Psc; - - } - - writer.attachVertexData(Te, "T"); - writer.attachVertexData(pw, "pW"); - writer.attachVertexData(pn, "pN"); - writer.attachVertexData(pc, "pC"); - writer.attachVertexData(sw, "SW"); - writer.attachVertexData(sn, "SN"); - writer.attachVertexData(rhoW, "rhoW"); - writer.attachVertexData(rhoN, "rhoN"); - writer.attachVertexData(displacement, "u", dim); - - writer.attachCellData(deltaEffStressX, "effective stress changes X", dim); - if (dim >= 2) - writer.attachCellData(deltaEffStressY, "effective stress changes Y", dim); - if (dim >= 3) - writer.attachCellData(deltaEffStressZ, "effective stress changes Z", dim); - - writer.attachCellData(principalStress1, "principal stress 1"); - if (dim >= 2) - writer.attachCellData(principalStress2, "principal stress 2"); - if (dim >= 3) - writer.attachCellData(principalStress3, "principal stress 3"); - - writer.attachCellData(totalStressX, "total stresses X", dim); - if (dim >= 2) - writer.attachCellData(totalStressY, "total stresses Y", dim); - if (dim >= 3) - writer.attachCellData(totalStressZ, "total stresses Z", dim); - - writer.attachCellData(initStressX, "initial stresses X", dim); - if (dim >= 2) - writer.attachCellData(initStressY, "initial stresses Y", dim); - if (dim >= 3) - writer.attachCellData(initStressZ, "initial stresses Z", dim); - - writer.attachCellData(deltaEffPressure, "delta pEff"); - writer.attachCellData(effectivePressure, "effectivePressure"); - writer.attachCellData(Pcrtens, "Pcr_tensile"); - writer.attachCellData(Pcrshe, "Pcr_shear"); - writer.attachCellData(effKx, "effective Kxx"); - writer.attachCellData(effPorosity, "effective Porosity"); - - - } - - /*! - * \brief Applies the initial solution for all vertices of the grid. - */ - void applyInitialSolution_() { - typedef typename GET_PROP_TYPE(TypeTag, InitialPressSat) InitialPressSat; - InitialPressSat initialPressSat(this->problem_().gridView()); - std::cout << "el2pmodel calls: initialPressSat" << std::endl; - initialPressSat.setPressure(this->problem_().pInit()); - - typedef typename GET_PROP_TYPE(TypeTag, InitialDisplacement) InitialDisplacement; - InitialDisplacement initialDisplacement(this->problem_().gridView()); - - typedef Dune::PDELab::CompositeGridFunction InitialSolution; - InitialSolution initialSolution(initialPressSat, initialDisplacement); - - int numDofs = this->jacobianAssembler().gridFunctionSpace().size(); - //this->curSol().resize(numDofs); - //this->prevSol().resize(numDofs); - std::cout << "numDofs = " << numDofs << std::endl; - - Dune::PDELab::interpolate(initialSolution, - this->jacobianAssembler().gridFunctionSpace(), this->curSol()); - Dune::PDELab::interpolate(initialSolution, - this->jacobianAssembler().gridFunctionSpace(), this->prevSol()); - } - - const Problem& problem() const { - return this->problem_(); - } - -private: - bool rockMechanicsSignConvention_; - -}; -} -#include "propertydefaults.hh" -#endif diff --git a/dumux/geomechanics/el2p/newtoncontroller.hh b/dumux/geomechanics/el2p/newtoncontroller.hh deleted file mode 100644 index ddc648b5afe25d3092e26ff67f877189235af59f..0000000000000000000000000000000000000000 --- a/dumux/geomechanics/el2p/newtoncontroller.hh +++ /dev/null @@ -1,176 +0,0 @@ -// -*- mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- -// vi: set et ts=4 sw=4 sts=4: -/***************************************************************************** - * See the file COPYING for full copying permissions. * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 2 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program. If not, see . * - *****************************************************************************/ -/*! - * \file - */ -#ifndef DUMUX_EL2P_NEWTON_CONTROLLER_HH -#define DUMUX_EL2P_NEWTON_CONTROLLER_HH - -#include - -namespace Dumux { - -/*! -* \brief An el2p specific controller for the newton solver. -* -* This controller 'knows' what a 'physically meaningful' solution is -* which allows the newton method to abort quicker if the solution is -* way out of bounds. - */ -template -class ElTwoPNewtonController : public NewtonController -{ - typedef NewtonController ParentType; - - typedef typename GET_PROP_TYPE(TypeTag, NewtonController) Implementation; - - typedef typename GET_PROP_TYPE(TypeTag, Problem) Problem; - typedef typename GET_PROP_TYPE(TypeTag, Scalar) Scalar; - typedef typename GET_PROP_TYPE(TypeTag, NewtonMethod) NewtonMethod; - - typedef typename GET_PROP_TYPE(TypeTag, JacobianMatrix) JacobianMatrix; - typedef typename GET_PROP_TYPE(TypeTag, SolutionVector) SolutionVector; - typedef typename GET_PROP_TYPE(TypeTag, LinearSolver) LinearSolver; - -public: - /*! - * \brief Destructor - */ - ElTwoPNewtonController(const Problem &problem) - : ParentType(problem),linearSolver_(problem) - { - this->setTargetSteps(9); - this->setMaxSteps(18); - }; - - void newtonUpdateRelError(const SolutionVector &uOld, - const SolutionVector &deltaU) - { - // calculate the relative error as the maximum relative - // deflection in any degree of freedom. - this->shift_ = 0; - - using std::abs; - using std::max; - for (int i = 0; i < int(uOld.base().size()); ++i) { - Scalar vertErr = abs(deltaU.base()[i]/(1.0 + abs((uOld.base()[i]) + uOld.base()[i] - deltaU.base()[i])/2)); - this->shift_ = max(this->shift_, vertErr); - } - - this->shift_ = this->gridView_().comm().max(this->shift_); - } - - void newtonUpdate(SolutionVector &uCurrentIter, - const SolutionVector &uLastIter, - const SolutionVector &deltaU) - { -// this->writeConvergence_(uLastIter, deltaU); - - newtonUpdateRelError(uLastIter, deltaU); - - uCurrentIter = uLastIter; - uCurrentIter -= deltaU; - -// printvector(std::cout, deltaU, "new solution", "row", 12, 1, 3); - } - - /*! - * \brief Solve the linear system of equations \f$\mathbf{A}x - b = 0\f$. - * - * Throws NumericalProblem if the linear solver didn't - * converge. - * - * \param A The matrix of the linear system of equations - * \param x The vector which solves the linear system - * \param b The right hand side of the linear system - */ - void newtonSolveLinear(JacobianMatrix &A, - SolutionVector &x, - SolutionVector &b) - { - using std::min; - try { - if (this->numSteps_ == 0) - { - Scalar norm2 = b.base().two_norm2(); - if (this->gridView_().comm().size() > 1) - norm2 = this->gridView_().comm().sum(norm2); - - using std::sqrt; - initialAbsoluteError_ = sqrt(norm2); - lastAbsoluteError_ = initialAbsoluteError_; - } - - int converged = linearSolver_.solve(A.base(), x.base(), b.base()); -// printvector(std::cout, x.base(), "x", "row", 5, 1, 5); -// printvector(std::cout, b.base(), "rhs", "row", 5, 1, 5); -// Dune::writeMatrixToMatlab(A.base(), "matrix.txt"); - - // make sure all processes converged - int convergedRemote = converged; - if (this->gridView_().comm().size() > 1) - convergedRemote = this->gridView_().comm().min(converged); - - if (!converged) { - DUNE_THROW(NumericalProblem, - "Linear solver did not converge"); - } - else if (!convergedRemote) { - DUNE_THROW(NumericalProblem, - "Linear solver did not converge on a remote process"); - } - } - catch (Dune::MatrixBlockError e) { - // make sure all processes converged - int converged = 0; - if (this->gridView_().comm().size() > 1) - converged = this->gridView_().comm().min(converged); - - NumericalProblem p; - std::string msg; - std::ostringstream ms(msg); - ms << e.what() << "M=" << A.base()[e.r][e.c]; - p.message(ms.str()); - throw p; - } - catch (const Dune::Exception &e) { - // make sure all processes converged - int converged = 0; - if (this->gridView_().comm().size() > 1) - converged = this->gridView_().comm().min(converged); - - NumericalProblem p; - p.message(e.what()); - throw p; - } - } - - // absolute errors and tolerance - Scalar absoluteError_; - Scalar lastAbsoluteError_; - Scalar initialAbsoluteError_; - Scalar absoluteTolerance_; - - // the linear solver - LinearSolver linearSolver_; - -}; -} - -#endif diff --git a/dumux/geomechanics/el2p/properties.hh b/dumux/geomechanics/el2p/properties.hh deleted file mode 100644 index 3812656dcf8c59af1188a21b99aef7e88aa1cf8b..0000000000000000000000000000000000000000 --- a/dumux/geomechanics/el2p/properties.hh +++ /dev/null @@ -1,91 +0,0 @@ -// -*- mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- -// vi: set et ts=4 sw=4 sts=4: -/***************************************************************************** - * See the file COPYING for full copying permissions. * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 2 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program. If not, see . * - *****************************************************************************/ -/*! - * \file - * - * \brief Defines the properties required for the two phase linear-elastic model. - * - * This class inherits from the properties of the two-phase model and - * from the properties of the simple linear-elastic model - */ - -#ifndef DUMUX_ELASTIC2P_PROPERTIES_HH -#define DUMUX_ELASTIC2P_PROPERTIES_HH - -#include -#include - -namespace Dumux -{ -//////////////////////////////// -// properties -//////////////////////////////// -namespace Properties -{ -////////////////////////////////////////////////////////////////// -// Type tags -////////////////////////////////////////////////////////////////// - -//! The type tag for the twophase model with a linear elastic matrix -NEW_TYPE_TAG(BoxElasticTwoP, INHERITS_FROM(BoxModel)); - -////////////////////////////////////////////////////////////////// -// Property tags -////////////////////////////////////////////////////////////////// -NEW_PROP_TAG(DisplacementGridFunctionSpace); //!< grid function space for the displacement -NEW_PROP_TAG(PressureGridFunctionSpace); //!< grid function space for the pressure, saturation, ... -NEW_PROP_TAG(GridOperatorSpace); //!< The grid operator space -NEW_PROP_TAG(GridOperator); //!< The grid operator space -NEW_PROP_TAG(PressureFEM); //!< FE space used for pressure, saturation, ... -NEW_PROP_TAG(DisplacementFEM); //!< FE space used for displacement - -//! Returns whether the output should be written according to -//! rock mechanics sign convention (compressive stresses > 0) -NEW_PROP_TAG(VtkRockMechanicsSignConvention); - -//! Specifies the grid function space used for sub-problems -NEW_PROP_TAG(GridFunctionSpace); - -//! Specifies the grid operator used for sub-problems -NEW_PROP_TAG(GridOperator); - -//! Specifies the grid operator space used for sub-problems -NEW_PROP_TAG(GridOperatorSpace); - -//! Specifies the type of the constraints -NEW_PROP_TAG(Constraints); - -//! Specifies the type of the constraints transformation -NEW_PROP_TAG(ConstraintsTrafo); - -//! Specifies the local finite element space -NEW_PROP_TAG(LocalFEMSpace); - -//! Specifies the local operator -NEW_PROP_TAG(LocalOperator); - -//! The type traits required for using the AMG backend -NEW_PROP_TAG(AmgTraits); - -NEW_PROP_TAG(EffectivePermeabilityModel); -} - -} - -#endif diff --git a/dumux/geomechanics/el2p/propertydefaults.hh b/dumux/geomechanics/el2p/propertydefaults.hh deleted file mode 100644 index 251008ce06e0a98914dc4c8d4038441fee61175b..0000000000000000000000000000000000000000 --- a/dumux/geomechanics/el2p/propertydefaults.hh +++ /dev/null @@ -1,443 +0,0 @@ -// -*- mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- -// vi: set et ts=4 sw=4 sts=4: -/***************************************************************************** - * See the file COPYING for full copying permissions. * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 2 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program. If not, see . * - *****************************************************************************/ -/*! - * \file - * - * \brief Defines the properties required for the two phase linear-elastic model. - * - * This class inherits from the properties of the two-phase model and - * from the properties of the simple linear-elastic model - */ - -#ifndef DUMUX_ELASTIC2P_PROPERTY_DEFAULTS_HH -#define DUMUX_ELASTIC2P_PROPERTY_DEFAULTS_HH - -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include - -#include "properties.hh" - -#include "model.hh" -#include "basemodel.hh" -#include "indices.hh" -#include "localresidual.hh" -#include "localjacobian.hh" -#include "fluxvariables.hh" -#include "elementvolumevariables.hh" -#include "volumevariables.hh" -#include "localoperator.hh" -#include "assembler.hh" -#include "newtoncontroller.hh" -#include "indices.hh" -#include -#include -#include -#include - -#include - -namespace Dumux -{ - -////////////////////////////////////////////////////////////////// -// Property defaults -////////////////////////////////////////////////////////////////// - -namespace Properties -{ -SET_PROP(BoxElasticTwoP, NumEq) //!< set the number of equations to dim + 2 -{ -private: - typedef typename GET_PROP_TYPE(TypeTag, Grid) Grid; - static const int dim = Grid::dimension; -public: - static const int value = dim + 2; -}; - -SET_INT_PROP(BoxElasticTwoP, NumPhases, 2); //!< The number of fluid phases in the elastic 2p model is 2 - -//! Use the elastic local jacobian operator for the two-phase linear-elastic model -SET_TYPE_PROP(BoxElasticTwoP, - LocalResidual, - ElTwoPLocalResidual); - -//! the Model property -SET_TYPE_PROP(BoxElasticTwoP, Model, ElTwoPModel); - -/*! - * \brief An array of secondary variable containers. - */ -SET_TYPE_PROP(BoxElasticTwoP, ElementVolumeVariables, ElTwoPElementVolumeVariables); - -//! the VolumeVariables property -SET_TYPE_PROP(BoxElasticTwoP, VolumeVariables, ElTwoPVolumeVariables); - -//! Set the default formulation to pWsN -SET_INT_PROP(BoxElasticTwoP, - Formulation, - 0); - -//! The indices required by the two-phase linear-elastic model - -SET_PROP(BoxElasticTwoP, Indices) -{ - typedef ElTwoPIndices type; -}; - -//! The FluxVariables required by the two-phase linear-elastic model -SET_TYPE_PROP(BoxElasticTwoP, FluxVariables, ElTwoPFluxVariables); - -//! the default upwind factor. Default 1.0, i.e. fully upwind... -SET_SCALAR_PROP(BoxElasticTwoP, ImplicitMassUpwindWeight, 1.0); - -//! weight for the upwind mobility in the velocity calculation -SET_SCALAR_PROP(BoxElasticTwoP, ImplicitMobilityUpwindWeight, 1.0); - -//! enable gravity by default -SET_BOOL_PROP(BoxElasticTwoP, ProblemEnableGravity, true); - - -//! Enable evaluation of shape function gradients at the sub-control volume center by default -// Used for the computation of the pressure gradients -SET_BOOL_PROP(BoxElasticTwoP, EvalGradientsAtSCVCenter, true); - -/*! - * \brief Set the property for the material parameters by extracting - * it from the material law. - */ -SET_PROP(BoxElasticTwoP, MaterialLawParams) -{ -private: - typedef typename GET_PROP_TYPE(TypeTag, MaterialLaw) MaterialLaw; - -public: - typedef typename MaterialLaw::Params type; -}; - -SET_PROP(BoxElasticTwoP, EffectivePermeabilityModel) -{ -private: - typedef typename GET_PROP_TYPE(TypeTag, Scalar) Scalar; -public: - typedef PermeabilityRutqvistTsang type; -}; - -// SET_TYPE_PROP(BoxElasticTwoP, EffectivePermeabilityModel, PermeabilityRutqvistTsang); - -// use the SuperLU linear solver by default -#if HAVE_SUPERLU -SET_TYPE_PROP(BoxElasticTwoP, LinearSolver, SuperLUBackend ); -#else -#warning no SuperLU detected, defaulting to ILU0BiCGSTAB. For many problems, the el2p model requires a direct solver. -SET_TYPE_PROP(BoxElasticTwoP, LinearSolver, ILU0BiCGSTABBackend ); -#endif - -// set the grid operator -SET_PROP(BoxElasticTwoP, GridOperator) -{ -private: - typedef typename GET_PROP_TYPE(TypeTag, Scalar) Scalar; - typedef typename GET_PROP_TYPE(TypeTag, ConstraintsTrafo) ConstraintsTrafo; - typedef typename GET_PROP_TYPE(TypeTag, GridFunctionSpace) GridFunctionSpace; - typedef typename GET_PROP_TYPE(TypeTag, LocalOperator) LocalOperator; - typedef typename Dune::PDELab::ISTLMatrixBackend MatrixBackend; - - enum{numEq = GET_PROP_VALUE(TypeTag, NumEq)}; - -public: - - typedef Dune::PDELab::GridOperator type; -}; - -SET_PROP(BoxElasticTwoP, JacobianMatrix) -{ -private: - //typedef typename GET_PROP_TYPE(TypeTag, GridOperator) GridOperator; - typedef typename GET_PROP_TYPE(TypeTag, Scalar) Scalar; - typedef typename GET_PROP_TYPE(TypeTag, GridFunctionSpace) GFSU; - typedef typename GFSU::template ConstraintsContainer::Type CU; - //! The global assembler type - typedef Dune::PDELab::DefaultAssembler Assembler; - - //! The type of the domain (solution). - typedef typename Dune::PDELab::BackendVectorSelector::Type Domain; - //! The type of the range (residual). - typedef typename Dune::PDELab::BackendVectorSelector::Type Range; - //! The type of the jacobian. - typedef typename Dune::PDELab::ISTLMatrixBackend MB; - typedef typename Dune::PDELab::BackendMatrixSelector::Type Jacobian; - - //! The local assembler type - typedef typename GET_PROP_TYPE(TypeTag, LocalOperator) LOP; - typedef typename GET_PROP_TYPE(TypeTag, GridOperator) GridOperator; - typedef Dune::PDELab::DefaultLocalAssembler - LocalAssembler; - //! The grid operator traits - typedef Dune::PDELab::GridOperatorTraits - Traits; -public: - typedef typename Traits::Jacobian type; -}; - -SET_PROP(BoxElasticTwoP, SolutionVector) -{ -private: - //typedef typename GET_PROP_TYPE(TypeTag, GridOperator) GridOperator; - typedef typename GET_PROP_TYPE(TypeTag, Scalar) Scalar; - typedef typename GET_PROP_TYPE(TypeTag, GridFunctionSpace) GFSU; - typedef typename GFSU::template ConstraintsContainer::Type CU; - //! The global assembler type - typedef Dune::PDELab::DefaultAssembler Assembler; - - //! The type of the domain (solution). - typedef typename Dune::PDELab::BackendVectorSelector::Type Domain; - //! The type of the range (residual). - typedef typename Dune::PDELab::BackendVectorSelector::Type Range; - //! The type of the jacobian. - typedef typename Dune::PDELab::ISTLMatrixBackend MB; - typedef typename Dune::PDELab::BackendMatrixSelector::Type Jacobian; - - //! The local assembler type - typedef typename GET_PROP_TYPE(TypeTag, LocalOperator) LOP; - typedef typename GET_PROP_TYPE(TypeTag, GridOperator) GridOperator; - typedef Dune::PDELab::DefaultLocalAssembler - LocalAssembler; - //! The grid operator traits - typedef Dune::PDELab::GridOperatorTraits - Traits; -public: - typedef typename Traits::Domain type; -}; - -SET_PROP(BoxElasticTwoP, PressureGridFunctionSpace) -{private: - typedef typename GET_PROP_TYPE(TypeTag, Scalar) Scalar; - typedef typename GET_PROP_TYPE(TypeTag, PressureFEM) FEM; - typedef typename GET_PROP_TYPE(TypeTag, GridView) GridView; - typedef typename Dune::PDELab::EntityBlockedOrderingTag OrderingTag; - typedef typename Dune::PDELab::ISTLVectorBackend<> VBE; - enum{numEq = GET_PROP_VALUE(TypeTag, NumEq), - dim = GridView::dimension}; -public: - typedef Dune::PDELab::NoConstraints Constraints; - - typedef Dune::PDELab::GridFunctionSpace - ScalarGridFunctionSpace; - - typedef Dune::PDELab::PowerGridFunctionSpace - type; - - typedef typename type::template ConstraintsContainer::Type - ConstraintsTrafo; -}; - -SET_PROP(BoxElasticTwoP, DisplacementGridFunctionSpace) -{private: - typedef typename GET_PROP_TYPE(TypeTag, Scalar) Scalar; - typedef typename GET_PROP_TYPE(TypeTag, DisplacementFEM) FEM; - typedef typename GET_PROP_TYPE(TypeTag, GridView) GridView; - typedef typename Dune::PDELab::EntityBlockedOrderingTag OrderingTag; - typedef typename Dune::PDELab::ISTLVectorBackend<> VBE; - enum{dim = GridView::dimension}; -public: - typedef Dune::PDELab::NoConstraints Constraints; - - typedef Dune::PDELab::GridFunctionSpace - ScalarGridFunctionSpace; - - typedef Dune::PDELab::PowerGridFunctionSpace - type; - - typedef typename type::template ConstraintsContainer::Type - ConstraintsTrafo; -}; - -SET_PROP(BoxElasticTwoP, GridFunctionSpace) -{private: - typedef typename GET_PROP_TYPE(TypeTag, Scalar) Scalar; - typedef typename GET_PROP_TYPE(TypeTag, PressureGridFunctionSpace) PressureGFS; - typedef typename GET_PROP_TYPE(TypeTag, DisplacementGridFunctionSpace) DisplacementGFS; - typedef typename Dune::PDELab::LexicographicOrderingTag OrderingTag; - typedef typename Dune::PDELab::ISTLVectorBackend<> VBE; -public: - typedef Dune::PDELab::NoConstraints Constraints; - - typedef void ScalarGridFunctionSpace; - - typedef Dune::PDELab::CompositeGridFunctionSpace type; - - typedef typename type::template ConstraintsContainer::Type - ConstraintsTrafo; -}; - -SET_PROP(BoxElasticTwoP, ConstraintsTrafo) -{private: - typedef typename GET_PROP_TYPE(TypeTag, Scalar) Scalar; - typedef typename GET_PROP_TYPE(TypeTag, GridFunctionSpace) GridFunctionSpace; -public: - typedef typename GridFunctionSpace::template ConstraintsContainer::Type type; -}; - -// set the grid function space for the sub-models -SET_TYPE_PROP(BoxElasticTwoP, Constraints, Dune::PDELab::NoConstraints); - -SET_TYPE_PROP(BoxElasticTwoP, JacobianAssembler, PDELab::El2PAssembler); - -SET_PROP(BoxElasticTwoP, WettingPhase) -{ private: - typedef typename GET_PROP_TYPE(TypeTag, Scalar) Scalar; -public: - typedef FluidSystems::LiquidPhase > type; -}; - -SET_PROP(BoxElasticTwoP, NonwettingPhase) -{ private: - typedef typename GET_PROP_TYPE(TypeTag, Scalar) Scalar; -public: - typedef FluidSystems::LiquidPhase > type; -}; - -SET_PROP(BoxElasticTwoP, FluidSystem) -{ private: - typedef typename GET_PROP_TYPE(TypeTag, Scalar) Scalar; - typedef typename GET_PROP_TYPE(TypeTag, WettingPhase) WettingPhase; - typedef typename GET_PROP_TYPE(TypeTag, NonwettingPhase) NonwettingPhase; - -public: - typedef FluidSystems::TwoPImmiscible type; -}; - -SET_PROP(BoxElasticTwoP, FluidState) -{ -private: - typedef typename GET_PROP_TYPE(TypeTag, Scalar) Scalar; - typedef typename GET_PROP_TYPE(TypeTag, FluidSystem) FluidSystem; -public: - typedef ImmiscibleFluidState type; -}; - -// enable jacobian matrix recycling by default -SET_BOOL_PROP(BoxElasticTwoP, ImplicitEnableJacobianRecycling, false); -// enable partial reassembling by default -SET_BOOL_PROP(BoxElasticTwoP, ImplicitEnablePartialReassemble, false); - -SET_TYPE_PROP(BoxElasticTwoP, NewtonController, ElTwoPNewtonController); - -SET_PROP(BoxElasticTwoP, LocalOperator) -{ - typedef PDELab::El2PLocalOperator type; -}; - -//! use the local FEM space associated with cubes by default -SET_PROP(BoxElasticTwoP, LocalFEMSpace) -{ - typedef typename GET_PROP_TYPE(TypeTag, Scalar) Scalar; - typedef typename GET_PROP_TYPE(TypeTag, GridView) GridView; - -public: - typedef Dune::PDELab::QkLocalFiniteElementMap type; -}; - -/*! - * \brief A vector of primary variables. - */ -SET_PROP(BoxElasticTwoP, PrimaryVariables) -{ -private: - typedef typename GET_PROP_TYPE(TypeTag, Scalar) Scalar; - enum{numEq = GET_PROP_VALUE(TypeTag, NumEq)}; -public: - typedef Dune::FieldVector type; -}; - -template -class ElasticTwoPSolverTraits -: public NonoverlappingSolverTraits -{ -public: - typedef typename GET_PROP_TYPE(TypeTag, JacobianMatrix) JacobianMatrix; -}; - -template -class ElasticTwoPSolverTraits -: public NonoverlappingSolverTraits -{ -public: - typedef MType JacobianMatrix; -}; - -//! define the traits for the AMGBackend -SET_PROP(BoxElasticTwoP, AmgTraits) -{ -public: - typedef typename GET_PROP_TYPE(TypeTag, Grid) Grid; - typedef typename GET_PROP_TYPE(TypeTag, Scalar) Scalar; - enum { dofCodim = Grid::dimension, - isNonOverlapping = true }; - enum { isParallel = Dune::Capabilities::canCommunicate::v }; - - static const int numEq = isParallel ? GET_PROP_VALUE(TypeTag, NumEq) - : GET_PROP_TYPE(TypeTag, JacobianMatrix)::block_type::rows; - - typedef Dune::BCRSMatrix > MType; - typedef Dune::BlockVector > VType; - typedef ElasticTwoPSolverTraits SolverTraits; - typedef typename SolverTraits::Comm Comm; - typedef typename SolverTraits::LinearOperator LinearOperator; - typedef typename SolverTraits::ScalarProduct ScalarProduct; - typedef typename SolverTraits::Smoother Smoother; - typedef typename SolverTraits::JacobianMatrix JacobianMatrix; -}; - -//! The local jacobian operator -SET_TYPE_PROP(BoxElasticTwoP, LocalJacobian, ElTwoPLocalJacobian); - -SET_TYPE_PROP(BoxElasticTwoP, BaseModel, ElTwoPBaseModel); - -//! set number of equations of the mathematical model as default -SET_INT_PROP(BoxElasticTwoP, LinearSolverBlockSize, 1); - -// write the stress and displacement output according to rock mechanics sign convention (compressive stresses > 0) -SET_BOOL_PROP(BoxElasticTwoP, VtkRockMechanicsSignConvention, true); - -// \} -} -} - -#endif diff --git a/dumux/geomechanics/el2p/volumevariables.hh b/dumux/geomechanics/el2p/volumevariables.hh deleted file mode 100644 index 951609d6b3d831666ad5d374ca5ca2e889c880ba..0000000000000000000000000000000000000000 --- a/dumux/geomechanics/el2p/volumevariables.hh +++ /dev/null @@ -1,174 +0,0 @@ -// -*- mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- -// vi: set et ts=4 sw=4 sts=4: -/***************************************************************************** - * See the file COPYING for full copying permissions. * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 2 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program. If not, see . * - *****************************************************************************/ -/*! - * \file - * - * \brief Quantities required by the two-phase linear-elastic model which - * are defined on a vertex. - */ -#ifndef DUMUX_ELASTIC2P_VOLUME_VARIABLES_HH -#define DUMUX_ELASTIC2P_VOLUME_VARIABLES_HH - -#include - -#include "properties.hh" - -namespace Dumux { -/*! - * \ingroup ElTwoPModel - * \ingroup ImplicitVolumeVariables - * \brief Contains the quantities which are are constant within a - * finite volume in the two-phase linear-elastic model. - * - * This class inherits from the vertexdata of the two-phase - * model and from the vertexdata of the simple - * linear-elastic model - */ -template -class ElTwoPVolumeVariables: public TwoPVolumeVariables { - - typedef TwoPVolumeVariables TwoPBase; - typedef typename GET_PROP_TYPE(TypeTag, Problem) Problem; - typedef typename GET_PROP_TYPE(TypeTag, VolumeVariables) Implementation; - typedef typename GET_PROP_TYPE(TypeTag, FVElementGeometry) FVElementGeometry; - typedef typename GET_PROP_TYPE(TypeTag, PrimaryVariables) PrimaryVariables; - typedef typename GET_PROP_TYPE(TypeTag, Indices) Indices; - - enum { - wPhaseIdx = Indices::wPhaseIdx, - nPhaseIdx = Indices::nPhaseIdx - }; - - typedef typename GET_PROP_TYPE(TypeTag, GridView) GridView; - typedef typename GridView::template Codim<0>::Entity Element; - - enum { dim = GridView::dimension }; - - typedef typename GET_PROP_TYPE(TypeTag, Scalar) Scalar; - typedef Dune::FieldVector DimVector; - -public: - /*! - * \copydoc ImplicitVolumeVariables::update - */ - void update(const PrimaryVariables &priVars, - const Problem &problem, - const Element &element, - const FVElementGeometry &fvGeometry, - int scvIdx, - bool isOldSol) - { - TwoPBase::update(priVars, problem, element, fvGeometry, scvIdx, isOldSol); - primaryVars_ = priVars; - - for (int coordDir = 0; coordDir < dim; ++coordDir) - displacement_[coordDir] = priVars[Indices::u(coordDir)]; - - effFluidDensity_ = this->density(wPhaseIdx) * this->saturation(wPhaseIdx) - + this->density(nPhaseIdx) * this->saturation(nPhaseIdx); - - const Dune::FieldVector &lameParams = - problem.spatialParams().lameParams(element, fvGeometry, scvIdx); - - lambda_ = lameParams[0]; - mu_ = lameParams[1]; - - rockDensity_ = problem.spatialParams().rockDensity(element, scvIdx); - } - - /*! - * \brief Return the vector of primary variables - */ - const PrimaryVariables &primaryVars() const - { return primaryVars_; } - - /*! - * \brief Return the vector of primary variables - */ - const Scalar &priVar(int idx) const - { return primaryVars_[idx]; } - - /*! - * \brief Sets the evaluation point used in the by the local jacobian. - */ - void setEvalPoint(const Implementation *ep) - { } - - /*! - * \brief Returns the effective effective fluid density within - * the control volume. - */ - Scalar effFluidDensity() const - { return effFluidDensity_; } - - - /*! - * \brief Returns the Lame parameter lambda within the control volume. - */ - Scalar lambda() const - { return lambda_; } - - /*! - * \brief Returns the Lame parameter mu within the control volume. - */ - Scalar mu() const - { return mu_; } - - /*! - * \brief Returns the rock density within the control volume. - */ - Scalar rockDensity() const - { return rockDensity_; } - - /*! - * \brief Returns the solid displacement in all space - * directions within the control volume. - */ - Scalar displacement(int dimIdx) const - { return displacement_[dimIdx]; } - - /*! - * \brief Returns the solid displacement vector - * within the control volume. - */ - DimVector displacement() const - { return displacement_; } - - mutable Scalar divU; - mutable Scalar effPorosity; - -protected: - Scalar effFluidDensity_; - PrimaryVariables primaryVars_, prevPrimaryVars_; - DimVector displacement_, prevDisplacement_; - Scalar lambda_; - Scalar mu_; - Scalar rockDensity_; - -private: - Implementation &asImp_() - { return *static_cast(this); } - - const Implementation &asImp_() const - { return *static_cast(this); } -}; - -} - -#endif diff --git a/dumux/geomechanics/elastic/CMakeLists.txt b/dumux/geomechanics/elastic/CMakeLists.txt deleted file mode 100644 index dc2edada4ebdd7cfe64a373f57d427b4a419fbb0..0000000000000000000000000000000000000000 --- a/dumux/geomechanics/elastic/CMakeLists.txt +++ /dev/null @@ -1,11 +0,0 @@ - -#install headers -install(FILES -fluxvariables.hh -indices.hh -localresidual.hh -model.hh -properties.hh -propertydefaults.hh -volumevariables.hh -DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/dumux/geomechanics/elastic) diff --git a/dumux/geomechanics/elastic/fluxvariables.hh b/dumux/geomechanics/elastic/fluxvariables.hh deleted file mode 100644 index 52c64d9f7c874dd7f6632dd489c5f50ec913ac08..0000000000000000000000000000000000000000 --- a/dumux/geomechanics/elastic/fluxvariables.hh +++ /dev/null @@ -1,267 +0,0 @@ -// -*- mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- -// vi: set et ts=4 sw=4 sts=4: -/***************************************************************************** - * See the file COPYING for full copying permissions. * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 2 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program. If not, see . * - *****************************************************************************/ - /*! - * \file - * - * \brief This file contains the data which is required to calculate the gradients - * over a face of a finite volume that are needed for the momentum balance - * of a linear-elastic solid. - * - * This means gradients of solid displacement vectors, strains and stresses at - * the integration point - * - * This class is also used as a base class for the one-phase and two-phase - * linear-elastic models. - */ -#ifndef DUMUX_ELASTIC_FLUX_VARIABLES_HH -#define DUMUX_ELASTIC_FLUX_VARIABLES_HH - -#include "properties.hh" - -namespace Dumux -{ - -/*! - * \ingroup ElasticBoxModel - * \ingroup ImplicitFluxVariables - * \brief This template class contains the data which is required to - * calculate the gradients over a face of a finite volume for - * the linear elasticity model. - * - * This means gradients of solid displacement vectors, strains and stresses at - * the integration point - */ -template -class ElasticFluxVariablesBase -{ - typedef typename GET_PROP_TYPE(TypeTag, Problem) Problem; - typedef typename GET_PROP_TYPE(TypeTag, VolumeVariables) VolumeVariables; - typedef typename GET_PROP_TYPE(TypeTag, ElementVolumeVariables) ElementVolumeVariables; - - typedef typename GET_PROP_TYPE(TypeTag, GridView) GridView; - typedef typename GridView::template Codim<0>::Entity Element; - enum { - dim = GridView::dimension - }; - - typedef typename GET_PROP_TYPE(TypeTag, Scalar) Scalar; - typedef Dune::FieldVector DimVector; - typedef Dune::FieldMatrix DimMatrix; - - typedef typename GET_PROP_TYPE(TypeTag, FVElementGeometry) FVElementGeometry; - typedef typename FVElementGeometry::SubControlVolumeFace SCVFace; - -public: - /*! - * \brief Compute / update the flux variables - * - * \param problem The problem - * \param element The finite element - * \param fvGeometry The finite-volume geometry - * \param fIdx The local index of the SCV (sub-control-volume) face - * \param elemVolVars The volume variables of the current element - * \param onBoundary A boolean variable to specify whether the flux variables - * are calculated for interior SCV faces or boundary faces, default=false - * \todo The fvGeometry should be better initialized, passed and stored as an std::shared_ptr - */ - void update(const Problem &problem, - const Element &element, - const FVElementGeometry &fvGeometry, - const int fIdx, - const ElementVolumeVariables &elemVolVars, - const bool onBoundary = false) - { - fvGeometryPtr_ = &fvGeometry; - onBoundary_ = onBoundary; - faceIdx_ = fIdx; - - gradU_ = 0.0; - gradUTransposed_ = 0.0; - epsilon_ = 0.0; - sigma_ = 0.0; - - lambda_ = 0.0; - mu_ = 0.0; - divU_ = 0.0; - - calculateGradients_(problem, element, elemVolVars); - calculateStrain_(problem, element, elemVolVars); - calculateStress_(problem, element, elemVolVars); - } - - /*! - * \brief Return a stress tensor component [Pa] at the integration point. - */ - Scalar sigma(int row, int col) const - { return sigma_[row][col]; } - - /*! - * \brief Return the stress tensor [Pa] at the integration point. - */ - DimMatrix sigma() const - { return sigma_; } - - /*! - * \brief Return the volumetric strain i.e. the divergence of the solid displacement - * vector at the integration point. - */ - Scalar divU() const - { return divU_; } - - /*! - * \brief Returns the Lame parameter lambda at integration point. - */ - Scalar lambda() const - { return lambda_; } - - /*! - * \brief Returns the Lame parameter mu at integration point. - */ - Scalar mu() const - { return mu_; } - - /*! - * \brief Returns the sub-control-volume face. - */ - const SCVFace &face() const - { return fvGeometry_().subContVolFace[faceIdx_]; } - -protected: - /*! - * \brief Calculation of the solid displacement gradients. - * - * \param problem The considered problem file - * \param element The considered element of the grid - * \param elemVolVars The parameters stored in the considered element - */ - void calculateGradients_(const Problem &problem, - const Element &element, - const ElementVolumeVariables &elemVolVars) - { - const VolumeVariables &volVarsI = elemVolVars[face().i]; - const VolumeVariables &volVarsJ = elemVolVars[face().j]; - - // calculate gradients - DimVector tmp(0.0); - for (int idx = 0; - idx < fvGeometry_().numScv; - idx++) // loop over adjacent vertices - { - // FE gradient at vertex idx - const DimVector &feGrad = face().grad[idx]; - - // the displacement vector gradient - for (int coordIdx = 0; coordIdx < dim; ++coordIdx) { - tmp = feGrad; - tmp *= elemVolVars[idx].displacement(coordIdx); - gradU_[coordIdx] += tmp; - } - } - - // average the Lame parameters at integration point - // note: it still needs to be checked which mean (arithmetic, harmonic.. is appropriate - lambda_ = (volVarsI.lambda() + volVarsJ.lambda()) / 2.; - mu_ = (volVarsI.mu() + volVarsJ.mu()) / 2.; - - for(int col=0; col < dim; col++) - { - divU_ += gradU_[col][col]; - - for(int row=0; row. * - *****************************************************************************/ -/*! - * \file - * \brief Defines the primary variable and equation indices used by - * the linear elasticity model - */ -#ifndef DUMUX_ELASTIC_INDICES_HH -#define DUMUX_ELASTIC_INDICES_HH - -namespace Dumux -{ -// \{ - -/*! - * \ingroup ElasticBoxModel - * \ingroup ImplicitIndices - * \brief The indices for the linear elasticity model. - */ -template -struct ElasticIndices -{ - // returns the equation index for a given space direction - static int momentum(int dirIdx) - { - return PVOffset + dirIdx; - }; - - // returns the primary variable index for a given space direction - static int u(int dirIdx) - { - return PVOffset + dirIdx; - }; - - // Equation indices - static const int momentumXEqIdx = PVOffset + 0; - static const int momentumYEqIdx = PVOffset + 1; - static const int momentumZEqIdx = PVOffset + 2; - - // primary variable indices - static const int uxIdx = PVOffset + 0; - static const int uyIdx = PVOffset + 1; - static const int uzIdx = PVOffset + 2; -}; - -}// namespace Dumux - -#endif diff --git a/dumux/geomechanics/elastic/localresidual.hh b/dumux/geomechanics/elastic/localresidual.hh deleted file mode 100644 index 9c8589d0644d3264dad65d82006b898896bb6af8..0000000000000000000000000000000000000000 --- a/dumux/geomechanics/elastic/localresidual.hh +++ /dev/null @@ -1,120 +0,0 @@ -// -*- mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- -// vi: set et ts=4 sw=4 sts=4: -/***************************************************************************** - * See the file COPYING for full copying permissions. * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 2 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program. If not, see . * - *****************************************************************************/ -/*! - * \file - * - * \brief Element-wise calculation the local Jacobian for the - * linear elastic model in the fully implicit scheme. - */ -#ifndef DUMUX_ELASTIC_LOCAL_RESIDUAL_HH -#define DUMUX_ELASTIC_LOCAL_RESIDUAL_HH - -#include "properties.hh" - -namespace Dumux -{ -/*! - * - * \ingroup ElasticBoxModel - * \ingroup ImplicitLocalResidual - * \brief Calculate the local Jacobian for the linear - * elasticity model - * - * This class is used to fill the gaps in BoxLocalResidual for - * the linear elasticity model. - */ -template -class ElasticLocalResidual : public GET_PROP_TYPE(TypeTag, BaseLocalResidual) -{ -protected: - typedef typename GET_PROP_TYPE(TypeTag, BaseLocalResidual) ParentType; - typedef typename GET_PROP_TYPE(TypeTag, LocalResidual) Implementation; - typedef typename GET_PROP_TYPE(TypeTag, Scalar) Scalar; - typedef typename GET_PROP_TYPE(TypeTag, GridView) GridView; - - enum { dim = GridView::dimension }; - typedef Dune::FieldVector DimVector; - - typedef typename GET_PROP_TYPE(TypeTag, VolumeVariables) VolumeVariables; - typedef typename GET_PROP_TYPE(TypeTag, FluxVariables) FluxVariables; - typedef typename GET_PROP_TYPE(TypeTag, PrimaryVariables) PrimaryVariables; - typedef typename GET_PROP_TYPE(TypeTag, SubControlVolume) SubControlVolume; - typedef typename GET_PROP_TYPE(TypeTag, SubControlVolumeFace) SubControlVolumeFace; - - typedef typename GET_PROP_TYPE(TypeTag, Indices) Indices; - -public: - /*! - * \brief Evaluate the amount of all conservation quantities - * within a finite volume. - * - * \param storage The storage of a quantity in the sub-control volume - * \param scvIdx The index of the considered face of the sub-control volume - * \param usePrevSol Evaluate function with solution of current or previous time step - */ - PrimaryVariables computeStorage(const SubControlVolume& scv, const VolumeVariables& volVars) const - { - // quasistationary conditions assumed - return PrimaryVariables(0.0); - } - - /*! - * \brief Evaluate the stress across a face of a sub-control - * volume. - * - * \param flux The stress over the SCV (sub-control-volume) face - * \param fIdx The index of the considered face of the sub control volume - * \param onBoundary A boolean variable to specify whether the flux variables - * are calculated for interior SCV faces or boundary faces, default=false - */ - PrimaryVariables computeFlux(const SubControlVolumeFace& scvFace) const - { - FluxVariables fluxVars; - fluxVars.initAndComputeFluxes(this->problem_(), this->element_(), scvFace); - return fluxVars.stressVector(); - } - - /*! - * \brief Calculate the source term of the equation - * \param source The source/sink in the SCV is the gravity term in the momentum balance - * \param scvIdx The index of the vertex of the sub control volume - * - */ - PrimaryVariables computeSource(const SubControlVolume& scv) - { - PrimaryVariables source(0.0); - - source += ParentType::computeSource(scv); - - // gravity term of the solid matrix in the momentum balance - DimVector gravityTerm(0.0); - gravityTerm = this->problem_().gravity(); - gravityTerm *= this->problem_().model().curVolVars(scv).rockDensity(); - - for (int i = 0; i < dim; ++i) - source[Indices::momentum(i)] += gravityTerm[i]; - - return source; - } - -}; - -} // end namespace Dumux - -#endif // DUMUX_ELASTIC_LOCAL_RESIDUAL_HH diff --git a/dumux/geomechanics/elastic/model.hh b/dumux/geomechanics/elastic/model.hh deleted file mode 100644 index b2c5c13b1bbe0cccaabc0ddc28e61919dfcb6152..0000000000000000000000000000000000000000 --- a/dumux/geomechanics/elastic/model.hh +++ /dev/null @@ -1,186 +0,0 @@ -// -*- mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- -// vi: set et ts=4 sw=4 sts=4: -/***************************************************************************** - * See the file COPYING for full copying permissions. * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 2 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program. If not, see . * - *****************************************************************************/ -/*! - * \file - * - * \brief Base class for all models which use the linear elasticity model. - * Adaption of the fully implicit scheme to the linear elasticity model. - */ -#ifndef DUMUX_ELASTIC_MODEL_HH -#define DUMUX_ELASTIC_MODEL_HH - -#include "properties.hh" - -namespace Dumux -{ - -/*! - * \ingroup ElasticBoxModel - * \brief Adaption of the fully implicit scheme to the linear elasticity model. - * - * This model implements a linear elastic solid using Hooke's law as - * stress-strain relation and a quasi-stationary momentum balance equation: - \f[ - \boldsymbol{\sigma} = 2\,G\,\boldsymbol{\epsilon} + \lambda \,\text{tr} (\boldsymbol{\epsilon}) \, \boldsymbol{I}. - \f] - * - * with the strain tensor \f$\boldsymbol{\epsilon}\f$ as a function of the solid displacement gradient \f$\textbf{grad} \boldsymbol{u}\f$: - \f[ - \boldsymbol{\epsilon} = \frac{1}{2} \, (\textbf{grad} \boldsymbol{u} + \textbf{grad}^T \boldsymbol{u}). - \f] - * - * Gravity can be enabled or disabled via the property system. - * By inserting this into the momentum balance equation, one gets - \f[ - \text{div} \boldsymbol{\sigma} + \varrho {\textbf g} = 0 \;, - \f] - * - * The equation is discretized using a vertex-centered finite volume (box) - * scheme as spatial discretization. - * - */ - -template -class ElasticModel : public GET_PROP_TYPE(TypeTag, BaseModel) -{ - typedef typename GET_PROP_TYPE(TypeTag, GridView) GridView; - typedef typename GET_PROP_TYPE(TypeTag, FVElementGeometry) FVElementGeometry; - typedef typename GET_PROP_TYPE(TypeTag, VolumeVariables) VolumeVariables; - typedef typename GET_PROP_TYPE(TypeTag, FluxVariables) FluxVariables; - typedef typename GET_PROP_TYPE(TypeTag, BoundaryTypes) BoundaryTypes; - typedef typename GET_PROP_TYPE(TypeTag, SolutionVector) SolutionVector; - - enum { isBox = GET_PROP_VALUE(TypeTag, ImplicitIsBox) }; - enum { dim = GridView::dimension }; - - typedef typename GET_PROP_TYPE(TypeTag, Scalar) Scalar; - typedef Dune::FieldMatrix DimMatrix; - -public: - /*! - * \brief \copybrief ImplicitModel::addOutputVtkFields - * - * Specialization for the ElasticBoxModel, adding solid displacement, - * stresses and the process rank to the VTK writer. - */ - template - void addOutputVtkFields(const SolutionVector &sol, MultiWriter &writer) - { - typedef Dune::BlockVector > ScalarField; - typedef Dune::BlockVector > VectorField; - - // create the required scalar fields - unsigned numDofs = this->numDofs(); - unsigned numElements = this->gridView_().size(0); - - ScalarField &ux = *writer.allocateManagedBuffer(numDofs); - ScalarField &uy = *writer.allocateManagedBuffer(numDofs); - ScalarField &uz = *writer.allocateManagedBuffer(numDofs); - VectorField &sigmax = *writer.template allocateManagedBuffer(numElements); - VectorField &sigmay = *writer.template allocateManagedBuffer(numElements); - VectorField &sigmaz = *writer.template allocateManagedBuffer(numElements); - - // initialize stress fields - for (unsigned int i = 0; i < numElements; ++i) - { - sigmax[i] = 0; - if (dim > 1) - { - sigmay[i] = 0; - } - if (dim > 2) - { - sigmaz[i] = 0; - } - } - - ScalarField &rank = *writer.allocateManagedBuffer(numElements); - - for (const auto& element : elements(this->gridView_(), Dune::Partitions::interior)) - { - int eIdx = this->problem_().model().elementMapper().index(element); - rank[eIdx] = this->gridView_().comm().rank(); - - // make sure FVElementGeometry and the volume variables are bound to the element - this->fvGeometries_().bind(element); - this->curVolVars_().bind(element); - - const auto& fvGeometry = this->fvGeometries(element); - for (const auto& scv : fvGeometry.scvs()) - { - int dofIdxGlobal = scv.dofIndex(); - const auto& volVars = this->curVolVars(scv); - - ux[dofIdxGlobal] = volVars.displacement(0); - if (dim >= 2) - uy[dofIdxGlobal] = volVars.displacement(1); - if (dim >= 3) - uz[dofIdxGlobal] = volVars.displacement(2); - } - - // In the box method, the stress is evaluated on the FE-Grid. However, to get an - // average apparent stress for the cell, all contributing stresses have to be interpolated. - DimMatrix stress(0.0); - unsigned int counter = 0; - - // loop over the faces - for (const auto& scvFace : fvGeometry.scvfs()) - { - if (scvFace.boundary()) - { - BoundaryTypes bcTypes = this->problem_().boundaryTypes(element, scvFace); - if (bcTypes.hasNeumann()) - continue; - } - - //prepare the flux calculations (set up and prepare geometry, FE gradients) - FluxVariables fluxVars; - fluxVars.initAndComputeFluxes(this->problem_(), element, scvFace); - - // Add up stresses for each scv face. - // Beware the sign convention applied here: compressive stresses are negative - stress += fluxVars.stressTensor(); - counter++; - } - - // divide by the number of added stress tensors and add to container - stress /= counter; - sigmax[eIdx] += stress[0]; - if (dim >= 2) - sigmay[eIdx] += stress[1]; - if (dim == 3) - sigmaz[eIdx] += stress[2]; - } - } - - writer.attachDofData(ux, "ux", isBox); - if (dim >= 2) - writer.attachDofData(uy, "uy", isBox); - if (dim == 3) - writer.attachDofData(uz, "uz", isBox); - writer.attachCellData(sigmax, "stress X", dim); - if (dim >= 2) - writer.attachCellData(sigmay, "stress Y", dim); - if (dim == 3) - writer.attachCellData(sigmaz, "stress Z", dim); - } -}; -} -#include "propertydefaults.hh" -#endif diff --git a/dumux/geomechanics/elastic/properties.hh b/dumux/geomechanics/elastic/properties.hh deleted file mode 100644 index 36cddaf7231ed1a1348ce19f3d58c82909a0a1da..0000000000000000000000000000000000000000 --- a/dumux/geomechanics/elastic/properties.hh +++ /dev/null @@ -1,58 +0,0 @@ -// -*- mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- -// vi: set et ts=4 sw=4 sts=4: -/***************************************************************************** - * See the file COPYING for full copying permissions. * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 2 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program. If not, see . * - *****************************************************************************/ -/*! - * \ingroup Properties - * \ingroup ImplicitProperties - * \ingroup ElasticBoxModel - * \file - * - * \brief Defines the properties required for the linear elasticity model. - */ - -#ifndef DUMUX_ELASTIC_PROPERTIES_HH -#define DUMUX_ELASTIC_PROPERTIES_HH - -#include -#include -#include - -namespace Dumux -{ -// \{ -namespace Properties -{ -////////////////////////////////////////////////////////////////// -// Type tags -////////////////////////////////////////////////////////////////// - -//! The type tags for the implicit model for elastic deformations of the medium -NEW_TYPE_TAG(Elastic, INHERITS_FROM(ImplicitBase)); - -////////////////////////////////////////////////////////////////// -// Property tags -////////////////////////////////////////////////////////////////// - -NEW_PROP_TAG(Indices); //!< Enumerations for the model -NEW_PROP_TAG(ProblemEnableGravity); //!< Returns whether gravity is considered in the problem -NEW_PROP_TAG(SpatialParams); //!< The type of the spatial parameters -} - -} - -#endif diff --git a/dumux/geomechanics/elastic/propertydefaults.hh b/dumux/geomechanics/elastic/propertydefaults.hh deleted file mode 100644 index 5377f9d1efb58ef43315e2ee47db3befa35d31c1..0000000000000000000000000000000000000000 --- a/dumux/geomechanics/elastic/propertydefaults.hh +++ /dev/null @@ -1,106 +0,0 @@ -// -*- mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- -// vi: set et ts=4 sw=4 sts=4: -/***************************************************************************** - * See the file COPYING for full copying permissions. * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 2 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program. If not, see . * - *****************************************************************************/ -/*! - * \ingroup Properties - * \ingroup ImplicitProperties - * \ingroup ElasticBoxModel - * \file - * - * \brief Defines some default values for the properties of the - * linear elasticity model. - */ - - -#ifndef DUMUX_ELASTIC_PROPERTIES_DEFAULTS_HH -#define DUMUX_ELASTIC_PROPERTIES_DEFAULTS_HH - -#include "properties.hh" -#include "model.hh" -#include "localresidual.hh" -#include "volumevariables.hh" -#include "indices.hh" - -#include -#include -#include - -namespace Dumux -{ -// \{ -namespace Properties -{ -////////////////////////////////////////////////////////////////// -// Property values -////////////////////////////////////////////////////////////////// - -//!< set the number of equations to the space dimension of the problem -SET_PROP(Elastic, NumEq) -{ -private: - typedef typename GET_PROP_TYPE(TypeTag, GridView) GridView; - enum{dim = GridView::dimension}; -public: - static const int value = dim; -}; - -//! Use the linear elasticity local residual function for the elasticity model -SET_TYPE_PROP(Elastic, LocalResidual, ElasticLocalResidual); - -//! define the model -SET_TYPE_PROP(Elastic, Model, ElasticModel); - -//! define the VolumeVariables -SET_TYPE_PROP(Elastic, VolumeVariables, ElasticVolumeVariablesBase); - -//! Disable advection -SET_BOOL_PROP(Elastic, EnableAdvection, false); - -//! Disable molecular diffusion -SET_BOOL_PROP(Elastic, EnableMolecularDiffusion, false); - -//! Isothermal model by default -SET_BOOL_PROP(Elastic, EnableEnergyBalance, false); - -//! define the FluxVariables -SET_PROP(Elastic, FluxVariables) -{ -private: - static constexpr bool advection = GET_PROP_VALUE(TypeTag, EnableAdvection); - static constexpr bool diffusion = GET_PROP_VALUE(TypeTag, EnableMolecularDiffusion); - static constexpr bool energy = GET_PROP_VALUE(TypeTag, EnableEnergyBalance); -public: - typedef Dumux::StressVariables type; -}; - -//! Set the indices used by the linear elasticity model -SET_TYPE_PROP(Elastic, Indices, ElasticIndices<>); - -//! enable gravity by default -SET_BOOL_PROP(Elastic, ProblemEnableGravity, true); - -//! The flux variables cache class -SET_TYPE_PROP(Elastic, FluxVariablesCache, Dumux::StressVariablesCache); - -//! The darcy flux variables -SET_TYPE_PROP(Elastic, MechanicalLawType, Dumux::HookesLaw); - -} -} - -#endif diff --git a/dumux/geomechanics/elastic/volumevariables.hh b/dumux/geomechanics/elastic/volumevariables.hh deleted file mode 100644 index c1e0ad38533da3d6fbce4a3cf0619fbdab94324a..0000000000000000000000000000000000000000 --- a/dumux/geomechanics/elastic/volumevariables.hh +++ /dev/null @@ -1,138 +0,0 @@ -// -*- mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- -// vi: set et ts=4 sw=4 sts=4: -/***************************************************************************** - * See the file COPYING for full copying permissions. * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 2 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program. If not, see . * - *****************************************************************************/ -/*! - * \file - * \brief Quantities required by the linear elasticity box - * model defined on a vertex. - */ -#ifndef DUMUX_ELASTIC_VOLUME_VARIABLES_HH -#define DUMUX_ELASTIC_VOLUME_VARIABLES_HH - -#include - -#include "properties.hh" - -namespace Dumux -{ -/*! - * \ingroup ElasticBoxModel - * \ingroup ImplicitVolumeVariables - * \brief Contains the quantities which are constant within a - * finite volume in the linear elasticity model. - */ -template -class ElasticVolumeVariablesBase : public ImplicitVolumeVariables -{ - typedef ImplicitVolumeVariables ParentType; - typedef typename GET_PROP_TYPE(TypeTag, Problem) Problem; - typedef typename GET_PROP_TYPE(TypeTag, VolumeVariables) Implementation; - typedef typename GET_PROP_TYPE(TypeTag, FVElementGeometry) FVElementGeometry; - typedef typename GET_PROP_TYPE(TypeTag, SubControlVolume) SubControlVolume; - typedef typename GET_PROP_TYPE(TypeTag, PrimaryVariables) PrimaryVariables; - typedef typename GET_PROP_TYPE(TypeTag, Indices) Indices; - - typedef typename GET_PROP_TYPE(TypeTag, GridView) GridView; - typedef typename GridView::template Codim<0>::Entity Element; - enum{ - dim = GridView::dimension, - }; - typedef typename GET_PROP_TYPE(TypeTag, Scalar) Scalar; - typedef Dune::FieldVector DimVector; - -public: - /*! - * \copydoc ImplicitVolumeVariables::update - */ - void update(const PrimaryVariables &priVars, - const Problem &problem, - const Element &element, - const SubControlVolume& scv) - { - ParentType::update(priVars, - problem, - element, - scv); - - primaryVars_ = priVars; - - for (int i = 0; i < dim; ++i) - displacement_[i] = priVars[Indices::u(i)]; - - // retrieve Lame parameters and rock density from spatialParams - const Dune::FieldVector &lameParams = problem.spatialParams().lameParams(element, scv); - lambda_ = lameParams[0]; - mu_ = lameParams[1]; - rockDensity_ = problem.spatialParams().rockDensity(element, scv); - } - - /*! - * \brief Return the vector of primary variables - */ - const PrimaryVariables &primaryVars() const - { return primaryVars_; } - - /*! - * \brief Sets the evaluation point used in the by the local jacobian. - */ - void setEvalPoint(const Implementation *ep) - { } - - /*! - * \brief Return the Lame parameter lambda \f$\mathrm{[Pa]}\f$ within the control volume. - */ - Scalar lambda() const - { return lambda_; } - - /*! - * \brief Return the Lame parameter mu \f$\mathrm{[Pa]}\f$ within the control volume. - */ - Scalar mu() const - { return mu_; } - - /*! - * \brief Returns the rock density \f$\mathrm{[kg / m^3]}\f$ within the control volume . - */ - Scalar rockDensity() const - { return rockDensity_; } - - /*! - * \brief Returns the solid displacement \f$\mathrm{[m]}\f$ in space - * directions dimIdx within the control volume. - */ - Scalar displacement(int dimIdx) const - { return displacement_[dimIdx]; } - - /*! - * \brief Returns the solid displacement vector \f$\mathrm{[m]}\f$ - * within the control volume. - */ - const DimVector &displacement() const - { return displacement_; } - -protected: - PrimaryVariables primaryVars_; - DimVector displacement_; - Scalar lambda_; - Scalar mu_; - Scalar rockDensity_; -}; - -} - -#endif diff --git a/dumux/geomechanics/implicit/CMakeLists.txt b/dumux/geomechanics/implicit/CMakeLists.txt deleted file mode 100644 index d41b715ec6c0d12eee53d925d2745a8287925838..0000000000000000000000000000000000000000 --- a/dumux/geomechanics/implicit/CMakeLists.txt +++ /dev/null @@ -1,4 +0,0 @@ -# install headers -install(FILES -stressvariables.hh -DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/dumux/geomechanics/implicit) \ No newline at end of file diff --git a/dumux/geomechanics/implicit/stressvariables.hh b/dumux/geomechanics/implicit/stressvariables.hh deleted file mode 100644 index 8e942038e0cb89ff308c9cdf169ed01d6a9125b3..0000000000000000000000000000000000000000 --- a/dumux/geomechanics/implicit/stressvariables.hh +++ /dev/null @@ -1,90 +0,0 @@ -// -*- mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- -// vi: set et ts=4 sw=4 sts=4: -/***************************************************************************** - * See the file COPYING for full copying permissions. * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 2 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program. If not, see . * - *****************************************************************************/ -/*! - * \file - * \brief The stress variables - */ -#ifndef DUMUX_GEOMECHANICS_IMPLICIT_STRESSVARIABLES_HH -#define DUMUX_GEOMECHANICS_IMPLICIT_STRESSVARIABLES_HH - -#include -#include - -namespace Dumux -{ - -namespace Properties -{ -NEW_PROP_TAG(MechanicalLawType); -} - -/*! - * \ingroup ImplicitModel - * \brief the flux variables class - * specializations are provided for combinations of physical processes - */ -template -class StressVariables {}; - -/*! - * \ingroup ImplicitModel - * \brief Base class for the flux variables - * Actual flux variables inherit from this class - */ -template -class StressVariables : public FluxVariablesBase> -{ - using ParentType = FluxVariablesBase>; - using Problem = typename GET_PROP_TYPE(TypeTag, Problem); - using GridView = typename GET_PROP_TYPE(TypeTag, GridView); - using Element = typename GridView::template Codim<0>::Entity; - using IndexType = typename GridView::IndexSet::IndexType; - using Scalar = typename GET_PROP_TYPE(TypeTag, Scalar); - using Stencil = std::vector; - using SubControlVolumeFace = typename GET_PROP_TYPE(TypeTag, SubControlVolumeFace); - using MechanicalLawType = typename GET_PROP_TYPE(TypeTag, MechanicalLawType); - - enum{ enableFluxVarsCache = GET_PROP_VALUE(TypeTag, EnableFluxVariablesCache) }; - enum { dim = GridView::dimension} ; - - typedef Dune::FieldMatrix DimMatrix; - typedef Dune::FieldVector DimVector; - -public: - - void initAndComputeFluxes(const Problem& problem, - const Element& element, - const SubControlVolumeFace &scvFace) - { - ParentType::init(problem, element, scvFace); - } - - Stencil computeStencil(const Problem& problem, const SubControlVolumeFace& scvFace) - { return MechanicalLawType::stencil(problem, scvFace); } - - DimVector stressVector() - { return MechanicalLawType::stressVector(this->problem(), this->scvFace()); } - - DimMatrix stressTensor() - { return MechanicalLawType::stressTensor(this->problem(), this->scvFace()); } -}; - -} // end namespace - -#endif diff --git a/dumux/geomechanics/implicit/stressvariablescache.hh b/dumux/geomechanics/implicit/stressvariablescache.hh deleted file mode 100644 index 67d978d339ca8d8f259cd6963a5046a019c3108d..0000000000000000000000000000000000000000 --- a/dumux/geomechanics/implicit/stressvariablescache.hh +++ /dev/null @@ -1,102 +0,0 @@ -// -*- mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- -// vi: set et ts=4 sw=4 sts=4: -/***************************************************************************** - * See the file COPYING for full copying permissions. * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 2 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program. If not, see . * - *****************************************************************************/ -/*! - * \file - * \brief Base class for the flux variables - */ -#ifndef DUMUX_GEOMECHANICS_IMPLICIT_STRESSVARIABLESCACHE_HH -#define DUMUX_GEOMECHANICS_IMPLICIT_STRESSVARIABLESCACHE_HH - -#include - -namespace Dumux -{ - -/*! - * \ingroup ImplicitModel - * \brief The stress variables cache classes - * stores matrices to recover the discplacement on a scv face and stencil - */ -template -class StressVariablesCache -{}; - -// specialization for the Box Method -template -class StressVariablesCache::type > -{ - using Scalar = typename GET_PROP_TYPE(TypeTag, Scalar); - using Problem = typename GET_PROP_TYPE(TypeTag, Problem); - using GridView = typename GET_PROP_TYPE(TypeTag, GridView); - using FluxVariables = typename GET_PROP_TYPE(TypeTag, FluxVariables); - using SubControlVolumeFace = typename GET_PROP_TYPE(TypeTag, SubControlVolumeFace); - using MechanicalLawType = typename GET_PROP_TYPE(TypeTag, MechanicalLawType); - using Element = typename GridView::template Codim<0>::Entity; - using IndexType = typename GridView::IndexSet::IndexType; - using Stencil = std::vector; - -public: - void update(const Problem& problem, - const Element& element, - const SubControlVolumeFace &scvFace) - { - FluxVariables fluxVars; - stencil_ = fluxVars.computeStencil(problem, scvFace); - } - - const Stencil& stencil() const - { return stencil_; } - -private: - Stencil stencil_; -}; - -// specialization for the cell centered tpfa method -template -class StressVariablesCache::type > -{ - using Scalar = typename GET_PROP_TYPE(TypeTag, Scalar); - using Problem = typename GET_PROP_TYPE(TypeTag, Problem); - using GridView = typename GET_PROP_TYPE(TypeTag, GridView); - using FluxVariables = typename GET_PROP_TYPE(TypeTag, FluxVariables); - using SubControlVolumeFace = typename GET_PROP_TYPE(TypeTag, SubControlVolumeFace); - using MechanicalLawType = typename GET_PROP_TYPE(TypeTag, MechanicalLawType); - using Element = typename GridView::template Codim<0>::Entity; - using IndexType = typename GridView::IndexSet::IndexType; - using Stencil = std::vector; - -public: - void update(const Problem& problem, - const Element& element, - const SubControlVolumeFace &scvFace) - { - FluxVariables fluxVars; - stencil_ = fluxVars.computeStencil(problem, scvFace); - } - - const Stencil& stencil() const - { return stencil_; } - -private: - Stencil stencil_; -}; - -} // end namespace - -#endif diff --git a/dumux/multidomain/2cnistokes2p2cni/2p2cnicouplinglocalresidual.hh b/dumux/multidomain/2cnistokes2p2cni/2p2cnicouplinglocalresidual.hh deleted file mode 100644 index f3422f812ddda6061f52a8b3bf0fcba1ce79b612..0000000000000000000000000000000000000000 --- a/dumux/multidomain/2cnistokes2p2cni/2p2cnicouplinglocalresidual.hh +++ /dev/null @@ -1,161 +0,0 @@ -// -*- mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- -// vi: set et ts=4 sw=4 sts=4: -/***************************************************************************** - * See the file COPYING for full copying permissions. * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 2 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program. If not, see . * - *****************************************************************************/ -/*! - * \file - * \brief Extending the TwoPTwoCNILocalResidual by the required functions for - * a coupled application. - */ -#ifndef DUMUX_2P2CNI_COUPLING_LOCAL_RESIDUAL_HH -#define DUMUX_2P2CNI_COUPLING_LOCAL_RESIDUAL_HH - -#include -#include -#include - -namespace Dumux -{ - -/*! - * \ingroup ImplicitLocalResidual - * \ingroup TwoPTwoCNIStokesTwoCNIModel - * \ingroup TwoPTwoCNIZeroEqTwoCNIModel - * \brief Extending the TwoPTwoCNILocalResidual by the required functions for - * a coupled application. - */ -template -class TwoPTwoCNICouplingLocalResidual : public NILocalResidual -{ - typedef NILocalResidual ParentType; - - typedef typename GET_PROP_TYPE(TypeTag, GridView) GridView; - typedef typename GET_PROP_TYPE(TypeTag, Scalar) Scalar; - typedef typename GET_PROP_TYPE(TypeTag, Indices) Indices; - - enum { dim = GridView::dimension }; - enum { numEq = GET_PROP_VALUE(TypeTag, NumEq) }; - enum { numPhases = GET_PROP_VALUE(TypeTag, NumPhases) }; - enum { useMoles = GET_PROP_VALUE(TypeTag, UseMoles) }; - enum { nPhaseIdx = Indices::nPhaseIdx }; - enum { wCompIdx = Indices::wCompIdx, }; - enum { - massBalanceIdx = GET_PROP_VALUE(TypeTag, ReplaceCompEqIdx), - contiWEqIdx = Indices::contiWEqIdx, - energyEqIdx = Indices::energyEqIdx - }; - - typedef typename GET_PROP_TYPE(TypeTag, VolumeVariables) VolumeVariables; - typedef typename GET_PROP_TYPE(TypeTag, ElementVolumeVariables) ElementVolumeVariables; - typedef typename GET_PROP_TYPE(TypeTag, PrimaryVariables) PrimaryVariables; - typedef typename GET_PROP_TYPE(TypeTag, FluxVariables) FluxVariables; - typedef typename GET_PROP_TYPE(TypeTag, BoundaryTypes) BoundaryTypes; - typedef typename GET_PROP_TYPE(TypeTag, FluidSystem) FluidSystem; - typedef Dune::BlockVector > ElementFluxVector; - - typedef Dune::FieldVector DimVector; - -public: - /*! - * \brief Implementation of the boundary evaluation for the Darcy model - * - * Evaluate one part of the Dirichlet-like coupling conditions for a single - * sub-control volume face; rest is done in the local coupling operator - */ - void evalBoundary_() - { - ParentType::evalBoundary_(); - - typedef Dune::ReferenceElements ReferenceElements; - typedef Dune::ReferenceElement ReferenceElement; - const ReferenceElement &refElement = ReferenceElements::general(this->element_().geometry().type()); - - for (int scvIdx = 0; scvIdx < this->fvGeometry_().numScv; scvIdx++) - { - // consider only SCVs on the boundary - if (this->fvGeometry_().subContVol[scvIdx].inner) - continue; - - // evaluate boundary conditions for the intersections of the current element - for (const auto& intersection : intersections(this->gridView_(), this->element_())) - { - // handle only intersections on the boundary - if (!intersection.boundary()) - continue; - - // assemble the boundary for all vertices of the current face - const int fIdx = intersection.indexInInside(); - const int numFaceVertices = refElement.size(fIdx, 1, dim); - - // loop over the single vertices on the current face - for (int faceVertexIdx = 0; faceVertexIdx < numFaceVertices; ++faceVertexIdx) - { - // only evaluate, if we consider the same face vertex as in the outer - // loop over the element vertices - if (refElement.subEntity(fIdx, 1, faceVertexIdx, dim) != scvIdx) - continue; - - const VolumeVariables &volVars = this->curVolVars_()[scvIdx]; - - // set pressure as part of the momentum coupling - if (this->bcTypes_(scvIdx).isCouplingDirichlet(massBalanceIdx)) - this->residual_[scvIdx][massBalanceIdx] = volVars.pressure(nPhaseIdx); - - // set mass/mole fraction for transported component - static_assert(GET_PROP_VALUE(TypeTag, NumComponents) == 2, - "This coupling condition is only implemented for two components."); - if (this->bcTypes_(scvIdx).isCouplingDirichlet(contiWEqIdx)) - { - if (useMoles) - this->residual_[scvIdx][contiWEqIdx] = volVars.moleFraction(nPhaseIdx, wCompIdx); - else - this->residual_[scvIdx][contiWEqIdx] = volVars.massFraction(nPhaseIdx, wCompIdx); - } - - // set temperature - if (this->bcTypes_(scvIdx).isCouplingDirichlet(energyEqIdx)) - this->residual_[scvIdx][energyEqIdx] = volVars.temperature(); - } - } - } - } - - /*! - * \brief Evaluates the time derivative of the storage term - * - * \param storage The vector in which the result is written - * \param scvIdx The sub-control-volume index - */ - void evalStorageDerivative(PrimaryVariables &storage, const int scvIdx) const - { - PrimaryVariables result; - this->computeStorage(result, scvIdx, false); - Valgrind::CheckDefined(result); - storage = result; - this->computeStorage(result, scvIdx, true); - Valgrind::CheckDefined(result); - storage -= result; - - storage *= this->fvGeometry_().subContVol[scvIdx].volume - / this->problem_().timeManager().timeStepSize() - * this->curVolVars_(scvIdx).extrusionFactor(); - } -}; - -} // namespace Dumux - -#endif // DUMUX_2P2CNI_COUPLING_LOCAL_RESIDUAL_HH diff --git a/dumux/multidomain/2cnistokes2p2cni/CMakeLists.txt b/dumux/multidomain/2cnistokes2p2cni/CMakeLists.txt deleted file mode 100644 index 2756ffc388598803c3ff13d699e2db7855f77609..0000000000000000000000000000000000000000 --- a/dumux/multidomain/2cnistokes2p2cni/CMakeLists.txt +++ /dev/null @@ -1,9 +0,0 @@ - -#install headers -install(FILES -localoperator.hh -properties.hh -propertydefaults.hh -2p2cnicouplinglocalresidual.hh -stokesncnicouplinglocalresidual.hh -DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/dumux/multidomain/2cnistokes2p2cni) diff --git a/dumux/multidomain/2cnistokes2p2cni/localoperator.hh b/dumux/multidomain/2cnistokes2p2cni/localoperator.hh deleted file mode 100644 index 8db004ebf0da080ce377b01a3f257a5cb7f77e6c..0000000000000000000000000000000000000000 --- a/dumux/multidomain/2cnistokes2p2cni/localoperator.hh +++ /dev/null @@ -1,357 +0,0 @@ -// -*- mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- -// vi: set et ts=4 sw=4 sts=4: -/***************************************************************************** - * See the file COPYING for full copying permissions. * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 2 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program. If not, see . * - *****************************************************************************/ -/*! - * \file - * \brief This local operator extends the 2cstokes2p2clocaloperator - * by non-isothermal conditions. - */ -#ifndef DUMUX_TWOCNISTOKES2P2CNILOCALOPERATOR_HH -#define DUMUX_TWOCNISTOKES2P2CNILOCALOPERATOR_HH - -#include - -namespace Dumux { - -/*! - * \ingroup TwoPTwoCNIStokesTwoCNIModel - * \ingroup TwoPTwoCNIZeroEqTwoCNIModel - * \brief The extension of the local operator for the coupling of a two-component Stokes model - * and a two-phase two-component Darcy model for non-isothermal conditions. - * - * This model implements the coupling between a free-flow model - * and a porous-medium flow model under non-isothermal conditions. - * Here the coupling conditions for the individual balance are presented: - * - * The total mass balance equation: - * \f[ - * \left[ - * \left( \varrho_\textrm{g} {\boldsymbol{v}}_\textrm{g} \right) \cdot \boldsymbol{n} - * \right]^\textrm{ff} - * = -\left[ - * \left( \varrho_\textrm{g} \boldsymbol{v}_\textrm{g} - * + \varrho_\textrm{l} \boldsymbol{v}_\textrm{l} \right) \cdot \boldsymbol{n} - * \right]^\textrm{pm} - * \f] - * in which \f$n\f$ represents a vector normal to the interface pointing outside of - * the specified subdomain. - * - * The momentum balance (tangential), which corresponds to the Beavers-Jospeh Saffman condition: - * \f[ - * \left[ - * \left( {\boldsymbol{v}}_\textrm{g} - * + \frac{\sqrt{\left(\boldsymbol{K} \boldsymbol{t}_i \right) \cdot \boldsymbol{t}_i}} - * {\alpha_\textrm{BJ} \mu_\textrm{g}} \boldsymbol{{\tau}}_\textrm{t} \boldsymbol{n} - * \right) \cdot \boldsymbol{t}_i - * \right]^\textrm{ff} - * = 0 - * \f] - * with - * \f$ - * \boldsymbol{{\tau}_\textrm{t}} = \left[ \mu_\textrm{g} + \mu_\textrm{g,t} \right] - * \nabla \left( \boldsymbol{v}_\textrm{g} - * + \boldsymbol{v}_\textrm{g}^\intercal \right) - * \f$ - * in which the eddy viscosity \f$ \mu_\textrm{g,t} = 0 \f$ for the Stokes equation. - * - * The momentum balance (normal): - * \f[ - * \left[ - * \left( - * \left\lbrace - * \varrho_\textrm{g} {\boldsymbol{v}}_\textrm{g} {\boldsymbol{v}}_\textrm{g}^\intercal - * - \boldsymbol{{\tau}}_\textrm{t} - * + {p}_\textrm{g} \boldsymbol{I} - * \right\rbrace \boldsymbol{n} - * \right) \cdot \boldsymbol{n} - * \right]^\textrm{ff} - * = p_\textrm{g}^\textrm{pm} - * \f] - * - * The component mass balance equation (continuity of fluxes): - * \f[ - * \left[ - * \left( - * \varrho_\textrm{g} {X}^\kappa_\textrm{g} {\boldsymbol{v}}_\textrm{g} - * - {\boldsymbol{j}}^\kappa_\textrm{g,ff,t,diff} - * \right) \cdot \boldsymbol{n} - * \right]^\textrm{ff} - * = -\left[ - * \left( - * \varrho_\textrm{g} X^\kappa_\textrm{g} \boldsymbol{v}_\textrm{g} - * - \boldsymbol{j}^\kappa_\textrm{g,pm,diff} - * + \varrho_\textrm{l} \boldsymbol{v}_\textrm{l} X^\kappa_\textrm{l} - * - \boldsymbol{j}^\kappa_\textrm{l,pm,diff} - * \right) \cdot \boldsymbol{n} - * \right]^\textrm{pm} - * = 0 - * \f] - * in which the diffusive fluxes \f$ j_\textrm{diff} \f$ are the diffusive fluxes as - * they are implemented in the individual subdomain models. - * - * The component mass balance equation (continuity of mass/ mole fractions): - * \f[ - * \left[ {X}^{\kappa}_\textrm{g} \right]^\textrm{ff} - * = \left[ X^{\kappa}_\textrm{g} \right]^\textrm{pm} - * \f] - * - * The energy balance equation (continuity of fluxes): - * \f[ - * \left[ - * \left( - * \varrho_\textrm{g} {h}_\textrm{g} {\boldsymbol{v}}_\textrm{g} - * - {h}^\textrm{a}_\textrm{g} {\boldsymbol{j}}^\textrm{a}_\textrm{g,ff,t,diff} - * - {h}^\textrm{w}_\textrm{g} {\boldsymbol{j}}^\textrm{w}_\textrm{g,ff,t,diff} - * - \left( \lambda_\textrm{g} + \lambda_\textrm{g,t} \right) \nabla {T} - * \right) \cdot \boldsymbol{n} - * \right]^\textrm{ff} - * = -\left[ - * \left( - * \varrho_\textrm{g} h_\textrm{g} \boldsymbol{v}_\textrm{g} - * + \varrho_\textrm{l} h_\textrm{l} \boldsymbol{v}_\textrm{l} - * - \lambda_\textrm{pm} \nabla T - * \right) \cdot \boldsymbol{n} - * \right]^\textrm{pm} - * \f] - * - * The energy balance equation (continuity of temperature): - * \f[ - * \left[ {T} \right]^\textrm{ff} - * = \left[ T \right]^\textrm{pm} - * \f] - * - * This is discretized by a fully-coupled vertex-centered finite volume - * (box) scheme in space and by the implicit Euler method in time. - */ -template -class TwoCNIStokesTwoPTwoCNILocalOperator : - public TwoCStokesTwoPTwoCLocalOperator -{ -public: - typedef TwoCStokesTwoPTwoCLocalOperator ParentType; - typedef typename GET_PROP_TYPE(TypeTag, Problem) GlobalProblem; - - typedef typename GET_PROP_TYPE(TypeTag, SubDomain1TypeTag) Stokes2cniTypeTag; - typedef typename GET_PROP_TYPE(TypeTag, SubDomain2TypeTag) TwoPTwoCNITypeTag; - - typedef typename GET_PROP_TYPE(TypeTag, FluidSystem) FluidSystem; - - typedef typename GET_PROP_TYPE(Stokes2cniTypeTag, FluxVariables) BoundaryVariables1; - typedef typename GET_PROP_TYPE(TwoPTwoCNITypeTag, FluxVariables) BoundaryVariables2; - - typedef typename GET_PROP_TYPE(TypeTag, MultiDomainGrid) MDGrid; - - typedef typename GET_PROP_TYPE(Stokes2cniTypeTag, GridView) Stokes2cniGridView; - typedef typename GET_PROP_TYPE(TwoPTwoCNITypeTag, GridView) TwoPTwoCNIGridView; - typedef typename Stokes2cniGridView::template Codim<0>::Entity SDElement1; - typedef typename TwoPTwoCNIGridView::template Codim<0>::Entity SDElement2; - - typedef typename GET_PROP_TYPE(Stokes2cniTypeTag, Indices) Stokes2cniIndices; - typedef typename GET_PROP_TYPE(TwoPTwoCNITypeTag, Indices) TwoPTwoCNIIndices; - - enum { - dimWorld = MDGrid::dimensionworld - }; - - // Stokes - enum { numComponents1 = Stokes2cniIndices::numComponents }; - enum { // equation indices - energyEqIdx1 = Stokes2cniIndices::energyEqIdx //!< Index of the energy balance equation - }; - enum { // component indices - transportCompIdx1 = Stokes2cniIndices::transportCompIdx, //!< Index of transported component - phaseCompIdx1 = Stokes2cniIndices::phaseCompIdx //!< Index of main component of the phase - }; - - // Darcy - enum { numPhases2 = GET_PROP_VALUE(TwoPTwoCNITypeTag, NumPhases) }; - enum { // equation indices - energyEqIdx2 = TwoPTwoCNIIndices::energyEqIdx //!< Index of the energy balance equation - }; - enum { // phase indices - wPhaseIdx2 = TwoPTwoCNIIndices::wPhaseIdx, //!< Index for the liquid phase - nPhaseIdx2 = TwoPTwoCNIIndices::nPhaseIdx //!< Index for the gas phase - }; - - typedef typename GET_PROP_TYPE(TypeTag, Scalar) Scalar; - typedef typename MDGrid::ctype CoordScalar; - typedef Dune::FieldVector GlobalPosition; - - // multidomain flags - static const bool doAlphaCoupling = true; - static const bool doPatternCoupling = true; - - TwoCNIStokesTwoPTwoCNILocalOperator(GlobalProblem& globalProblem) - : ParentType(globalProblem) - { } - -public: - //! \copydoc TwoCStokesTwoPTwoCLocalOperator::evalCoupling() - template - void evalCoupling(const LFSU1& lfsu1, const LFSU2& lfsu2, - const int vertInElem1, const int vertInElem2, - const SDElement1& sdElement1, const SDElement2& sdElement2, - const BoundaryVariables1& boundaryVars1, const BoundaryVariables2& boundaryVars2, - const CParams &cParams, - RES1& couplingRes1, RES2& couplingRes2) const - { - // evaluate coupling of mass and momentum balances - ParentType::evalCoupling(lfsu1, lfsu2, - vertInElem1, vertInElem2, - sdElement1, sdElement2, - boundaryVars1, boundaryVars2, - cParams, - couplingRes1, couplingRes2); - - const GlobalPosition& globalPos1 = cParams.fvGeometry1.subContVol[vertInElem1].global; - const GlobalPosition& globalPos2 = cParams.fvGeometry2.subContVol[vertInElem2].global; - - // ENERGY Balance - // Neumann-like conditions - if (cParams.boundaryTypes1.isCouplingNeumann(energyEqIdx1)) - { - if (this->globalProblem().sdProblem2().isCornerPoint(globalPos2)) - { - // convective energy flux (enthalpy is mass based, mass flux also needed for useMoles) - Scalar convectiveFlux = 0.0; - for (int phaseIdx=0; phaseIdxglobalProblem().localResidual2().residual(vertInElem2)[energyEqIdx2]); - } - } - if (cParams.boundaryTypes2.isCouplingNeumann(energyEqIdx2)) - { - const GlobalPosition& bfNormal1 = boundaryVars1.face().normal; - // only enter here, if a boundary layer model is used for the computation of the diffusive fluxes - if (ParentType::blModel_) - { - // convective energy flux (enthalpy is mass based, mass flux also needed for useMoles) - Scalar convectiveFlux = boundaryVars1.normalVelocity() - * cParams.elemVolVarsCur1[vertInElem1].density() - * cParams.elemVolVarsCur1[vertInElem1].enthalpy(); - - // conductive energy flux - Scalar conductiveFlux = bfNormal1.two_norm() - * this->globalProblem().evalBoundaryLayerTemperatureGradient(cParams, vertInElem1) - * (boundaryVars1.thermalConductivity() - + boundaryVars1.thermalEddyConductivity()); - - // enthalpy transported by diffusive fluxes - Scalar sumDiffusiveFluxes = 0.0; - Scalar sumDiffusiveEnergyFlux = 0.0; - for (int compIdx=0; compIdx < numComponents1; compIdx++) - { - if (compIdx != phaseCompIdx1) - { - Scalar diffusiveFlux = bfNormal1.two_norm() - * this->globalProblem().evalBoundaryLayerConcentrationGradient(cParams, vertInElem1) - * (boundaryVars1.diffusionCoeff(compIdx) - + boundaryVars1.eddyDiffusivity()) - * boundaryVars1.molarDensity() - * this->globalProblem().evalMassTransferCoefficient(cParams, vertInElem1, vertInElem2); - sumDiffusiveFluxes += diffusiveFlux; - sumDiffusiveEnergyFlux += diffusiveFlux - * boundaryVars1.componentEnthalpy(compIdx) - * FluidSystem::molarMass(compIdx); // Multiplied by molarMass [kg/mol] to convert from [mol/m^3 s] to [kg/m^3 s] - } - } - sumDiffusiveEnergyFlux -= sumDiffusiveFluxes - * boundaryVars1.componentEnthalpy(phaseCompIdx1) - * FluidSystem::molarMass(phaseCompIdx1); - - couplingRes2.accumulate(lfsu2.child(energyEqIdx2), vertInElem2, - -(convectiveFlux - sumDiffusiveEnergyFlux - conductiveFlux)); - } - else if (this->globalProblem().sdProblem1().isCornerPoint(globalPos1)) - { - // convective energy flux (enthalpy is mass based, mass flux also needed for useMoles) - Scalar convectiveFlux = boundaryVars1.normalVelocity() - * cParams.elemVolVarsCur1[vertInElem1].density() - * cParams.elemVolVarsCur1[vertInElem1].enthalpy(); - - // conductive energy flux - Scalar conductiveFlux = bfNormal1 - * boundaryVars1.temperatureGrad() - * (boundaryVars1.thermalConductivity() - + boundaryVars1.thermalEddyConductivity()); - - // enthalpy transported by diffusive fluxes - Scalar sumDiffusiveFluxes = 0.0; - Scalar sumDiffusiveEnergyFlux = 0.0; - for (int compIdx=0; compIdx < numComponents1; compIdx++) - { - if (compIdx != phaseCompIdx1) - { - Scalar diffusiveFlux = bfNormal1 - * boundaryVars1.moleFractionGrad(compIdx) - * (boundaryVars1.diffusionCoeff(compIdx) - + boundaryVars1.eddyDiffusivity()) - * boundaryVars1.molarDensity(); - sumDiffusiveFluxes += diffusiveFlux; - sumDiffusiveEnergyFlux += diffusiveFlux - * boundaryVars1.componentEnthalpy(compIdx) - * FluidSystem::molarMass(compIdx); // Multiplied by molarMass [kg/mol] to convert from [mol/m^3 s] to [kg/m^3 s] - } - } - sumDiffusiveEnergyFlux -= sumDiffusiveFluxes - * boundaryVars1.componentEnthalpy(phaseCompIdx1) - * FluidSystem::molarMass(phaseCompIdx1); - - couplingRes2.accumulate(lfsu2.child(energyEqIdx2), vertInElem2, - -(convectiveFlux - sumDiffusiveEnergyFlux - conductiveFlux)); - } - else - { - couplingRes2.accumulate(lfsu2.child(energyEqIdx2), vertInElem2, - this->globalProblem().localResidual1().residual(vertInElem1)[energyEqIdx1]); - } - } - - // Dirichlet-like conditions - if (cParams.boundaryTypes1.isCouplingDirichlet(energyEqIdx1)) - { - // set residualStokes[energyIdx1] = T in stokesncnicouplinglocalresidual.hh - couplingRes1.accumulate(lfsu1.child(energyEqIdx1), vertInElem1, - -cParams.elemVolVarsCur2[vertInElem2].temperature()); - } - - if (cParams.boundaryTypes2.isCouplingDirichlet(energyEqIdx2)) - { - // set residualDarcy[energyEqIdx2] = T in 2p2cnicouplinglocalresidual.hh - couplingRes2.accumulate(lfsu2.child(energyEqIdx2), vertInElem2, - -cParams.elemVolVarsCur1[vertInElem1].temperature()); - } - } -}; -} // end namespace Dumux - -#endif // DUMUX_TWOCNISTOKES2P2CNILOCALOPERATOR_HH diff --git a/dumux/multidomain/2cnistokes2p2cni/problem.hh b/dumux/multidomain/2cnistokes2p2cni/problem.hh deleted file mode 100644 index 0b87fbfb5de52081b338c92d665348e0b488857c..0000000000000000000000000000000000000000 --- a/dumux/multidomain/2cnistokes2p2cni/problem.hh +++ /dev/null @@ -1,88 +0,0 @@ -// -*- mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- -// vi: set et ts=4 sw=4 sts=4: -/***************************************************************************** - * See the file COPYING for full copying permissions. * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 2 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program. If not, see . * - *****************************************************************************/ -/*! - * \file - * \brief The problem class for the coupling of a non-isothermal two-component Stokes - * and a non-isothermal two-phase two-component Darcy model. - */ - -#ifndef DUMUX_2CNI_STOKES_2P2CNI_PROBLEM_HH -#define DUMUX_2CNI_STOKES_2P2CNI_PROBLEM_HH - -#include -#include -#include - -#include "properties.hh" - -namespace Dumux -{ - -/*! - * \ingroup TwoPTwoCNIStokesTwoCNIModel - * \ingroup TwoPTwoCNIZeroEqTwoCNIModel - * \brief The problem class for the coupling of a non-isothermal two-component Stokes - * and a non-isothermal two-phase two-component Darcy model. - */ -template -class TwoCNIStokesTwoPTwoCNIProblem : public TwoCStokesTwoPTwoCProblem -{ - typedef TwoCStokesTwoPTwoCProblem ParentType; - typedef typename GET_PROP_TYPE(TypeTag, Problem) Implementation; - - typedef typename GET_PROP_TYPE(TypeTag, Scalar) Scalar; - typedef typename GET_PROP_TYPE(TypeTag, TimeManager) TimeManager; - -public: - //! The constructor - template - TwoCNIStokesTwoPTwoCNIProblem(TimeManager &timeManager, - GridView gridView) - : ParentType(timeManager, gridView) - { } - - /*! - * \brief Returns the temperature gradient through the boundary layer - * - * \param cParams a parameter container - * \param scvIdx The local index of the sub-control volume of the Stokes domain - */ - template - Scalar evalBoundaryLayerTemperatureGradient(CParams cParams, const int scvIdx) const - { - const Scalar temperatureOut = GET_RUNTIME_PARAM_FROM_GROUP(TypeTag, Scalar, FreeFlow, RefTemperature); - Scalar normalTemperatureGrad = cParams.elemVolVarsCur1[scvIdx].temperature() - - temperatureOut; - return normalTemperatureGrad - / asImp_().evalBoundaryLayerModel(cParams, scvIdx).thermalBoundaryLayerThickness(); - } - -private: - //! Returns the implementation of the problem (i.e. static polymorphism) - Implementation &asImp_() - { return *static_cast(this); } - - //! \copydoc asImp_() - const Implementation &asImp_() const - { return *static_cast(this); } -}; - -} // namespace Dumux - -#endif // DUMUX_2CNI_STOKES_2P2CNI_PROBLEM_HH diff --git a/dumux/multidomain/2cnistokes2p2cni/properties.hh b/dumux/multidomain/2cnistokes2p2cni/properties.hh deleted file mode 100644 index 5bc41ce38fa99919cbcf712733a0ad22bee35f10..0000000000000000000000000000000000000000 --- a/dumux/multidomain/2cnistokes2p2cni/properties.hh +++ /dev/null @@ -1,58 +0,0 @@ -// -*- mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- -// vi: set et ts=4 sw=4 sts=4: -/***************************************************************************** - * See the file COPYING for full copying permissions. * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 2 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program. If not, see . * - *****************************************************************************/ -/*! - * \file - * \ingroup Properties - * \ingroup ImplicitProperties - * \ingroup MultidomainModel - * - * \brief Defines the properties required for the coupled 2cnistokes2p2cni model. - */ - -#ifndef DUMUX_TWOCNISTOKESTWOPTWOCNI_PROPERTIES_HH -#define DUMUX_TWOCNISTOKESTWOPTWOCNI_PROPERTIES_HH - -#include - -namespace Dumux -{ - -//////////////////////////////// -// properties -//////////////////////////////// -namespace Properties -{ - -////////////////////////////////////////////////////////////////// -// Type tags -////////////////////////////////////////////////////////////////// - -//! The type tags for the coupled 2cnistokes2p2cni model -NEW_TYPE_TAG(TwoCNIStokesTwoPTwoCNI, INHERITS_FROM(TwoCStokesTwoPTwoC)); - -////////////////////////////////////////////////////////////////// -// Property tags -////////////////////////////////////////////////////////////////// - -} // end namespace properties - -} // end namespace Dumux - - -#endif diff --git a/dumux/multidomain/2cnistokes2p2cni/propertydefaults.hh b/dumux/multidomain/2cnistokes2p2cni/propertydefaults.hh deleted file mode 100644 index 704d8a6110575a9d47934905be10764e1a74626b..0000000000000000000000000000000000000000 --- a/dumux/multidomain/2cnistokes2p2cni/propertydefaults.hh +++ /dev/null @@ -1,46 +0,0 @@ -// -*- mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- -// vi: set et ts=4 sw=4 sts=4: -/***************************************************************************** - * See the file COPYING for full copying permissions. * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 2 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program. If not, see . * - *****************************************************************************/ -/*! - * \file - * \ingroup Properties - * \ingroup ImplicitProperties - * \ingroup MultidomainModel - * - * \brief Defines default values for the properties required by the - * coupled 2cnistokes2p2cni model. - */ -#ifndef DUMUX_TWOCNISTOKESTWOPTWOCNI_PROPERTY_DEFAULTS_HH -#define DUMUX_TWOCNISTOKESTWOPTWOCNI_PROPERTY_DEFAULTS_HH - -#include "properties.hh" - -namespace Dumux -{ -namespace Properties -{ -////////////////////////////////////////////////////////////////// -// Property defaults -////////////////////////////////////////////////////////////////// - - -} // end namespace properties - -} // end namespace Dumux - -#endif diff --git a/dumux/multidomain/2cnistokes2p2cni/stokesncnicouplinglocalresidual.hh b/dumux/multidomain/2cnistokes2p2cni/stokesncnicouplinglocalresidual.hh deleted file mode 100644 index 77499416125fc8e28d3afbf583203d4c26e6549c..0000000000000000000000000000000000000000 --- a/dumux/multidomain/2cnistokes2p2cni/stokesncnicouplinglocalresidual.hh +++ /dev/null @@ -1,199 +0,0 @@ -// -*- mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- -// vi: set et ts=4 sw=4 sts=4: -/***************************************************************************** - * See the file COPYING for full copying permissions. * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 2 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program. If not, see . * - *****************************************************************************/ -/*! - * \file - * - * \brief Element-wise calculation of the Jacobian matrix for problems - * using the coupled compositional non-isothermal Stokes box model. - */ - -#ifndef DUMUX_STOKESNCNI_COUPLING_LOCAL_RESIDUAL_HH -#define DUMUX_STOKESNCNI_COUPLING_LOCAL_RESIDUAL_HH - -#include -#include - -namespace Dumux -{ - /*! - * \ingroup ImplicitLocalResidual - * \ingroup TwoPTwoCNIStokesTwoCNIModel - * \ingroup TwoPTwoCNIZeroEqTwoCNIModel - * \brief Element-wise calculation of the Jacobian matrix for problems - * using the coupled compositional non-isothermal Stokes box model. - * It is derived from the compositional non-isothermal Stokes box model. - */ -template -class StokesncniCouplingLocalResidual : public StokesncniLocalResidual -{ - typedef StokesncLocalResidual ParentType; - - typedef typename GET_PROP_TYPE(TypeTag, Indices) Indices; - - typedef typename GET_PROP_TYPE(TypeTag, Scalar) Scalar; - typedef typename GET_PROP_TYPE(TypeTag, GridView) GridView; - typedef typename GET_PROP_TYPE(TypeTag, FluidSystem) FluidSystem; - - enum { - dim = GridView::dimension, - dimWorld = GridView::dimensionworld, - numEq = GET_PROP_VALUE(TypeTag, NumEq), - numComponents = Indices::numComponents - }; - enum { - //indices of the equations - massBalanceIdx = Indices::massBalanceIdx, //!< Index of the mass balance - momentumXIdx = Indices::momentumXIdx, //!< Index of the x-component of the momentum balance - momentumYIdx = Indices::momentumYIdx, //!< Index of the y-component of the momentum balance - momentumZIdx = Indices::momentumZIdx, //!< Index of the z-component of the momentum balance - lastMomentumIdx = Indices::lastMomentumIdx, //!< Index of the last component of the momentum balance - transportEqIdx = Indices::transportEqIdx, //!< Index of the transport equation - energyEqIdx = Indices::energyEqIdx, //!< Index of the energy equation - conti0EqIdx = Indices::conti0EqIdx - }; - - typedef typename GridView::ctype CoordScalar; - typedef Dune::FieldVector GlobalPosition; - typedef Dune::FieldVector DimVector; - - typedef typename GET_PROP_TYPE(TypeTag, PrimaryVariables) PrimaryVariables; - - typedef typename GET_PROP_TYPE(TypeTag, VolumeVariables) VolumeVariables; - typedef typename GET_PROP_TYPE(TypeTag, FluxVariables) FluxVariables; - typedef typename GET_PROP_TYPE(TypeTag, BoundaryTypes) BoundaryTypes; - - static const bool useMoles = GET_PROP_VALUE(TypeTag, UseMoles); - -public: - /*! - * \brief Implementation of the boundary evaluation for the Stokes model - * - * Evaluate one part of the Dirichlet-like coupling conditions for a single - * sub-control volume face; rest is done in the local coupling operator - */ - void evalBoundary_() - { - ParentType::evalBoundary_(); - - typedef Dune::ReferenceElements ReferenceElements; - typedef Dune::ReferenceElement ReferenceElement; - const ReferenceElement &refElement = ReferenceElements::general(this->element_().geometry().type()); - - // loop over vertices of the element - for (int scvIdx = 0; scvIdx < this->fvGeometry_().numScv; scvIdx++) - { - // consider only SCVs on the boundary - if (this->fvGeometry_().subContVol[scvIdx].inner) - continue; - - const BoundaryTypes &bcTypes = this->bcTypes_(scvIdx); - - // evaluate boundary conditions for the intersections of the current element - for (const auto& intersection : intersections(this->gridView_(), this->element_())) - { - // handle only intersections on the boundary - if (!intersection.boundary()) - continue; - - // assemble the boundary for all vertices of the current face - const int fIdx = intersection.indexInInside(); - const int numFaceVertices = refElement.size(fIdx, 1, dim); - - // loop over the single vertices on the current face - for (int faceVertexIdx = 0; faceVertexIdx < numFaceVertices; ++faceVertexIdx) - { - // only evaluate, if we consider the same face vertex as in the outer - // loop over the element vertices - if (refElement.subEntity(fIdx, 1, faceVertexIdx, dim) != scvIdx) - continue; - - const int boundaryFaceIdx = this->fvGeometry_().boundaryFaceIndex(fIdx, faceVertexIdx); - FluxVariables boundaryVars; - boundaryVars.update(this->problem_(), - this->element_(), - this->fvGeometry_(), - boundaryFaceIdx, - this->curVolVars_(), - true); - const VolumeVariables &volVars = this->curVolVars_()[scvIdx]; - - - // set velocity normal to the interface - if (bcTypes.isCouplingDirichlet(momentumYIdx)) - { - this->residual_[scvIdx][momentumYIdx] = volVars.velocity() - * boundaryVars.face().normal - / boundaryVars.face().normal.two_norm(); - Valgrind::CheckDefined(this->residual_[scvIdx][momentumYIdx]); - } - - // add pressure correction - required for pressure coupling, - // if p.n comes from the pm - if (bcTypes.isCouplingNeumann(momentumYIdx) || bcTypes.isCouplingMortar(momentumYIdx)) - { - this->residual_[scvIdx][momentumYIdx] -= volVars.pressure() - * boundaryVars.face().normal[momentumYIdx]; - Valgrind::CheckDefined(this->residual_[scvIdx][momentumYIdx]); - } - - // set mole fraction for the transported components - for (int compIdx = 0; compIdx < numComponents; compIdx++) - { - int eqIdx = conti0EqIdx + compIdx; - if ((eqIdx != massBalanceIdx) && bcTypes.isCouplingDirichlet(eqIdx)) - { - if(useMoles) - this->residual_[scvIdx][eqIdx] = volVars.moleFraction(compIdx); - else - this->residual_[scvIdx][eqIdx] = volVars.massFraction(compIdx); - Valgrind::CheckDefined(this->residual_[scvIdx][compIdx]); - } - } - - // set temperature - if (bcTypes.isCouplingDirichlet(energyEqIdx)) - { - this->residual_[scvIdx][energyEqIdx] = volVars.temperature(); - Valgrind::CheckDefined(this->residual_[scvIdx][energyEqIdx]); - } - } - } - } - } - - /*! - * \brief Removes the stabilization for the Stokes model. - */ - void evalBoundaryPDELab_() - { - // loop over vertices of the element - for (int idx = 0; idx < this->fvGeometry_().numScv; idx++) - { - // consider only SCVs on the boundary - if (this->fvGeometry_().subContVol[idx].inner) - continue; - - this->removeStabilizationAtBoundary_(idx); - } - } -}; - -} // Dumux - -#endif // DUMUX_STOKESNCNI_COUPLING_LOCAL_RESIDUAL_HH diff --git a/dumux/multidomain/2cstokes2p2c/2p2ccouplinglocalresidual.hh b/dumux/multidomain/2cstokes2p2c/2p2ccouplinglocalresidual.hh deleted file mode 100644 index 9d9a480da3b3b8ded2e421413809fc210067ab4b..0000000000000000000000000000000000000000 --- a/dumux/multidomain/2cstokes2p2c/2p2ccouplinglocalresidual.hh +++ /dev/null @@ -1,158 +0,0 @@ -// -*- mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- -// vi: set et ts=4 sw=4 sts=4: -/***************************************************************************** - * See the file COPYING for full copying permissions. * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 2 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program. If not, see . * - *****************************************************************************/ -/*! - * \file - * \brief Extending the TwoPTwoCLocalResidual by the required functions for - * a coupled application. - */ -#ifndef DUMUX_2P2C_COUPLING_LOCAL_RESIDUAL_HH -#define DUMUX_2P2C_COUPLING_LOCAL_RESIDUAL_HH - -#include -#include -#include - -namespace Dumux -{ - -/*! - * \ingroup ImplicitLocalResidual - * \ingroup TwoPTwoCStokesTwoCModel - * \ingroup TwoPTwoCZeroEqTwoCModel - * \brief Extending the TwoPTwoCLocalResidual by the required functions for - * a coupled application. - */ -template -class TwoPTwoCCouplingLocalResidual : public TwoPTwoCLocalResidual -{ - typedef TwoPTwoCLocalResidual ParentType; - - typedef typename GET_PROP_TYPE(TypeTag, GridView) GridView; - typedef typename GET_PROP_TYPE(TypeTag, Scalar) Scalar; - typedef typename GET_PROP_TYPE(TypeTag, Indices) Indices; - - enum { dim = GridView::dimension }; - enum { useMoles = GET_PROP_VALUE(TypeTag, UseMoles) }; - enum { nPhaseIdx = Indices::nPhaseIdx }; - enum { wCompIdx = Indices::wCompIdx }; - enum { - massBalanceIdx = GET_PROP_VALUE(TypeTag, ReplaceCompEqIdx), - contiWEqIdx = Indices::contiWEqIdx - }; - - typedef typename GET_PROP_TYPE(TypeTag, VolumeVariables) VolumeVariables; - typedef typename GET_PROP_TYPE(TypeTag, ElementVolumeVariables) ElementVolumeVariables; - typedef typename GET_PROP_TYPE(TypeTag, PrimaryVariables) PrimaryVariables; - typedef typename GET_PROP_TYPE(TypeTag, FluxVariables) FluxVariables; - typedef typename GET_PROP_TYPE(TypeTag, BoundaryTypes) BoundaryTypes; - typedef typename GET_PROP_TYPE(TypeTag, FluidSystem) FluidSystem; - typedef Dune::BlockVector > ElementFluxVector; - - typedef Dune::FieldVector DimVector; - -public: - /*! - * \brief Implementation of the boundary evaluation for the Darcy model - * - * Evaluate one part of the Dirichlet-like coupling conditions for a single - * sub-control volume face; rest is done in the local coupling operator - */ - void evalBoundary_() - { - ParentType::evalBoundary_(); - - typedef Dune::ReferenceElements ReferenceElements; - typedef Dune::ReferenceElement ReferenceElement; - const ReferenceElement &refElement = ReferenceElements::general(this->element_().geometry().type()); - - // loop over vertices of the element - for (int scvIdx = 0; scvIdx < this->fvGeometry_().numScv; scvIdx++) - { - // consider only SCVs on the boundary - if (this->fvGeometry_().subContVol[scvIdx].inner) - continue; - - // evaluate boundary conditions for the intersections of the current element - for (const auto& intersection : intersections(this->gridView_(), this->element_())) - { - // handle only intersections on the boundary - if (!intersection.boundary()) - continue; - - // assemble the boundary for all vertices of the current face - const int fIdx = intersection.indexInInside(); - const int numFaceVertices = refElement.size(fIdx, 1, dim); - - // loop over the single vertices on the current face - for (int faceVertexIdx = 0; faceVertexIdx < numFaceVertices; ++faceVertexIdx) - { - // only evaluate, if we consider the same face vertex as in the outer - // loop over the element vertices - if (refElement.subEntity(fIdx, 1, faceVertexIdx, dim) != scvIdx) - continue; - - const VolumeVariables &volVars = this->curVolVars_()[scvIdx]; - - // set pressure as part of the momentum coupling - if (this->bcTypes_(scvIdx).isCouplingDirichlet(massBalanceIdx)) - this->residual_[scvIdx][massBalanceIdx] = volVars.pressure(nPhaseIdx); - - // set mass/mole fraction for transported component - static_assert(GET_PROP_VALUE(TypeTag, NumComponents) == 2, - "This coupling condition is only implemented for two components."); - if (this->bcTypes_(scvIdx).isCouplingDirichlet(contiWEqIdx)) - { - if (useMoles) - this->residual_[scvIdx][contiWEqIdx] = volVars.moleFraction(nPhaseIdx, wCompIdx); - else - this->residual_[scvIdx][contiWEqIdx] = volVars.massFraction(nPhaseIdx, wCompIdx); - } - } - } - } - } - - /*! - * \brief Evaluates the time derivative of the storage term - * - * \param storage The vector in which the result is written - * \param scvIdx The sub-control-volume index - */ - void evalStorageDerivative(PrimaryVariables &storage, const int scvIdx) const - { - PrimaryVariables result; - this->computeStorage(result, scvIdx, false); - Valgrind::CheckDefined(result); - storage = result; - this->computeStorage(result, scvIdx, true); - Valgrind::CheckDefined(result); - storage -= result; - - storage *= this->fvGeometry_().subContVol[scvIdx].volume - / this->problem_().timeManager().timeStepSize() - * this->curVolVars_(scvIdx).extrusionFactor(); - } - -protected: - ElementFluxVector elementFluxes_; -}; - -} // namespace Dumux - -#endif // DUMUX_2P2C_COUPLING_LOCAL_RESIDUAL_HH diff --git a/dumux/multidomain/2cstokes2p2c/CMakeLists.txt b/dumux/multidomain/2cstokes2p2c/CMakeLists.txt deleted file mode 100644 index 4edbf946cc608645c34fe74b343e6ff798e9933d..0000000000000000000000000000000000000000 --- a/dumux/multidomain/2cstokes2p2c/CMakeLists.txt +++ /dev/null @@ -1,10 +0,0 @@ - -#install headers -install(FILES -localoperator.hh -newtoncontroller.hh -properties.hh -propertydefaults.hh -2p2ccouplinglocalresidual.hh -stokesnccouplinglocalresidual.hh -DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/dumux/multidomain/2cstokes2p2c) diff --git a/dumux/multidomain/2cstokes2p2c/localoperator.hh b/dumux/multidomain/2cstokes2p2c/localoperator.hh deleted file mode 100644 index c6ac77710c50c96bcbfc438db22050ff1df4967f..0000000000000000000000000000000000000000 --- a/dumux/multidomain/2cstokes2p2c/localoperator.hh +++ /dev/null @@ -1,695 +0,0 @@ -// -*- mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- -// vi: set et ts=4 sw=4 sts=4: -/***************************************************************************** - * See the file COPYING for full copying permissions. * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 2 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program. If not, see . * - *****************************************************************************/ -/*! - * \file - * \brief The local operator for the coupling of a two-component Stokes model - * and a two-phase two-component porous-medium model under isothermal conditions. - */ -#ifndef DUMUX_2CSTOKES_2P2C_LOCALOPERATOR_HH -#define DUMUX_2CSTOKES_2P2C_LOCALOPERATOR_HH - -#include - -#include -#include -#include - -#include -#include -#include -#include -#include - -#include "propertydefaults.hh" - -namespace Dumux { - -/*! - * \ingroup TwoPTwoCStokesTwoCModel - * \ingroup TwoPTwoCZeroEqTwoCModel - * \brief The local operator for the coupling of a two-component Stokes model - * and a two-phase two-component porous-medium model under isothermal conditions. - * - * This model implements the coupling between a free-flow model - * and a porous-medium flow model under isothermal conditions. - * Here the coupling conditions for the individual balance are presented: - * - * The total mass balance equation: - * \f[ - * \left[ - * \left( - * \varrho_\textrm{g} {\boldsymbol{v}}_\textrm{g} - * - \sum_\kappa {\boldsymbol{j}}^\kappa_\textrm{g,ff,t,diff} - * \right) \cdot \boldsymbol{n} - * \right]^\textrm{ff} - * = -\left[ - * \left( - * \varrho_\textrm{g} \boldsymbol{v}_\textrm{g} - * + \varrho_\textrm{l} \boldsymbol{v}_\textrm{l} - * - \sum_\kappa {\boldsymbol{j}}^\kappa_\textrm{g,pm,diff} - * - \sum_\kappa {\boldsymbol{j}}^\kappa_\textrm{l,pm,diff} -* \right) \cdot \boldsymbol{n} - * \right]^\textrm{pm} - * \f] - * in which \f$n\f$ represents a vector normal to the interface pointing outside of - * the specified subdomain. The diffusive fluxes \f$ j_\textrm{diff} \f$ are the diffusive fluxes as - * they are implemented in the individual subdomain models. - * - * The momentum balance (tangential), which corresponds to the Beavers-Jospeh Saffman condition: - * \f[ - * \left[ - * \left( {\boldsymbol{v}}_\textrm{g} - * + \frac{\sqrt{\left(\boldsymbol{K} \boldsymbol{t}_i \right) \cdot \boldsymbol{t}_i}} - * {\alpha_\textrm{BJ} \mu_\textrm{g}} \boldsymbol{{\tau}}_\textrm{t} \boldsymbol{n} - * \right) \cdot \boldsymbol{t}_i - * \right]^\textrm{ff} - * = 0 - * \f] - * with - * \f$ - * \boldsymbol{{\tau}_\textrm{t}} = \left[ \mu_\textrm{g} + \mu_\textrm{g,t} \right] - * \nabla \left( \boldsymbol{v}_\textrm{g} - * + \boldsymbol{v}_\textrm{g}^\intercal \right) - * \f$ - * in which the eddy viscosity \f$ \mu_\textrm{g,t} = 0 \f$ for the Stokes equation. - * - * The momentum balance (normal): - * \f[ - * \left[ - * \left( - * \left\lbrace - * \varrho_\textrm{g} {\boldsymbol{v}}_\textrm{g} {\boldsymbol{v}}_\textrm{g}^\intercal - * - \boldsymbol{{\tau}}_\textrm{t} - * + {p}_\textrm{g} \boldsymbol{I} - * \right\rbrace \boldsymbol{n} - * \right) \cdot \boldsymbol{n} - * \right]^\textrm{ff} - * = p_\textrm{g}^\textrm{pm} - * \f] - * - * The component mass balance equation (continuity of fluxes): - * \f[ - * \left[ - * \left( - * \varrho_\textrm{g} {X}^\kappa_\textrm{g} {\boldsymbol{v}}_\textrm{g} - * - {\boldsymbol{j}}^\kappa_\textrm{g,ff,t,diff} - * \right) \cdot \boldsymbol{n} - * \right]^\textrm{ff} - * = -\left[ - * \left( - * \varrho_\textrm{g} X^\kappa_\textrm{g} \boldsymbol{v}_\textrm{g} - * - \boldsymbol{j}^\kappa_\textrm{g,pm,diff} - * + \varrho_\textrm{l} \boldsymbol{v}_\textrm{l} X^\kappa_\textrm{l} - * - \boldsymbol{j}^\kappa_\textrm{l,pm,diff} - * \right) \cdot \boldsymbol{n} - * \right]^\textrm{pm} - * = 0 - * \f] - * - * The component mass balance equation (continuity of mass/ mole fractions): - * \f[ - * \left[ {X}^{\kappa}_\textrm{g} \right]^\textrm{ff} - * = \left[ X^{\kappa}_\textrm{g} \right]^\textrm{pm} - * \f] - * - * This is discretized by a fully-coupled vertex-centered finite volume - * (box) scheme in space and by the implicit Euler method in time. - */ -template -class TwoCStokesTwoPTwoCLocalOperator : - public Dune::PDELab::MultiDomain::CouplingOperatorDefaultFlags, - public Dune::PDELab::MultiDomain::NumericalJacobianCoupling>, - public Dune::PDELab::MultiDomain::FullCouplingPattern, - public Dune::PDELab::InstationaryLocalOperatorDefaultMethods -{ -public: - typedef typename GET_PROP_TYPE(TypeTag, Problem) GlobalProblem; - typedef typename GET_PROP_TYPE(TypeTag, MultiDomainCouplingLocalOperator) Implementation; - - typedef typename GET_PROP_TYPE(TypeTag, SubDomain1TypeTag) Stokes2cTypeTag; - typedef typename GET_PROP_TYPE(TypeTag, SubDomain2TypeTag) TwoPTwoCTypeTag; - - typedef typename GET_PROP_TYPE(TypeTag, FluidSystem) FluidSystem; - typedef typename GET_PROP_TYPE(TwoPTwoCTypeTag, SpatialParams) SpatialParams; - - typedef typename GET_PROP_TYPE(Stokes2cTypeTag, ElementVolumeVariables) ElementVolumeVariables1; - typedef typename GET_PROP_TYPE(TwoPTwoCTypeTag, ElementVolumeVariables) ElementVolumeVariables2; - - typedef typename GET_PROP_TYPE(Stokes2cTypeTag, FluxVariables) BoundaryVariables1; - typedef typename GET_PROP_TYPE(TwoPTwoCTypeTag, FluxVariables) BoundaryVariables2; - - typedef typename GET_PROP_TYPE(Stokes2cTypeTag, ElementBoundaryTypes) ElementBoundaryTypes1; - typedef typename GET_PROP_TYPE(TwoPTwoCTypeTag, ElementBoundaryTypes) ElementBoundaryTypes2; - - typedef typename GET_PROP_TYPE(Stokes2cTypeTag, BoundaryTypes) BoundaryTypes1; - typedef typename GET_PROP_TYPE(TwoPTwoCTypeTag, BoundaryTypes) BoundaryTypes2; - - typedef typename GET_PROP_TYPE(Stokes2cTypeTag, FVElementGeometry) FVElementGeometry1; - typedef typename GET_PROP_TYPE(TwoPTwoCTypeTag, FVElementGeometry) FVElementGeometry2; - - // Multidomain Grid types - typedef typename GET_PROP_TYPE(TypeTag, MultiDomainGrid) MDGrid; - typedef typename MDGrid::Traits::template Codim<0>::Entity MDElement; - - typedef typename GET_PROP_TYPE(Stokes2cTypeTag, GridView) Stokes2cGridView; - typedef typename GET_PROP_TYPE(TwoPTwoCTypeTag, GridView) TwoPTwoCGridView; - typedef typename Stokes2cGridView::template Codim<0>::Entity SDElement1; - typedef typename TwoPTwoCGridView::template Codim<0>::Entity SDElement2; - - typedef typename GET_PROP_TYPE(Stokes2cTypeTag, Indices) Stokes2cIndices; - typedef typename GET_PROP_TYPE(TwoPTwoCTypeTag, Indices) TwoPTwoCIndices; - - enum { - dim = MDGrid::dimension, - dimWorld = MDGrid::dimensionworld - }; - - // Stokes - enum { numEq1 = GET_PROP_VALUE(Stokes2cTypeTag, NumEq), - useMoles1 = GET_PROP_VALUE(Stokes2cTypeTag, UseMoles) }; - enum { numComponents1 = Stokes2cIndices::numComponents }; - enum { // equation indices - momentumXIdx1 = Stokes2cIndices::momentumXIdx, //!< Index of the x-component of the momentum balance - momentumYIdx1 = Stokes2cIndices::momentumYIdx, //!< Index of the y-component of the momentum balance - momentumZIdx1 = Stokes2cIndices::momentumZIdx, //!< Index of the z-component of the momentum balance - lastMomentumIdx1 = Stokes2cIndices::lastMomentumIdx, //!< Index of the last component of the momentum balance - massBalanceIdx1 = Stokes2cIndices::massBalanceIdx, //!< Index of the mass balance - transportEqIdx1 = Stokes2cIndices::transportEqIdx //!< Index of the transport equation - }; - enum { // component indices - transportCompIdx1 = Stokes2cIndices::transportCompIdx, //!< Index of transported component - phaseCompIdx1 = Stokes2cIndices::phaseCompIdx //!< Index of main component of the phase - }; - - // Darcy - enum { numEq2 = GET_PROP_VALUE(TwoPTwoCTypeTag, NumEq), - useMoles2 = GET_PROP_VALUE(TwoPTwoCTypeTag, UseMoles) }; - enum { numPhases2 = GET_PROP_VALUE(TwoPTwoCTypeTag, NumPhases) }; - enum { // equation indices - contiWEqIdx2 = TwoPTwoCIndices::contiWEqIdx, //!< Index of the continuity equation for water component - massBalanceIdx2 = TwoPTwoCIndices::contiNEqIdx //!< Index of the total mass balance (if one component balance is replaced) - }; - enum { // component indices - wCompIdx2 = TwoPTwoCIndices::wCompIdx, //!< Index of the liquids main component - nCompIdx2 = TwoPTwoCIndices::nCompIdx //!< Index of the main component of the gas - }; - enum { // phase indices - wPhaseIdx2 = TwoPTwoCIndices::wPhaseIdx, //!< Index for the liquid phase - nPhaseIdx2 = TwoPTwoCIndices::nPhaseIdx //!< Index for the gas phase - }; - - typedef typename GET_PROP_TYPE(TypeTag, Scalar) Scalar; - typedef typename MDGrid::ctype CoordScalar; - typedef Dune::FieldVector GlobalPosition; - - typedef typename Stokes2cGridView::template Codim::EntityPointer VertexPointer1; - typedef typename TwoPTwoCGridView::template Codim::EntityPointer VertexPointer2; - - // multidomain flags - static const bool doAlphaCoupling = true; - static const bool doPatternCoupling = true; - -public: - //! \brief The constructor - TwoCStokesTwoPTwoCLocalOperator(GlobalProblem& globalProblem) - : globalProblem_(globalProblem) - { - static_assert(GET_PROP_VALUE(Stokes2cTypeTag, UseMoles) == GET_PROP_VALUE(TwoPTwoCTypeTag, UseMoles), - "The coupling conditions is only implemented for same formulations (mass or mole) in both subdomains."); - - blModel_ = GET_PARAM_FROM_GROUP(TypeTag, int, BoundaryLayer, Model); - massTransferModel_ = GET_PARAM_FROM_GROUP(TypeTag, int, MassTransfer, Model); - - if (blModel_ != 0) - std::cout << "Using boundary layer model " << blModel_ << std::endl; - if (massTransferModel_ != 0) - std::cout << "Using mass transfer model " << massTransferModel_ << std::endl; - } - - /*! - * \brief Do the coupling. The unknowns are transferred from dune-multidomain. - * Based on them, a coupling residual is calculated and added at the - * respective positions in the matrix. - * - * \param intersectionGeometry the geometry of the intersection - * \param lfsu1 local basis for the trial space of the Stokes domain - * \param unknowns1 the unknowns vector of the Stokes element (formatted according to PDELab) - * \param lfsv1 local basis for the test space of the Stokes domain - * \param lfsu2 local basis for the trail space of the Darcy domain - * \param unknowns2 the unknowns vector of the Darcy element (formatted according to PDELab) - * \param lfsv2 local basis for the test space of the Darcy domain - * \param couplingRes1 the coupling residual from the Stokes domain - * \param couplingRes2 the coupling residual from the Darcy domain - */ - template - void alpha_coupling(const IntersectionGeom& intersectionGeometry, - const LFSU1& lfsu1, const X& unknowns1, const LFSV1& lfsv1, - const LFSU2& lfsu2, const X& unknowns2, const LFSV2& lfsv2, - RES& couplingRes1, RES& couplingRes2) const - { - const std::shared_ptr mdElement1 - = std::make_shared(intersectionGeometry.inside()); - const std::shared_ptr mdElement2 - = std::make_shared(intersectionGeometry.outside()); - - // the subdomain elements - const std::shared_ptr sdElement1 - = std::make_shared(globalProblem_.sdElementPointer1(*mdElement1)); - const std::shared_ptr sdElement2 - = std::make_shared(globalProblem_.sdElementPointer2(*mdElement2)); - - // a container for the parameters on each side of the coupling interface (see below) - CParams cParams; - - // update fvElementGeometry and the element volume variables - updateElemVolVars(lfsu1, lfsu2, - unknowns1, unknowns2, - *sdElement1, *sdElement2, - cParams); - - // first element - const int faceIdx1 = intersectionGeometry.indexInInside(); - const Dune::ReferenceElement& referenceElement1 = - Dune::ReferenceElements::general((*mdElement1).type()); - const int numVerticesOfFace = referenceElement1.size(faceIdx1, 1, dim); - - // second element - const int faceIdx2 = intersectionGeometry.indexInOutside(); - const Dune::ReferenceElement& referenceElement2 = - Dune::ReferenceElements::general((*mdElement2).type()); - - for (int vertexInFace = 0; vertexInFace < numVerticesOfFace; ++vertexInFace) - { - const int vertInElem1 = referenceElement1.subEntity(faceIdx1, 1, vertexInFace, dim); - const int vertInElem2 = referenceElement2.subEntity(faceIdx2, 1, vertexInFace, dim); - - const int boundaryFaceIdx1 = cParams.fvGeometry1.boundaryFaceIndex(faceIdx1, vertexInFace); - const int boundaryFaceIdx2 = cParams.fvGeometry2.boundaryFaceIndex(faceIdx2, vertexInFace); - - // obtain the boundary types - const VertexPointer1 vPtr1 = (*sdElement1).template subEntity(vertInElem1); - const VertexPointer2 vPtr2 = (*sdElement2).template subEntity(vertInElem2); - - globalProblem_.sdProblem1().boundaryTypes(cParams.boundaryTypes1, vPtr1); - globalProblem_.sdProblem2().boundaryTypes(cParams.boundaryTypes2, vPtr2); - - BoundaryVariables1 boundaryVars1; - boundaryVars1.update(globalProblem_.sdProblem1(), - *sdElement1, - cParams.fvGeometry1, - boundaryFaceIdx1, - cParams.elemVolVarsCur1, - /*onBoundary=*/true); - BoundaryVariables2 boundaryVars2; - boundaryVars2.update(globalProblem_.sdProblem2(), - *sdElement2, - cParams.fvGeometry2, - boundaryFaceIdx2, - cParams.elemVolVarsCur2, - /*onBoundary=*/true); - - asImp_()->evalCoupling(lfsu1, lfsu2, - vertInElem1, vertInElem2, - *sdElement1, *sdElement2, - boundaryVars1, boundaryVars2, - cParams, - couplingRes1, couplingRes2); - } - } - - /*! - * \brief Update the volume variables of the element and extract the unknowns from dune-pdelab vectors - * and bring them into a form which fits to dumux. - * - * \param lfsu1 local basis for the trial space of the Stokes domain - * \param lfsu2 local basis for the trial space of the Darcy domain - * \param unknowns1 the unknowns vector of the Stokes element (formatted according to PDELab) - * \param unknowns2 the unknowns vector of the Darcy element (formatted according to PDELab) - * \param sdElement1 the element in the Stokes domain - * \param sdElement2 the element in the Darcy domain - * \param cParams a parameter container - */ - template - void updateElemVolVars(const LFSU1& lfsu1, const LFSU2& lfsu2, - const X& unknowns1, const X& unknowns2, - const SDElement1& sdElement1, const SDElement2& sdElement2, - CParams &cParams) const - { - cParams.fvGeometry1.update(globalProblem_.sdGridView1(), sdElement1); - cParams.fvGeometry2.update(globalProblem_.sdGridView2(), sdElement2); - - const int numVertsOfElem1 = sdElement1.subEntities(dim); - const int numVertsOfElem2 = sdElement2.subEntities(dim); - - // bring the local unknowns x1 into a form that can be passed to elemVolVarsCur.update() - Dune::BlockVector> elementSol1(0.); - Dune::BlockVector> elementSol2(0.); - elementSol1.resize(unknowns1.size()); - elementSol2.resize(unknowns2.size()); - - for (int idx=0; idx - void evalCoupling(const LFSU1& lfsu1, const LFSU2& lfsu2, - const int vertInElem1, const int vertInElem2, - const SDElement1& sdElement1, const SDElement2& sdElement2, - const BoundaryVariables1& boundaryVars1, const BoundaryVariables2& boundaryVars2, - const CParams &cParams, - RES1& couplingRes1, RES2& couplingRes2) const - { - const GlobalPosition& globalPos1 = cParams.fvGeometry1.subContVol[vertInElem1].global; - const GlobalPosition& globalPos2 = cParams.fvGeometry2.subContVol[vertInElem2].global; - - const GlobalPosition& bfNormal1 = boundaryVars1.face().normal; - const Scalar density1 = useMoles1 ? cParams.elemVolVarsCur1[vertInElem1].molarDensity() - : cParams.elemVolVarsCur1[vertInElem1].density(); - const Scalar massMoleFrac1 = useMoles1 ? cParams.elemVolVarsCur1[vertInElem1].moleFraction(transportCompIdx1) - : cParams.elemVolVarsCur1[vertInElem1].massFraction(transportCompIdx1); - - const Scalar normalPhaseFlux1 = boundaryVars1.normalVelocity() * density1; - const Scalar diffusiveMoleFlux1 = bfNormal1 - * boundaryVars1.moleFractionGrad(transportCompIdx1) - * (boundaryVars1.diffusionCoeff(transportCompIdx1) - + boundaryVars1.eddyDiffusivity()) - * boundaryVars1.molarDensity(); - - using std::abs; - if (abs(bfNormal1[1]) < 1e-10) - { - DUNE_THROW(Dune::NotImplemented, "The coupling conditions are not implemented for vertical interfaces."); - } - - // MASS Balance - // Neumann-like conditions - if (cParams.boundaryTypes1.isCouplingNeumann(massBalanceIdx1)) - { - DUNE_THROW(Dune::NotImplemented, "The boundary condition isCouplingNeumann(massBalanceIdx1) for the Stokes side is not implemented."); - } - if (cParams.boundaryTypes2.isCouplingNeumann(massBalanceIdx2)) - { - if (globalProblem_.sdProblem1().isCornerPoint(globalPos1)) - { - Scalar diffusiveFlux = diffusiveMoleFlux1 * FluidSystem::molarMass(transportCompIdx1) - - diffusiveMoleFlux1 * FluidSystem::molarMass(phaseCompIdx1); - if (useMoles1) - { - diffusiveFlux = 0.0; - } - couplingRes2.accumulate(lfsu2.child(massBalanceIdx2), vertInElem2, - - normalPhaseFlux1 + diffusiveFlux); - } - else - { - couplingRes2.accumulate(lfsu2.child(massBalanceIdx2), vertInElem2, - globalProblem_.localResidual1().residual(vertInElem1)[massBalanceIdx1]); - } - } - - // Dirichlet-like - if (cParams.boundaryTypes1.isCouplingDirichlet(massBalanceIdx1)) - { - DUNE_THROW(Dune::NotImplemented, "The boundary condition isCouplingDirichlet(massBalanceIdx1) for the Stokes side is not implemented."); - } - if (cParams.boundaryTypes2.isCouplingDirichlet(massBalanceIdx2)) - { - couplingRes2.accumulate(lfsu2.child(massBalanceIdx2), vertInElem2, - globalProblem_.localResidual1().residual(vertInElem1)[momentumYIdx1] - -cParams.elemVolVarsCur1[vertInElem1].pressure()); - } - - - // MOMENTUM_X Balance - SpatialParams spatialParams = globalProblem_.sdProblem2().spatialParams(); - Scalar beaversJosephCoeff = spatialParams.beaversJosephCoeffAtPos(globalPos1); - assert(beaversJosephCoeff > 0); - using std::sqrt; - beaversJosephCoeff /= sqrt(spatialParams.intrinsicPermeability(sdElement2, cParams.fvGeometry2, vertInElem2)); - - // Neumann-like conditions - if (cParams.boundaryTypes1.isCouplingNeumann(momentumXIdx1)) - { - // v_tau = v - (v.n)n - const Scalar normalComp = boundaryVars1.velocity()*bfNormal1; - GlobalPosition normalV = bfNormal1; - normalV *= normalComp; - const GlobalPosition tangentialV = boundaryVars1.velocity() - normalV; - - // Implementation as Neumann-like condition: (v.n)n - for (int dimIdx=0; dimIdx < dim; ++dimIdx) - { - couplingRes1.accumulate(lfsu1.child(momentumXIdx1), vertInElem1, - beaversJosephCoeff - * boundaryVars1.face().area - * tangentialV[dimIdx] - * (boundaryVars1.dynamicViscosity() - + boundaryVars1.dynamicEddyViscosity())); - } - } - - // Dirichlet-like conditions - if (cParams.boundaryTypes1.isCouplingDirichlet(momentumXIdx1)) - { - // NOTE: This boundary condition is not implemented anymore because curPrimaryVars_ is protected - DUNE_THROW(Dune::NotImplemented, "The boundary condition isCouplingNeumann(momentumXIdx1) on the Stokes side is not implemented anymore."); - - // tangential component: vx = sqrt K /alpha * (grad v n(unity))t - // GlobalPosition tangentialVelGrad(0); - // boundaryVars1.velocityGrad().umv(elementUnitNormal, tangentialVelGrad); - // tangentialVelGrad /= -beaversJosephCoeff; // was - before - // this->residual_[vertInElem1][momentumXIdx1] = - // tangentialVelGrad[momentumXIdx1] - globalProblem_.localResidual1().curPriVars_(vertInElem1)[momentumXIdx1]); - } - - - // MOMENTUM_Y Balance - // Neumann-like conditions - if (cParams.boundaryTypes1.isCouplingNeumann(momentumYIdx1)) - { - // p*A as condition for free flow - // pressure correction is done in stokeslocalresidual.hh - couplingRes1.accumulate(lfsu1.child(momentumYIdx1), vertInElem1, - cParams.elemVolVarsCur2[vertInElem2].pressure(nPhaseIdx2) - * bfNormal1[momentumYIdx1]); - } - - // Dirichlet-like conditions - if (cParams.boundaryTypes1.isCouplingDirichlet(momentumYIdx1)) - { - // v.n as Dirichlet-like condition for the Stokes domain - if (globalProblem_.sdProblem2().isCornerPoint(globalPos2)) - { - Scalar sumNormalPhaseFluxes = 0.0; - for (int phaseIdx=0; phaseIdx (this); } - const Implementation *asImp_() const - { return static_cast (this); } - - unsigned int blModel_; - unsigned int massTransferModel_; - - private: - /*! - * \brief A struct that contains data of the FF and PM including boundary types, - * volume variables in both subdomains and geometric information - */ - struct CParams - { - BoundaryTypes1 boundaryTypes1; - BoundaryTypes2 boundaryTypes2; - ElementVolumeVariables1 elemVolVarsPrev1; - ElementVolumeVariables1 elemVolVarsCur1; - ElementVolumeVariables2 elemVolVarsPrev2; - ElementVolumeVariables2 elemVolVarsCur2; - FVElementGeometry1 fvGeometry1; - FVElementGeometry2 fvGeometry2; - }; - - GlobalProblem& globalProblem_; -}; - -} // end namespace Dumux - -#endif // DUMUX_2CSTOKES_2P2C_LOCALOPERATOR_HH diff --git a/dumux/multidomain/2cstokes2p2c/newtoncontroller.hh b/dumux/multidomain/2cstokes2p2c/newtoncontroller.hh deleted file mode 100644 index 982860f27864b09379ff85b0565f7cbdaadf1ad2..0000000000000000000000000000000000000000 --- a/dumux/multidomain/2cstokes2p2c/newtoncontroller.hh +++ /dev/null @@ -1,68 +0,0 @@ -// -*- mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- -// vi: set et ts=4 sw=4 sts=4: -/***************************************************************************** - * See the file COPYING for full copying permissions. * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 2 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program. If not, see . * - *****************************************************************************/ -/*! - * \file - * \brief Reference implementation of a Newton controller for the coupling of a two-component Stokes model - * and a two-phase two-component porous-medium model under isothermal conditions. - */ -#ifndef DUMUX_2CSTOKES_2P2C_NEWTON_CONTROLLER_HH -#define DUMUX_2CSTOKES_2P2C_NEWTON_CONTROLLER_HH - -#include - -namespace Dumux -{ - -/*! - * \ingroup Newton - * \ingroup TwoPTwoCStokesTwoCModel - * \ingroup TwoPTwoCZeroEqTwoCModel - * \brief Implementation of a Newton controller for the coupling of a two-component Stokes model - * and a two-phase two-component porous-medium model under isothermal conditions. - * - * The Newton controller ensures that the updateStaticData routine is called - * in the porous-medium sub-problem - */ -template -class TwoCStokesTwoPTwoCNewtonController : public MultiDomainNewtonController -{ - typedef MultiDomainNewtonController ParentType; - - typedef typename GET_PROP_TYPE(TypeTag, Problem) Problem; - typedef typename GET_PROP_TYPE(TypeTag, SolutionVector) SolutionVector; - -public: - //! \brief The constructor - TwoCStokesTwoPTwoCNewtonController(const Problem &problem) - : ParentType(problem) - { } - - //! \copydoc NewtonController::newtonEndStep() - void newtonEndStep(SolutionVector &uCurrentIter, SolutionVector &uLastIter) - { - ParentType::newtonEndStep(uCurrentIter, uLastIter); - - this->model_().sdModel2().updateStaticData(this->model_().sdModel2().curSol(), - this->model_().sdModel2().prevSol()); - } -}; - -} // namespace Dumux - -#endif // DUMUX_2CSTOKES_2P2C_NEWTON_CONTROLLER_HH diff --git a/dumux/multidomain/2cstokes2p2c/problem.hh b/dumux/multidomain/2cstokes2p2c/problem.hh deleted file mode 100644 index 47673ccacf5e7d1217620bea5496c015bb34bce6..0000000000000000000000000000000000000000 --- a/dumux/multidomain/2cstokes2p2c/problem.hh +++ /dev/null @@ -1,172 +0,0 @@ -// -*- mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- -// vi: set et ts=4 sw=4 sts=4: -/***************************************************************************** - * See the file COPYING for full copying permissions. * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 2 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program. If not, see . * - *****************************************************************************/ -/*! - * \file - * \brief The problem class for the coupling of a isothermal two-component Stokes - * and a isothermal two-phase two-component Darcy model. - */ - -#ifndef DUMUX_2C_STOKES_2P2C_PROBLEM_HH -#define DUMUX_2C_STOKES_2P2C_PROBLEM_HH - -#include -#include -#include -#include -#include - -#include "properties.hh" - -namespace Dumux -{ - -/*! - * \ingroup TwoPTwoCStokesTwoCModel - * \ingroup TwoPTwoCZeroEqTwoCModel - * \brief The problem class for the coupling of a isothermal two-component Stokes - * and a isothermal two-phase two-component Darcy model. - */ -template -class TwoCStokesTwoPTwoCProblem : public MultiDomainProblem -{ - typedef MultiDomainProblem ParentType; - typedef typename GET_PROP_TYPE(TypeTag, Problem) Implementation; - - typedef typename GET_PROP_TYPE(TypeTag, Scalar) Scalar; - typedef typename GET_PROP_TYPE(TypeTag, TimeManager) TimeManager; - typedef typename GET_PROP_TYPE(TypeTag, FluidSystem) FluidSystem; - - typedef typename GET_PROP_TYPE(TypeTag, SubDomain1TypeTag) Stokes2cTypeTag; - typedef typename GET_PROP_TYPE(TypeTag, SubDomain2TypeTag) TwoPTwoCTypeTag; - typedef typename GET_PROP_TYPE(Stokes2cTypeTag, Indices) Stokes2cIndices; - typedef typename GET_PROP_TYPE(TwoPTwoCTypeTag, Indices) TwoPTwoCIndices; - - // Stokes - enum { numComponents1 = Stokes2cIndices::numComponents }; - enum { // component indices - transportCompIdx1 = Stokes2cIndices::transportCompIdx, //!< Index of transported component - phaseCompIdx1 = Stokes2cIndices::phaseCompIdx //!< Index of main component of the phase - }; - // Darcy - enum { // phase indices - wPhaseIdx2 = TwoPTwoCIndices::wPhaseIdx, //!< Index for the liquid phase - }; - -public: - //! The constructor - template - TwoCStokesTwoPTwoCProblem(TimeManager &timeManager, - GridView gridView) - : ParentType(timeManager, gridView) - { - blModel_ = GET_PARAM_FROM_GROUP(TypeTag, int, BoundaryLayer, Model); - massTransferModel_ = GET_PARAM_FROM_GROUP(TypeTag, int, MassTransfer, Model); - } - - /*! - * \brief Returns a BoundaryLayerModel object - * - * \param cParams a parameter container - * \param scvIdx1 The local index of the sub-control volume of the Stokes domain - */ - template - BoundaryLayerModel evalBoundaryLayerModel(CParams cParams, const int scvIdx1) const - { - // current position + additional virtual runup distance - const Scalar distance = cParams.fvGeometry1.subContVol[scvIdx1].global[0] - + GET_RUNTIME_PARAM_FROM_GROUP(TypeTag, Scalar, BoundaryLayer, Offset); - BoundaryLayerModel boundaryLayerModel(GET_RUNTIME_PARAM_FROM_GROUP(TypeTag, Scalar, FreeFlow, RefVelocity), - distance, - cParams.elemVolVarsCur1[scvIdx1].kinematicViscosity(), - blModel_); - if (blModel_ == 1) - boundaryLayerModel.setConstThickness(GET_RUNTIME_PARAM_FROM_GROUP(TypeTag, Scalar, BoundaryLayer, ConstThickness)); - if (blModel_ >= 4) - boundaryLayerModel.setYPlus(GET_RUNTIME_PARAM_FROM_GROUP(TypeTag, Scalar, BoundaryLayer, YPlus)); - if (blModel_ >= 5) - boundaryLayerModel.setRoughnessLength(GET_RUNTIME_PARAM_FROM_GROUP(TypeTag, Scalar, BoundaryLayer, RoughnessLength)); - if (blModel_ == 7) - boundaryLayerModel.setHydraulicDiameter(GET_RUNTIME_PARAM_FROM_GROUP(TypeTag, Scalar, BoundaryLayer, HydraulicDiameter)); - - return boundaryLayerModel; - } - - /*! - * \brief Returns the concentration gradient through the boundary layer - * - * \param cParams a parameter container - * \param scvIdx1 The local index of the sub-control volume of the Stokes domain - */ - template - Scalar evalBoundaryLayerConcentrationGradient(CParams cParams, const int scvIdx1) const - { - static_assert(numComponents1 == 2, - "This coupling condition is only implemented for two components."); - Scalar massFractionOut = GET_RUNTIME_PARAM_FROM_GROUP(TypeTag, Scalar, FreeFlow, RefMassfrac); - Scalar M1 = FluidSystem::molarMass(transportCompIdx1); - Scalar M2 = FluidSystem::molarMass(phaseCompIdx1); - Scalar X2 = 1.0 - massFractionOut; - Scalar massToMoleDenominator = M2 + X2*(M1 - M2); - Scalar moleFractionOut = massFractionOut * M2 /massToMoleDenominator; - - Scalar normalMoleFracGrad = cParams.elemVolVarsCur1[scvIdx1].moleFraction(transportCompIdx1) - - moleFractionOut; - return normalMoleFracGrad / asImp_().evalBoundaryLayerModel(cParams, scvIdx1).massBoundaryLayerThickness(); - } - - /*! - * \brief Returns the mass transfer coefficient - * - * \param cParams a parameter container - * \param scvIdx1 The local index of the sub-control volume of the Stokes domain - * \param scvIdx2 The local index of the sub-control volume of the Darcy domain - */ - template - Scalar evalMassTransferCoefficient(CParams cParams, const int scvIdx1, const int scvIdx2) const - { - MassTransferModel massTransferModel(cParams.elemVolVarsCur2[scvIdx2].saturation(wPhaseIdx2), - cParams.elemVolVarsCur2[scvIdx2].porosity(), - asImp_().evalBoundaryLayerModel(cParams, scvIdx1).massBoundaryLayerThickness(), - massTransferModel_); - if (massTransferModel_ == 1) - massTransferModel.setMassTransferCoeff(GET_RUNTIME_PARAM_FROM_GROUP(TypeTag, Scalar, MassTransfer, Coefficient)); - if (massTransferModel_ == 2 || massTransferModel_ == 4) - massTransferModel.setCharPoreRadius(GET_RUNTIME_PARAM_FROM_GROUP(TypeTag, Scalar, MassTransfer, CharPoreRadius)); - if (massTransferModel_ == 3) - massTransferModel.setCapillaryPressure(cParams.elemVolVarsCur2[scvIdx2].capillaryPressure()); - - return massTransferModel.massTransferCoefficient(); - } - -private: - //! Returns the implementation of the problem (i.e. static polymorphism) - Implementation &asImp_() - { return *static_cast(this); } - - //! \copydoc asImp_() - const Implementation &asImp_() const - { return *static_cast(this); } - - unsigned int blModel_; - unsigned int massTransferModel_; -}; - -} // namespace Dumux - -#endif // DUMUX_2C_STOKES_2P2C_PROBLEM_HH diff --git a/dumux/multidomain/2cstokes2p2c/properties.hh b/dumux/multidomain/2cstokes2p2c/properties.hh deleted file mode 100644 index 36330a143e4838836ad6abca6b7efdb161f079df..0000000000000000000000000000000000000000 --- a/dumux/multidomain/2cstokes2p2c/properties.hh +++ /dev/null @@ -1,60 +0,0 @@ -// -*- mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- -// vi: set et ts=4 sw=4 sts=4: -/***************************************************************************** - * See the file COPYING for full copying permissions. * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 2 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program. If not, see . * - *****************************************************************************/ -/*! - * \file - * \ingroup Properties - * \ingroup ImplicitProperties - * \ingroup MultidomainModel - * - * \brief Defines the properties required for the coupled 2cstokes2p2c model. - */ - -#ifndef DUMUX_TWOCSTOKESTWOPTWOC_PROPERTIES_HH -#define DUMUX_TWOCSTOKESTWOPTWOC_PROPERTIES_HH - -#include - -namespace Dumux -{ - -//////////////////////////////// -// properties -//////////////////////////////// -namespace Properties -{ - -////////////////////////////////////////////////////////////////// -// Type tags -////////////////////////////////////////////////////////////////// - -//! The type tags for the coupled 2cstokes2p2c model -NEW_TYPE_TAG(TwoCStokesTwoPTwoC, INHERITS_FROM(MultiDomain)); - -////////////////////////////////////////////////////////////////// -// Property tags -////////////////////////////////////////////////////////////////// -NEW_PROP_TAG(BoundaryLayerModel); //!< Type of the used boundary layer model -NEW_PROP_TAG(MassTransferModel); //!< Type of the used mass transfer model - -} // end namespace properties - -} // end namespace Dumux - - -#endif diff --git a/dumux/multidomain/2cstokes2p2c/propertydefaults.hh b/dumux/multidomain/2cstokes2p2c/propertydefaults.hh deleted file mode 100644 index 78bec087087806735e7e363f471fcc4308b1a14e..0000000000000000000000000000000000000000 --- a/dumux/multidomain/2cstokes2p2c/propertydefaults.hh +++ /dev/null @@ -1,66 +0,0 @@ -// -*- mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- -// vi: set et ts=4 sw=4 sts=4: -/***************************************************************************** - * See the file COPYING for full copying permissions. * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 2 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program. If not, see . * - *****************************************************************************/ -/*! - * \file - * \ingroup Properties - * \ingroup ImplicitProperties - * \ingroup MultidomainModel - * - * \brief Defines default values for the properties required by the - * coupled 2cstokes2p2c model. - */ -#ifndef DUMUX_TWOCSTOKESTWOPTWOC_PROPERTY_DEFAULTS_HH -#define DUMUX_TWOCSTOKESTWOPTWOC_PROPERTY_DEFAULTS_HH - -#include "properties.hh" -#include "newtoncontroller.hh" - -namespace Dumux -{ -namespace Properties -{ -////////////////////////////////////////////////////////////////// -// Property defaults -////////////////////////////////////////////////////////////////// - -// Specify the multidomain gridview -SET_TYPE_PROP(TwoCStokesTwoPTwoC, GridView, - typename GET_PROP_TYPE(TypeTag, MultiDomainGrid)::LeafGridView); - -// Specify the type of the used solution vector -SET_TYPE_PROP(TwoCStokesTwoPTwoC, SolutionVector, - typename GET_PROP_TYPE(TypeTag, MultiDomainGridOperator)::Traits::Domain); - -// Specif the used Newton controller -SET_TYPE_PROP(TwoCStokesTwoPTwoC, NewtonController, TwoCStokesTwoPTwoCNewtonController); - -// Set this to one here (must fit to the structure of the coupled matrix which has block length 1) -SET_INT_PROP(TwoCStokesTwoPTwoC, NumEq, 1); - -// Specify the used boundary layer model -SET_INT_PROP(TwoCStokesTwoPTwoC, BoundaryLayerModel, 0); - -// Specify the used mass transfer model -SET_INT_PROP(TwoCStokesTwoPTwoC, MassTransferModel, 0); - -} // end namespace properties - -} // end namespace Dumux - -#endif diff --git a/dumux/multidomain/2cstokes2p2c/stokesnccouplinglocalresidual.hh b/dumux/multidomain/2cstokes2p2c/stokesnccouplinglocalresidual.hh deleted file mode 100644 index 83be63717c8855431eb1954a88b1def0a925380d..0000000000000000000000000000000000000000 --- a/dumux/multidomain/2cstokes2p2c/stokesnccouplinglocalresidual.hh +++ /dev/null @@ -1,202 +0,0 @@ -// -*- mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- -// vi: set et ts=4 sw=4 sts=4: -/***************************************************************************** - * See the file COPYING for full copying permissions. * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 2 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program. If not, see . * - *****************************************************************************/ -/*! - * \file - * - * \brief Element-wise calculation of the Jacobian matrix for problems - * using the coupled compositional Stokes box model. - */ - -#ifndef DUMUX_STOKESNC_COUPLING_LOCAL_RESIDUAL_HH -#define DUMUX_STOKESNC_COUPLING_LOCAL_RESIDUAL_HH - -#include -#include - -namespace Dumux -{ -/*! - * \ingroup ImplicitLocalResidual - * \ingroup TwoPTwoCStokesTwoCModel - * \ingroup TwoPTwoCZeroEqTwoCModel - * \brief Element-wise calculation of the Jacobian matrix for problems - * using the coupled compositional Stokes box model. - * It is derived from the compositional Stokes box model. - */ -template -class StokesncCouplingLocalResidual : public StokesncLocalResidual -{ - typedef StokesncLocalResidual ParentType; - - typedef typename GET_PROP_TYPE(TypeTag, Indices) Indices; - - typedef typename GET_PROP_TYPE(TypeTag, Scalar) Scalar; - typedef typename GET_PROP_TYPE(TypeTag, GridView) GridView; - typedef typename GET_PROP_TYPE(TypeTag, FluidSystem) FluidSystem; - - enum { - dim = GridView::dimension, - dimWorld = GridView::dimensionworld, - numEq = GET_PROP_VALUE(TypeTag, NumEq), - numComponents = Indices::numComponents - }; - enum { - //indices of the equations - massBalanceIdx = Indices::massBalanceIdx, //!< Index of the mass balance - - momentumXIdx = Indices::momentumXIdx, //!< Index of the x-component of the momentum balance - momentumYIdx = Indices::momentumYIdx, //!< Index of the y-component of the momentum balance - momentumZIdx = Indices::momentumZIdx, //!< Index of the z-component of the momentum balance - lastMomentumIdx = Indices::lastMomentumIdx, //!< Index of the last component of the momentum balance - transportEqIdx = Indices::transportEqIdx, //!< Index of the transport equation - conti0EqIdx = Indices::conti0EqIdx - }; - enum { - //indices of phase and transported component - phaseIdx = Indices::phaseIdx, - transportCompIdx = Indices::transportCompIdx - }; - enum { - dimXIdx = Indices::dimXIdx, //!< Index for the first component of a vector - dimYIdx = Indices::dimYIdx, //!< Index for the second component of a vector - dimZIdx = Indices::dimZIdx //!< Index for the third component of a vector - }; - - typedef typename GridView::ctype CoordScalar; - - typedef Dune::FieldVector GlobalPosition; - typedef Dune::FieldVector DimVector; - - typedef typename GET_PROP_TYPE(TypeTag, PrimaryVariables) PrimaryVariables; - - typedef typename GET_PROP_TYPE(TypeTag, VolumeVariables) VolumeVariables; - typedef typename GET_PROP_TYPE(TypeTag, FluxVariables) FluxVariables; - typedef typename GET_PROP_TYPE(TypeTag, BoundaryTypes) BoundaryTypes; - - static const bool useMoles = GET_PROP_VALUE(TypeTag, UseMoles); - -public: - /*! - * \brief Implementation of the boundary evaluation for the Stokes model - * - * Evaluate one part of the Dirichlet-like coupling conditions for a single - * sub-control volume face; rest is done in the local coupling operator - */ - void evalBoundary_() - { - ParentType::evalBoundary_(); - - typedef Dune::ReferenceElements ReferenceElements; - typedef Dune::ReferenceElement ReferenceElement; - const ReferenceElement &refElement = ReferenceElements::general(this->element_().geometry().type()); - - // loop over vertices of the element - for (int scvIdx = 0; scvIdx < this->fvGeometry_().numScv; scvIdx++) - { - // consider only SCVs on the boundary - if (this->fvGeometry_().subContVol[scvIdx].inner) - continue; - - const BoundaryTypes &bcTypes = this->bcTypes_(scvIdx); - - // evaluate boundary conditions for the intersections of the current element - for (const auto& intersection : intersections(this->gridView_(), this->element_())) - { - // handle only intersections on the boundary - if (!intersection.boundary()) - continue; - - // assemble the boundary for all vertices of the current face - const int fIdx = intersection.indexInInside(); - const int numFaceVertices = refElement.size(fIdx, 1, dim); - - // loop over the single vertices on the current face - for (int faceVertexIdx = 0; faceVertexIdx < numFaceVertices; ++faceVertexIdx) - { - // only evaluate, if we consider the same face vertex as in the outer - // loop over the element vertices - if (refElement.subEntity(fIdx, 1, faceVertexIdx, dim) != scvIdx) - continue; - - const int boundaryFaceIdx = this->fvGeometry_().boundaryFaceIndex(fIdx, faceVertexIdx); - FluxVariables boundaryVars; - boundaryVars.update(this->problem_(), - this->element_(), - this->fvGeometry_(), - boundaryFaceIdx, - this->curVolVars_(), - true); - const VolumeVariables &volVars = this->curVolVars_()[scvIdx]; - - // set velocity normal to the interface - if (bcTypes.isCouplingDirichlet(momentumYIdx)) - { - this->residual_[scvIdx][momentumYIdx] = volVars.velocity() - * boundaryVars.face().normal - / boundaryVars.face().normal.two_norm(); - Valgrind::CheckDefined(this->residual_[scvIdx][momentumYIdx]); - } - - // add pressure correction - required for pressure coupling, - // if p.n comes from the pm - if (bcTypes.isCouplingNeumann(momentumYIdx) || bcTypes.isCouplingMortar(momentumYIdx)) - { - this->residual_[scvIdx][momentumYIdx] -= volVars.pressure() - * boundaryVars.face().normal[momentumYIdx]; - Valgrind::CheckDefined(this->residual_[scvIdx][momentumYIdx]); - } - - // set mole or mass fraction for the transported components - for (int compIdx = 0; compIdx < numComponents; compIdx++) - { - int eqIdx = conti0EqIdx + compIdx; - if ((eqIdx != massBalanceIdx) && bcTypes.isCouplingDirichlet(eqIdx)) - { - if (useMoles) - this->residual_[scvIdx][eqIdx] = volVars.moleFraction(compIdx); - else - this->residual_[scvIdx][eqIdx] = volVars.massFraction(compIdx); - Valgrind::CheckDefined(this->residual_[scvIdx][compIdx]); - } - } - } - } - } - } - - /*! - * \brief Removes the stabilization for the Stokes model. - */ - void evalBoundaryPDELab_() - { - // loop over vertices of the element - for (int scvIdx = 0; scvIdx < this->fvGeometry_().numScv; scvIdx++) - { - // consider only SCVs on the boundary - if (this->fvGeometry_().subContVol[scvIdx].inner) - continue; - - this->removeStabilizationAtBoundary_(scvIdx); - } - } -}; - -} // namespace Dumux - -#endif // DUMUX_STOKESNC_COUPLING_LOCAL_RESIDUAL_HH diff --git a/dumux/multidomain/CMakeLists.txt b/dumux/multidomain/CMakeLists.txt deleted file mode 100644 index cadda95d1606bc15fcd5c268133be35f1ae68891..0000000000000000000000000000000000000000 --- a/dumux/multidomain/CMakeLists.txt +++ /dev/null @@ -1,18 +0,0 @@ -add_subdirectory(2cnistokes2p2cni) -add_subdirectory(2cstokes2p2c) - -#install headers -install(FILES -assembler.hh -boxcouplinglocalresidual.hh -convergencewriter.hh -localoperator.hh -model.hh -newtoncontroller.hh -problem.hh -properties.hh -propertydefaults.hh -splitandmerge.hh -subdomainproperties.hh -subdomainpropertydefaults.hh -DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/dumux/multidomain) diff --git a/dumux/multidomain/assembler.hh b/dumux/multidomain/assembler.hh deleted file mode 100644 index d4bfe93cf47bafaa0a8f4f536894ddb06e0fdc83..0000000000000000000000000000000000000000 --- a/dumux/multidomain/assembler.hh +++ /dev/null @@ -1,218 +0,0 @@ -// -*- mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- -// vi: set et ts=4 sw=4 sts=4: -/***************************************************************************** - * See the file COPYING for full copying permissions. * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 2 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program. If not, see . * - *****************************************************************************/ -/*! - * \file - * \brief An assembler for the global Jacobian matrix for multidomain models. - */ - -#ifndef DUMUX_MULTIDOMAIN_ASSEMBLER_HH -#define DUMUX_MULTIDOMAIN_ASSEMBLER_HH - -#include -#include - -#include "properties.hh" -#include "propertydefaults.hh" - -namespace Dumux { - -/*! - * \ingroup MultidomainModel - * \brief An assembler for the global Jacobian matrix for multidomain models. - */ -template -class MultiDomainAssembler -{ - typedef typename GET_PROP_TYPE(TypeTag, Problem) Problem; - typedef typename GET_PROP_TYPE(TypeTag, Scalar) Scalar; - - typedef typename GET_PROP_TYPE(TypeTag, SubDomain1TypeTag) SubDomain1TypeTag; - typedef typename GET_PROP_TYPE(TypeTag, SubDomain2TypeTag) SubDomain2TypeTag; - - typedef typename GET_PROP_TYPE(SubDomain1TypeTag, Problem) SubDomainProblem1; - typedef typename GET_PROP_TYPE(SubDomain2TypeTag, Problem) SubDomainProblem2; - - typedef typename GET_PROP_TYPE(SubDomain1TypeTag, LocalFEMSpace) FEM1; - typedef typename GET_PROP_TYPE(SubDomain2TypeTag, LocalFEMSpace) FEM2; - - typedef typename GET_PROP_TYPE(SubDomain1TypeTag, ScalarGridFunctionSpace) ScalarGridFunctionSpace1; - typedef typename GET_PROP_TYPE(SubDomain2TypeTag, ScalarGridFunctionSpace) ScalarGridFunctionSpace2; - - typedef typename GET_PROP_TYPE(SubDomain1TypeTag, GridFunctionSpace) GridFunctionSpace1; - typedef typename GET_PROP_TYPE(SubDomain2TypeTag, GridFunctionSpace) GridFunctionSpace2; - - typedef typename GET_PROP_TYPE(SubDomain1TypeTag, LocalOperator) LocalOperator1; - typedef typename GET_PROP_TYPE(SubDomain2TypeTag, LocalOperator) LocalOperator2; - - typedef typename GET_PROP_TYPE(TypeTag, MultiDomainGridFunctionSpace) MultiDomainGridFunctionSpace; - typedef typename GET_PROP_TYPE(TypeTag, MultiDomainCondition) MultiDomainCondition; - typedef typename GET_PROP_TYPE(TypeTag, MultiDomainSubProblem1) MultiDomainSubProblem1; - typedef typename GET_PROP_TYPE(TypeTag, MultiDomainSubProblem2) MultiDomainSubProblem2; - typedef typename GET_PROP_TYPE(TypeTag, MultiDomainCouplingLocalOperator) MultiDomainCouplingLocalOperator; - typedef typename GET_PROP_TYPE(TypeTag, MultiDomainCoupling) MultiDomainCoupling; - typedef typename GET_PROP_TYPE(TypeTag, MultiDomainConstraintsTrafo) MultiDomainConstraintsTrafo; - typedef typename GET_PROP_TYPE(TypeTag, MultiDomainGridOperator) MultiDomainGridOperator; - - typedef typename GET_PROP_TYPE(TypeTag, SolutionVector) SolutionVector; - typedef typename GET_PROP_TYPE(TypeTag, JacobianMatrix) JacobianMatrix; - - // copying the jacobian assembler is not a good idea - MultiDomainAssembler(const MultiDomainAssembler &); - -public: - //! \brief The constructor - MultiDomainAssembler() - { - globalProblem_ = 0; - sdProblem1_= 0; - sdProblem2_= 0; - } - - //! \brief The destructor - ~MultiDomainAssembler() - { } - - //! \copydoc ImplicitAssembler::init() - void init(Problem& problem) - { - globalProblem_ = &problem; - sdProblem1_ = &globalProblem_->sdProblem1(); - sdProblem2_ = &globalProblem_->sdProblem2(); - - fem1_ = std::make_shared(globalProblem_->sdGridView1()); - fem2_ = std::make_shared(globalProblem_->sdGridView2()); - - scalarGridFunctionSpace1_ = std::make_shared(globalProblem_->sdGridView1(), - *fem1_); - scalarGridFunctionSpace2_ = std::make_shared(globalProblem_->sdGridView2(), - *fem2_); - - gridFunctionSpace1_ = std::make_shared(*scalarGridFunctionSpace1_); - gridFunctionSpace2_ = std::make_shared(*scalarGridFunctionSpace2_); - - mdGridFunctionSpace_ = std::make_shared(globalProblem_->mdGrid(), - *gridFunctionSpace1_, - *gridFunctionSpace2_); - - localOperator1_ = std::make_shared(sdProblem1_->model()); - localOperator2_ = std::make_shared(sdProblem2_->model()); - - condition1_ = std::make_shared(0); - condition2_ = std::make_shared(1); - - mdSubProblem1_ = std::make_shared(*localOperator1_, *condition1_); - mdSubProblem2_ = std::make_shared(*localOperator2_, *condition2_); - - couplingLocalOperator_ = std::make_shared(*globalProblem_); - mdCoupling_ = std::make_shared(*mdSubProblem1_, *mdSubProblem2_, *couplingLocalOperator_); - - constraintsTrafo_ = std::make_shared(); - - mdGridOperator_ = std::make_shared(*mdGridFunctionSpace_, *mdGridFunctionSpace_, - *constraintsTrafo_, *constraintsTrafo_, - *mdSubProblem1_, *mdSubProblem2_, *mdCoupling_); - - matrix_ = std::make_shared(*mdGridOperator_); - residual_ = std::make_shared(*mdGridFunctionSpace_); - } - - //! \copydoc ImplicitAssembler::assemble() - void assemble() - { - // assemble the matrix - *matrix_ = 0; - mdGridOperator_->jacobian(globalProblem_->model().curSol(), *matrix_); - - // calculate the global residual - *residual_ = 0; - mdGridOperator_->residual(globalProblem_->model().curSol(), *residual_); - } - - //! \copydoc ImplicitAssembler::reassembleAll() - void reassembleAll() - { } - - //! \copydoc ImplicitAssembler::matrix() - const JacobianMatrix &matrix() const - { return *matrix_; } - JacobianMatrix &matrix() - { return *matrix_; } - - //! \copydoc ImplicitAssembler::residual() - const SolutionVector &residual() const - { return *residual_; } - SolutionVector &residual() - { return *residual_; } - - /*! - * \brief Return constant reference to the multidomain gridfunctionspace - */ - MultiDomainGridFunctionSpace &gridFunctionSpace() const - { return *mdGridFunctionSpace_; } - - /*! - * \brief Return constant reference to the multidomain gridfunctionspace - */ - MultiDomainGridFunctionSpace &mdGridFunctionSpace() const - { return *mdGridFunctionSpace_; } - - /*! - * \brief Return the multidomain constraints transformation - */ - MultiDomainConstraintsTrafo &constraintsTrafo() const - { return *constraintsTrafo_; } - -private: - Problem *globalProblem_; - SubDomainProblem1 *sdProblem1_; - SubDomainProblem2 *sdProblem2_; - - std::shared_ptr fem1_; - std::shared_ptr fem2_; - - std::shared_ptr scalarGridFunctionSpace1_; - std::shared_ptr scalarGridFunctionSpace2_; - - std::shared_ptr gridFunctionSpace1_; - std::shared_ptr gridFunctionSpace2_; - std::shared_ptr mdGridFunctionSpace_; - - std::shared_ptr localOperator1_; - std::shared_ptr localOperator2_; - - std::shared_ptr condition1_; - std::shared_ptr condition2_; - - std::shared_ptr mdSubProblem1_; - std::shared_ptr mdSubProblem2_; - - std::shared_ptr couplingLocalOperator_; - std::shared_ptr mdCoupling_; - - std::shared_ptr constraintsTrafo_; - std::shared_ptr mdGridOperator_; - - std::shared_ptr matrix_; - - std::shared_ptr residual_; -}; - -} // namespace Dumux - -#endif // DUMUX_MULTIDOMAIN_ASSEMBLER_HH diff --git a/dumux/multidomain/boxcouplinglocalresidual.hh b/dumux/multidomain/boxcouplinglocalresidual.hh deleted file mode 100644 index 0a8057b1c8efc526ca0fe6784b7074d953017e40..0000000000000000000000000000000000000000 --- a/dumux/multidomain/boxcouplinglocalresidual.hh +++ /dev/null @@ -1,150 +0,0 @@ -// -*- mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- -// vi: set et ts=4 sw=4 sts=4: -/***************************************************************************** - * See the file COPYING for full copying permissions. * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 2 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program. If not, see . * - *****************************************************************************/ -/*! - * \file - * \brief Element-wise calculation of the Jacobian matrix for problems - * using the coupled box model. - */ -#ifndef DUMUX_BOX_COUPLING_LOCAL_RESIDUAL_HH -#define DUMUX_BOX_COUPLING_LOCAL_RESIDUAL_HH - -#include - -namespace Dumux -{ -/*! - * \ingroup ImplicitLocalResidual - * \ingroup TwoPTwoCNIStokesTwoCNIModel - * \ingroup TwoPTwoCNIZeroEqTwoCNIModel - * \brief Element-wise calculation of the Jacobian matrix for problems - * using the coupled box model. - */ -template -class BoxCouplingLocalResidual : public BoxLocalResidual -{ -private: - typedef typename GET_PROP_TYPE(TypeTag, LocalResidual) Implementation; - typedef typename GET_PROP_TYPE(TypeTag, GridView) GridView; - - enum { - numEq = GET_PROP_VALUE(TypeTag, NumEq), - - dim = GridView::dimension, - dimWorld = GridView::dimensionworld - }; - - typedef typename GET_PROP_TYPE(TypeTag, Scalar) Scalar; - typedef typename GridView::Grid::ctype CoordScalar; - - typedef typename GridView::template Codim<0>::Entity Element; - typedef typename GET_PROP_TYPE(TypeTag, FVElementGeometry) FVElementGeometry; - - typedef typename GET_PROP_TYPE(TypeTag, ElementBoundaryTypes) ElementBoundaryTypes; - typedef typename GET_PROP_TYPE(TypeTag, ElementVolumeVariables) ElementVolumeVariables; - - // copying the local residual class is not a good idea - BoxCouplingLocalResidual(const BoxCouplingLocalResidual &); - -public: - //! \brief The constructor - BoxCouplingLocalResidual() - { } - - /*! - * \brief Compute the local residual, i.e. the deviation of the - * equations from zero. Calls evalBoundaryPDELab, - * where the stabilization of the mass balance (stokes) - * is removed. No further boundary conditions are employed. - * - * \param element The DUNE Codim<0> entity for which the residual - * ought to be calculated - * \param fvGeometry The finite-volume geometry of the element - * \param prevVolVars The volume averaged variables for all - * sub-control volumes of the element at the previous - * time level - * \param curVolVars The volume averaged variables for all - * sub-control volumes of the element at the current - * time level - * \param bcTypes The types of the boundary conditions for all - * vertices of the element - */ - void evalPDELab(const Element &element, - const FVElementGeometry &fvGeometry, - const ElementVolumeVariables &prevVolVars, - const ElementVolumeVariables &curVolVars, - const ElementBoundaryTypes &bcTypes) - { - const int numVerts = fvGeometry.numScv; -#if HAVE_VALGRIND - for (int i=0; i < numVerts; i++) { - Valgrind::CheckDefined(prevVolVars[i]); - Valgrind::CheckDefined(curVolVars[i]); - } -#endif // HAVE_VALGRIND - - this->elemPtr_ = &element; - this->fvElemGeomPtr_ = &fvGeometry; - this->bcTypesPtr_ = &bcTypes; - this->prevVolVarsPtr_ = &prevVolVars; - this->curVolVarsPtr_ = &curVolVars; - - // reset residual - this->residual_.resize(numVerts); - this->storageTerm_.resize(numVerts); - - this->residual_ = 0; - this->storageTerm_ = 0; - - asImp_().evalFluxes_(); - asImp_().evalVolumeTerms_(); - - // evaluate the boundary (modified version) - asImp_().evalBoundaryPDELab_(); - -#if HAVE_VALGRIND - for (int i=0; i < numVerts; i++) - Valgrind::CheckDefined(this->residual_[i]); -#endif // HAVE_VALGRIND - } - -protected: - /*! - * \brief Empty method, has to be overwritten if required. - * Called e.g. for the removal of the stabilization of the - * stokes model. - */ - void evalBoundaryPDELab_() - { } - - Implementation &asImp_() - { - assert(static_cast(this) != 0); - return *static_cast(this); - } - - const Implementation &asImp_() const - { - assert(static_cast(this) != 0); - return *static_cast(this); - } -}; - -} // namespace Dumux - -#endif // DUMUX_BOX_COUPLING_LOCAL_RESIDUAL_HH diff --git a/dumux/multidomain/convergencewriter.hh b/dumux/multidomain/convergencewriter.hh deleted file mode 100644 index 01c959c261f9e671ea9295aa94308e577903a1a1..0000000000000000000000000000000000000000 --- a/dumux/multidomain/convergencewriter.hh +++ /dev/null @@ -1,150 +0,0 @@ -// -*- mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- -// vi: set et ts=4 sw=4 sts=4: -/***************************************************************************** - * See the file COPYING for full copying permissions. * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 2 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program. If not, see . * - *****************************************************************************/ -/*! - * \file - * \brief Reference implementation of a newton convergence writer for coupled problems. -*/ -#ifndef DUMUX_MULTIDOMAIN_CONVERGENCEWRITER_HH -#define DUMUX_MULTIDOMAIN_CONVERGENCEWRITER_HH - -#include -#include - -#include - -#include "splitandmerge.hh" -#include "newtoncontroller.hh" - -namespace Dumux -{ -/*! - * \ingroup MultidomainModel - * \brief Writes the intermediate solutions during - * the Newton scheme - */ -template -struct MultiDomainConvergenceWriter -{ - typedef typename GET_PROP_TYPE(TypeTag, NewtonController) NewtonController; - - typedef typename GET_PROP_TYPE(TypeTag, Problem) Problem; - typedef typename GET_PROP_TYPE(TypeTag, SolutionVector) SolutionVector; - typedef typename GET_PROP_TYPE(TypeTag, SplitAndMerge) SplitAndMerge; - - typedef typename GET_PROP_TYPE(TypeTag, SubDomain1TypeTag) SubDomain1TypeTag; - typedef typename GET_PROP_TYPE(TypeTag, SubDomain2TypeTag) SubDomain2TypeTag; - - typedef typename GET_PROP_TYPE(SubDomain1TypeTag, GridView) GridView1; - typedef typename GET_PROP_TYPE(SubDomain2TypeTag, GridView) GridView2; - - typedef typename GET_PROP_TYPE(SubDomain1TypeTag, SolutionVector) SolutionVector1; - typedef typename GET_PROP_TYPE(SubDomain2TypeTag, SolutionVector) SolutionVector2; - - typedef VtkMultiWriter VtkMultiWriter1; - typedef VtkMultiWriter VtkMultiWriter2; - - /*! - * \brief The constructor - * \param ctl The newton controller - */ - MultiDomainConvergenceWriter(NewtonController &ctl) - : ctl_(ctl) - { - timeStepIndex_ = 0; - iteration_ = 0; - vtkMultiWriter1_ = 0; - vtkMultiWriter2_ = 0; - } - - /*! - * \brief Start and advance in time - */ - void beginTimestep() - { - ++timeStepIndex_; - iteration_ = 0; - } - - /*! - * \brief Start and advance one iteration - * - * \param gridView1 The grid view of sub problem 1 - * \param gridView2 The grid view of sub problem 2 - */ - void beginIteration(const GridView1 &gridView1, - const GridView2 &gridView2) - { - ++ iteration_; - if (!vtkMultiWriter1_) - vtkMultiWriter1_ = std::make_shared(gridView1, "convergence1"); - vtkMultiWriter1_->beginWrite(timeStepIndex_ + iteration_ / 100.0); - - if (!vtkMultiWriter2_) - vtkMultiWriter2_ = std::make_shared(gridView2, "convergence2"); - vtkMultiWriter2_->beginWrite(timeStepIndex_ + iteration_ / 100.0); - } - - /*! - * \brief Write convergence to vtk - * - * \param uLastIter The solution of the last iteration - * \param deltaU The delta as calculated from solving the linear - * system of equations. This parameter also stores - * the updated solution. - */ - void writeFields(const SolutionVector &uLastIter, - const SolutionVector &deltaU) - { - SolutionVector1 uLastIter1(ctl_.method().model().sdModel1().curSol()); - SolutionVector2 uLastIter2(ctl_.method().model().sdModel2().curSol()); - SolutionVector1 deltaU1(uLastIter1); - SolutionVector2 deltaU2(uLastIter2); - - SplitAndMerge::splitSolVector(uLastIter, uLastIter1, uLastIter2); - SplitAndMerge::splitSolVector(deltaU, deltaU1, deltaU2); - - std::cout << "\nWriting convergence file of current Newton iteration\n"; - ctl_.method().model().sdModel1().addConvergenceVtkFields(*vtkMultiWriter1_, uLastIter1, deltaU1); - ctl_.method().model().sdModel2().addConvergenceVtkFields(*vtkMultiWriter2_, uLastIter2, deltaU2); - } - - //! \brief End of iteration - void endIteration() - { - vtkMultiWriter1_->endWrite(); - vtkMultiWriter2_->endWrite(); - } - - //! \brief End of time step - void endTimestep() - { - iteration_ = 0; - } - -private: - int timeStepIndex_; - int iteration_; - std::shared_ptr vtkMultiWriter1_; - std::shared_ptr vtkMultiWriter2_; - NewtonController &ctl_; -}; - -} // namespace Dumux - -#endif // DUMUX_MULTIDOMAIN_CONVERGENCEWRITER_HH diff --git a/dumux/multidomain/localoperator.hh b/dumux/multidomain/localoperator.hh deleted file mode 100644 index 84bf4a0eabd5e0fbb5a104788d8e0dc0234f3793..0000000000000000000000000000000000000000 --- a/dumux/multidomain/localoperator.hh +++ /dev/null @@ -1,134 +0,0 @@ -// -*- mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- -// vi: set et ts=4 sw=4 sts=4: -/***************************************************************************** - * See the file COPYING for full copying permissions. * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 2 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program. If not, see . * - *****************************************************************************/ -/*! - * \file - * \brief Local operator base class for multidomain problems - */ - -#ifndef DUMUX_MULTIDOMAIN_LOCAL_OPERATOR_HH -#define DUMUX_MULTIDOMAIN_LOCAL_OPERATOR_HH - -#include -#include - -#include - -namespace Dumux { - -namespace PDELab { - -/*! - * \ingroup MultidomainModel - * \brief Local operator base class for multidomain problems - */ -template -class MultiDomainLocalOperator - : public Dune::PDELab::FullVolumePattern, - public Dune::PDELab::LocalOperatorDefaultFlags -{ - // copying the local operator for PDELab is not a good idea - MultiDomainLocalOperator(const MultiDomainLocalOperator &); - - typedef typename GET_PROP_TYPE(TypeTag, Model) Model; - - enum{numEq = GET_PROP_VALUE(TypeTag, NumEq)}; - -public: - // pattern assembly flags - enum { doPatternVolume = true }; - - // residual assembly flags - enum { doAlphaVolume = true }; - - //! \brief The constructor - MultiDomainLocalOperator(Model &model) - : model_(model) - {} - - /*! - * \brief Volume integral depending on test and ansatz functions - * - * \tparam EG Element geometry - * \tparam LFSU Local function space for ansatz functions - * \tparam X Coefficient vector - * \tparam LFSV Local function space for test functions - * \tparam R Residual vector - * - * \param eg Element geometry - * \param lfsu Local functions space for ansatz functions - * \param x Coefficient vector - * \param lfsv Local function space for test functions - * \param r Residual vector - */ - template - void alpha_volume (const EG& eg, const LFSU& lfsu, const X& x, - const LFSV& lfsv, R& r) const - { - typedef typename LFSU::Traits::SizeType size_type; - - model_.localResidual().eval(model_.gridView().grid().subDomainEntityPointer(eg.entity())); - - int numVertices = x.size()/numEq; - for (size_type comp = 0; comp < r.size(); comp++) - r.accumulate(lfsv, comp, model_.localResidual().residual(comp%numVertices)[comp/numVertices]); - } - - /*! - * \brief Jacobian of volume term - * - * \tparam EG Element geometry - * \tparam LFSU Local function space for ansatz functions - * \tparam X Coefficient vector - * \tparam LFSV Local function space for test functions - * \tparam M Matrix - * - * \param eg Element geometry - * \param lfsu Local functions space for ansatz functions - * \param x Coefficient vector - * \param lfsv Local function space for test functions - * \param mat Matrix - */ - template - void jacobian_volume (const EG& eg, - const LFSU& lfsu, - const X& x, - const LFSV& lfsv, - M& mat) const - { - typedef typename LFSU::Traits::SizeType size_typeU; - typedef typename LFSV::Traits::SizeType size_typeV; - - model_.localJacobian().assemble(model_.gridView().grid().subDomainEntityPointer(eg.entity())); - - int numVertices = x.size()/numEq; - for (size_typeV j=0; j. * - *****************************************************************************/ -/*! - * \file - * \brief The base class of models which consist of two arbitrary - * sub-models which are coupled - */ - -#ifndef DUMUX_MULTIDOMAIN_MODEL_HH -#define DUMUX_MULTIDOMAIN_MODEL_HH - -#include "properties.hh" -#include "propertydefaults.hh" -#include "problem.hh" -#include "convergencewriter.hh" -#include "newtoncontroller.hh" - -namespace Dumux -{ -/*! - * \ingroup MultidomainModel - * \brief The base class of models which consist of two arbitrary - * sub-models which are coupled - */ -template -class MultiDomainModel -{ - typedef typename GET_PROP_TYPE(TypeTag, Model) Implementation; - typedef typename GET_PROP_TYPE(TypeTag, Problem) Problem; - typedef typename GET_PROP_TYPE(TypeTag, Scalar) Scalar; - typedef typename GET_PROP_TYPE(TypeTag, NewtonMethod) NewtonMethod; - typedef typename GET_PROP_TYPE(TypeTag, NewtonController) NewtonController; - typedef typename GET_PROP_TYPE(TypeTag, JacobianAssembler) JacobianAssembler; - typedef typename GET_PROP_TYPE(TypeTag, SolutionVector) SolutionVector; - - typedef typename GET_PROP_TYPE(TypeTag, SubDomain1TypeTag) SubDomain1TypeTag; - typedef typename GET_PROP_TYPE(TypeTag, SubDomain2TypeTag) SubDomain2TypeTag; - - typedef typename GET_PROP_TYPE(SubDomain1TypeTag, Problem) SubDomainProblem1; - typedef typename GET_PROP_TYPE(SubDomain2TypeTag, Problem) SubDomainProblem2; - - typedef typename GET_PROP_TYPE(SubDomain1TypeTag, Model) SubDomainModel1; - typedef typename GET_PROP_TYPE(SubDomain2TypeTag, Model) SubDomainModel2; - - typedef typename GET_PROP_TYPE(TypeTag, SplitAndMerge) SplitAndMerge; - - enum { - numEq1 = GET_PROP_VALUE(TypeTag, NumEq1), - numEq2 = GET_PROP_VALUE(TypeTag, NumEq2) - }; - -public: - /*! - * \brief Apply the initial conditions to the model. - * - * \param problem The problem - */ - void init(Problem &problem) - { - problem_ = &problem; - - // the two sub models have already been initialized by the - // sub-problems! - jacAsm_ = std::make_shared(); - jacAsm_->init(problem); - - uCur_ = std::make_shared(jacAsm_->gridFunctionSpace()); - uPrev_ = std::make_shared(jacAsm_->gridFunctionSpace()); - - *uCur_= 0; - *uPrev_= 0; - - SplitAndMerge::mergeSolVectors(sdModel1().curSol(), - sdModel2().curSol(), - *uCur_); - SplitAndMerge::mergeSolVectors(sdModel1().prevSol(), - sdModel2().prevSol(), - *uPrev_); - } - - /*! - * \brief Reference to the current solution as a block vector. - */ - SolutionVector &curSol() - { return *uCur_; } - - //! \brief \copydoc curSol() - const SolutionVector &curSol() const - { return *uCur_; } - - /*! - * \brief Reference to the previous solution as a block vector. - */ - SolutionVector &prevSol() - { return *uPrev_; } - - //! \brief \copydoc prevSol() - const SolutionVector &prevSol() const - { return *uPrev_; } - - /*! - * \brief Returns the operator assembler for the global jacobian of - * the problem. - */ - JacobianAssembler &jacobianAssembler() - { return *jacAsm_; } - - //! \brief \copydoc jacobianAssembler() - const JacobianAssembler &jacobianAssembler() const - { return *jacAsm_; } - - /*! - * \brief A reference to the problem on which the model is applied. - */ - Problem &problem() - { return *problem_; } - - //! \brief \copydoc problem() - const Problem &problem() const - { return *problem_; } - - /*! - * \brief A reference to the problem on which the model is applied. - */ - SubDomainProblem1 &sdProblem1() - { return problem().sdProblem1(); } - - //! \brief \copydoc sdProblem1() - const SubDomainProblem1 &sdProblem1() const - { return problem().sdProblem1(); } - - /*! - * \brief A reference to the problem on which the model is applied. - */ - SubDomainProblem2 &sdProblem2() - { return problem().sdProblem2(); } - - //! \brief \copydoc sdProblem2() - const SubDomainProblem2 &sdProblem2() const - { return problem().sdProblem2(); } - - /*! - * \brief A reference to the first sub-problem's model. - */ - SubDomainModel1 &sdModel1() - { return sdProblem1().model(); } - - //! \brief \copydoc sdModel1() - const SubDomainModel1 &sdModel1() const - { return sdProblem1().model(); } - - /*! - * \brief A reference to the second sub-problem's model. - */ - SubDomainModel2 &sdModel2() - { return sdProblem2().model(); } - - //! \brief \copydoc sdModel2() - const SubDomainModel2 &sdModel2() const - { return sdProblem2().model(); } - - //! \copydoc ImplicitModel::update() - bool update(NewtonMethod &solver, - NewtonController &controller) - { -#if HAVE_VALGRIND - for (size_t i = 0; i < curSol().base().size(); ++i) - Valgrind::CheckDefined(curSol().base()[i]); -#endif // HAVE_VALGRIND - - asImp_().updateBegin(); - - bool converged = solver.execute(controller); - if (!converged) - asImp_().updateFailed(); - else - asImp_().updateSuccessful(); - -#if HAVE_VALGRIND - for (size_t i = 0; i < curSol().base().size(); ++i) { - Valgrind::CheckDefined(curSol().base()[i]); - } -#endif // HAVE_VALGRIND - - return converged; - } - - - //! \copydoc ImplicitModel::checkPlausibility() - void checkPlausibility() const - { } - - //! \copydoc ImplicitModel::updateBegin() - void updateBegin() - { - sdModel1().updateBegin(); - sdModel2().updateBegin(); - - SplitAndMerge::mergeSolVectors(sdModel1().curSol(), sdModel2().curSol(), *uCur_); - } - - //! \copydoc ImplicitModel::updateSuccessful() - void updateSuccessful() - { - sdModel1().updateSuccessful(); - sdModel2().updateSuccessful(); - } - - /*! - * \brief Called by the problem if a timeintegration was - * successful, post processing of the solution is done and the - * result has been written to disk. - * - * This should perpare the model for the next time integration. - * Note, that the advanceTimeLevel() methods of the sub-models - * have already been called by the individual sub problems... - */ - void advanceTimeLevel() - { - // merge the two sub-vectors together - SplitAndMerge::mergeSolVectors(sdModel1().curSol(), sdModel2().curSol(), *uCur_); - SplitAndMerge::mergeSolVectors(sdModel1().prevSol(), sdModel2().prevSol(), *uPrev_); - } - - //! \copydoc ImplicitModel::updateFailed() - void updateFailed() - { - sdModel1().updateFailed(); - sdModel2().updateFailed(); - - // merge the two sub-vectors together - SplitAndMerge::mergeSolVectors(sdModel1().curSol(), sdModel2().curSol(), *uCur_); - } - - /*! - * \brief Called by the update() method if a try was - * unsuccessful. This is primary a hook which the - * actual model can overload. - */ - void updateFailedTry() - { - sdModel1().updateFailedTry(); - sdModel2().updateFailedTry(); - - // merge the two sub-vectors together - SplitAndMerge::mergeSolVectors(sdModel1().curSol(), sdModel2().curSol(), *uCur_); - } - - /*! - * \brief Calculate the global residual. - * - * \param globResidual The global residual - * - * The global deflection of the balance equation from zero. - */ - void evalGlobalResidual(SolutionVector &globResidual) - { - DUNE_THROW(Dune::NotImplemented, ""); - } - - //! \copydoc ImplicitModel::serialize() - template - void serialize(Restarter &res) - { - sdProblem1().serialize(res); - sdProblem2().serialize(res); - } - - //! \copydoc ImplicitModel::deserialize() - template - void deserialize(Restarter &res) - { - sdProblem1().deserialize(res); - sdProblem2().deserialize(res); - wasRestarted_ = true; - } - - //! \copydoc ImplicitModel::resetJacobianAssembler() - void resetJacobianAssembler() - { - jacAsm_.template reset(0); - jacAsm_ = std::make_shared(asImp_(), problem()); - } - - -protected: - Implementation &asImp_() - { return *static_cast(this); } - const Implementation &asImp_() const - { return *static_cast(this); } - - // the problem we want to solve. defines the constitutive - // relations, material laws, etc. - Problem *problem_; - - // the jacobian assembler - std::shared_ptr jacAsm_; - - // cur is the current solution, prev the solution of the previous - // time step - std::shared_ptr uCur_; - std::shared_ptr uPrev_; - - bool wasRestarted_; -}; -} // namespace Dumux - -#endif // DUMUX_MULTIDOMAIN_MODEL_HH diff --git a/dumux/multidomain/newtoncontroller.hh b/dumux/multidomain/newtoncontroller.hh deleted file mode 100644 index 1fefd9ac3d8ac123b1a4685b9956b7e383bad223..0000000000000000000000000000000000000000 --- a/dumux/multidomain/newtoncontroller.hh +++ /dev/null @@ -1,313 +0,0 @@ -// -*- mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- -// vi: set et ts=4 sw=4 sts=4: -/***************************************************************************** - * See the file COPYING for full copying permissions. * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 2 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program. If not, see . * - *****************************************************************************/ -/*! - * \file - * \brief Newton controller for multidomain problems - */ -#ifndef DUMUX_MULTIDOMAIN_NEWTON_CONTROLLER_HH -#define DUMUX_MULTIDOMAIN_NEWTON_CONTROLLER_HH - -#include -#include "convergencewriter.hh" - -namespace Dumux -{ -template -class MultiDomainNewtonController; - -template -struct MultiDomainConvergenceWriter; - -namespace Properties -{ -NEW_PROP_TAG(NewtonWriteConvergence); - -// set default values for Newton for multidomain problems -// they can be overwritten in the parameter file -SET_INT_PROP(MultiDomain, NewtonTargetSteps, 8); -SET_INT_PROP(MultiDomain, NewtonMaxSteps, 15); -SET_SCALAR_PROP(MultiDomain, NewtonMaxRelativeShift, 1e-5); -SET_BOOL_PROP(MultiDomain, NewtonWriteConvergence, false); -} - - -/*! - * \ingroup Newton - * \ingroup MultidomainModel - * \brief Reference implementation of a newton controller for coupled problems. - * - * If you want to specialize only some methods but are happy with - * the defaults of the reference controller, derive your - * controller from this class and simply overload the required - * methods. - */ -template -class MultiDomainNewtonController : public NewtonController -{ - typedef NewtonController ParentType; - typedef typename GET_PROP_TYPE(TypeTag, Scalar) Scalar; - typedef typename GET_PROP_TYPE(TypeTag, NewtonController) Implementation; - - typedef typename GET_PROP_TYPE(TypeTag, NewtonMethod) NewtonMethod; - typedef typename GET_PROP_TYPE(TypeTag, SolutionVector) SolutionVector; - typedef typename GET_PROP_TYPE(TypeTag, SplitAndMerge) SplitAndMerge; - typedef typename GET_PROP_TYPE(TypeTag, Problem) Problem; - - typedef typename GET_PROP_TYPE(TypeTag, SubDomain1TypeTag) SubDomain1TypeTag; - typedef typename GET_PROP_TYPE(TypeTag, SubDomain2TypeTag) SubDomain2TypeTag; - - typedef typename GET_PROP_TYPE(SubDomain1TypeTag, GridView) GridView1; - typedef typename GET_PROP_TYPE(SubDomain2TypeTag, GridView) GridView2; - - typedef MultiDomainConvergenceWriter ConvergenceWriter; - typedef typename GET_PROP_TYPE(TypeTag, LinearSolver) LinearSolver; - -public: - /*! - * \brief Constructor - * - * \param problem The problem - */ - MultiDomainNewtonController(const Problem &problem) - : ParentType(problem) - , endIterMsgStream_(std::ostringstream::out) - , linearSolver_(problem) - , convergenceWriter_(asImp_()) - { - std::cout << "NewtonMaxRelativeShift= " - << PROP_DIAGNOSTIC(TypeTag, NewtonMaxRelativeShift) - << ", " - << GET_PROP_VALUE(TypeTag, NewtonMaxRelativeShift) - << std::endl; - } - - //! \copydoc ParentType::newtonUpdateShift() - void newtonUpdateShift(const SolutionVector &uLastIter, - const SolutionVector &deltaU) - { - // calculate the relative error as the maximum relative - // deflection in any degree of freedom. - this->shift_ = 0; - - SolutionVector uNewI = uLastIter; - uNewI -= deltaU; - - using std::abs; - using std::max; - for (unsigned int i = 0; i < uLastIter.base().size(); ++i) { - for (unsigned int j = 0; j < uLastIter.base()[i].size(); ++j) { - Scalar vertexError = abs(deltaU.base()[i][j]); - vertexError /= max(1.0, abs(uLastIter.base()[i][j] + uNewI.base()[i][j])/2); - - this->shift_ = max(this->shift_, vertexError); - } - } - } - - /*! - * \brief Solve the linear system of equations - * \f$ \mathbf{A} x - b = 0\f$. - * - * \param A Coefficient matrix A - * \param x Vector of unknowns - * \param b Right hand side - * - * Throws NumericalProblem if the linear solver didn't - * converge. - */ - template - void newtonSolveLinear(Matrix &A, - Vector &x, - Vector &b) - { - // if the deflection of the newton method is large, we do not - // need to solve the linear approximation accurately. Assuming - // that the initial value for the delta vector u is quite - // close to the final value, a reduction of 6 orders of - // magnitude in the defect should be sufficient... - try { - int converged = linearSolver_.solve(A.base(), x.base(), b.base()); - -#if HAVE_MPI - // make sure all processes converged - int convergedSend = 1; - MPI_Allreduce(/*sendBuf=*/&convergedSend, - /*recvBuf=*/&converged, - /*count=*/1, - MPI_INT, - MPI_MIN, - MPI_COMM_WORLD); -#endif - if (!converged) { - DUNE_THROW(NumericalProblem, - "Linear solver did not converge"); - } - } - catch (const Dune::MatrixBlockError &e) { -#if HAVE_MPI - // make sure all processes converged - int convergedSend = 0; - int converged; - - MPI_Allreduce(/*sendBuf=*/&convergedSend, - /*recvBuf=*/&converged, - /*count=*/1, - MPI_INT, - MPI_MIN, - MPI_COMM_WORLD); -#endif - - NumericalProblem p; - std::string msg; - std::ostringstream ms(msg); - ms << e.what() << "M=" << A.base()[e.r][e.c]; - p.message(ms.str()); - throw p; - } - catch (const Dune::Exception &e) { -#if HAVE_MPI - // make sure all processes converged - int convergedSend = 0; - int converged; - - MPI_Allreduce(/*sendBuf=*/&convergedSend, - /*recvBuf=*/&converged, - /*count=*/1, - MPI_INT, - MPI_MIN, - MPI_COMM_WORLD); -#endif - - NumericalProblem p; - p.message(e.what()); - throw p; - } - } - - /*! - * \brief Update the current solution function with a delta vector. - * - * The error estimates required for the newtonConverged() and - * newtonProceed() methods should be updated here. - * - * Different update strategies, such as line search and chopped - * updates can be implemented. The default behaviour is just to - * subtract deltaU from uLastIter. - * - * \param uCurrentIter The solution of the current iteration - * \param uLastIter The solution of the last iteration - * \param deltaU The delta as calculated from solving the linear - * system of equations. This parameter also stores - * the updated solution. - * - */ - void newtonUpdate(SolutionVector &uCurrentIter, - const SolutionVector &uLastIter, - const SolutionVector &deltaU) - { - if (GET_PARAM_FROM_GROUP(TypeTag, bool, Newton, WriteConvergence)) { - writeConvergence_(uLastIter, deltaU); - } - - newtonUpdateShift(uLastIter, deltaU); - - uCurrentIter = uLastIter; - uCurrentIter -= deltaU; - } - - /*! - * \brief Indicates that one newton iteration was finished. - * - * \param uCurrentIter The solution of the current iteration - * \param uLastIter The solution of the last iteration - * - */ - void newtonEndStep(SolutionVector &uCurrentIter, SolutionVector &uLastIter) - { - SplitAndMerge::splitSolVector(this->model_().curSol(), - this->model_().sdModel1().curSol(), - this->model_().sdModel2().curSol()); - - ParentType::newtonEndStep(uCurrentIter, uLastIter); - } - - /*! - * \brief Called when the newton method was sucessful. - * - * This method is called _after_ newtonEnd() - */ - void newtonSucceed() - { - } - - /*! - * \brief the convergence writer produces the output - * - * \param uLastIter The solution of the last iteration - * \param deltaU The delta as calculated from solving the linear - * system of equations. This parameter also stores - * the updated solution. - * - */ - void writeConvergence_(const SolutionVector &uLastIter, - const SolutionVector &deltaU) - { - if (GET_PARAM_FROM_GROUP(TypeTag, bool, Newton, WriteConvergence)) { - convergenceWriter_.beginIteration(sdGridView1_(), sdGridView2_()); - convergenceWriter_.writeFields(uLastIter, deltaU); - convergenceWriter_.endIteration(); - } - } - - /*! - * \brief the subdomain gridviews - */ - const GridView1 sdGridView1_() const - { return this->problem_().sdGridView1(); } - const GridView2 sdGridView2_() const - { return this->problem_().sdGridView2(); } - - -private: - Implementation &asImp_() - { return *static_cast(this); } - const Implementation &asImp_() const - { return *static_cast(this); } - - bool verbose_; - - std::ostringstream endIterMsgStream_; - NewtonMethod *method_; - - // optimal number of iterations we want to achieve - int targetSteps_; - // maximum number of iterations we do before giving up - int maxSteps_; - // actual number of steps done so far - int numSteps_; - - // the linear solver - LinearSolver linearSolver_; - - ConvergenceWriter convergenceWriter_; -}; - -} // namespace Dumux - -#endif // DUMUX_MULTIDOMAIN_NEWTON_CONTROLLER_HH diff --git a/dumux/multidomain/problem.hh b/dumux/multidomain/problem.hh deleted file mode 100644 index 1aff9346c781b3c129746bf1d33efd321389b4c6..0000000000000000000000000000000000000000 --- a/dumux/multidomain/problem.hh +++ /dev/null @@ -1,457 +0,0 @@ -// -*- mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- -// vi: set et ts=4 sw=4 sts=4: -/***************************************************************************** - * See the file COPYING for full copying permissions. * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 2 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program. If not, see . * - *****************************************************************************/ -/*! - * \file - * \brief Base class for problems which involve two sub problems - */ - -#ifndef DUMUX_MULTIDOMAIN_PROBLEM_HH -#define DUMUX_MULTIDOMAIN_PROBLEM_HH - -#include "model.hh" -#include "newtoncontroller.hh" -#include "propertydefaults.hh" -#include "subdomainpropertydefaults.hh" -#include "assembler.hh" - -#include - - -namespace Dumux -{ - -/*! - * \ingroup ImplicitBaseProblems - * \ingroup MultidomainModel - * \brief Base class for problems which involve two sub problems (multidomain problems)s - */ -template -class MultiDomainProblem -{ - -private: - typedef typename GET_PROP_TYPE(TypeTag, Problem) Implementation; - - typedef typename GET_PROP_TYPE(TypeTag, TimeManager) TimeManager; - typedef typename GET_PROP_TYPE(TypeTag, NewtonMethod) NewtonMethod; - typedef typename GET_PROP_TYPE(TypeTag, NewtonController) NewtonController; - - typedef typename GET_PROP_TYPE(TypeTag, Scalar) Scalar; - typedef typename GET_PROP_TYPE(TypeTag, Model) Model; - typedef typename GET_PROP_TYPE(TypeTag, GridCreator) GridCreator; - - typedef typename GET_PROP_TYPE(TypeTag, SubDomain1TypeTag) SubDomain1TypeTag; - typedef typename GET_PROP_TYPE(TypeTag, SubDomain2TypeTag) SubDomain2TypeTag; - - typedef typename GET_PROP_TYPE(SubDomain1TypeTag, LocalResidual) LocalResidual1; - typedef typename GET_PROP_TYPE(SubDomain2TypeTag, LocalResidual) LocalResidual2; - - typedef typename GET_PROP_TYPE(SubDomain1TypeTag, Problem) SubDomainProblem1; - typedef typename GET_PROP_TYPE(SubDomain2TypeTag, Problem) SubDomainProblem2; - - typedef typename GET_PROP_TYPE(SubDomain1TypeTag, GridView) SubDomainGridView1; - typedef typename GET_PROP_TYPE(SubDomain2TypeTag, GridView) SubDomainGridView2; - - typedef typename GET_PROP_TYPE(TypeTag, MultiDomainGrid) MultiDomainGrid; - typedef typename MultiDomainGrid::LeafGridView MultiDomainGridView; - typedef typename MultiDomainGrid::Traits::template Codim<0>::Entity MultiDomainElement; - typedef typename MultiDomainGrid::SubDomainGrid SubDomainGrid; - typedef typename SubDomainGrid::template Codim<0>::EntityPointer SubDomainElementPointer; - - typedef Dune::MultiDomainMCMGMapper VertexMapper; - - // copying a problem is not a good idea - MultiDomainProblem(const MultiDomainProblem &); - -public: - /*! - * \brief The problem for the coupling of Stokes and Darcy flow - * - * \param timeManager The time manager - * \param gridView The grid view - */ - template - MultiDomainProblem(TimeManager &timeManager, - GridView gridView) - : timeManager_(timeManager) - , newtonMethod_(asImp_()) - , newtonCtl_(asImp_()) - { - mdGrid_ = std::make_shared (GridCreator::grid()); - mdGridView_ = std::make_shared (mdGrid_->leafGridView()); - mdVertexMapper_ = std::make_shared (mdGrid_->leafGridView()); - sdProblem1_ = std::make_shared (timeManager, mdGrid_->subDomain(sdID1()).leafGridView()); - sdProblem2_ = std::make_shared (timeManager, mdGrid_->subDomain(sdID2()).leafGridView()); - maxTimeStepSize_ = GET_PARAM_FROM_GROUP(TypeTag, Scalar, TimeManager, MaxTimeStepSize); - } - - //! \copydoc ImplicitProblem::init() - void init() - { - // initialize the sub-problems - sdProblem1().init(); - sdProblem2().init(); - - // set the initial condition of the model - model().init(asImp_()); - - // initialize Lagrange multipliers - asImp_().initMortarElements(); - } - - //! \copydoc ImplicitProblem::serialize() - template - void serialize(Restarter &res) - { - this->model().serialize(res); - } - - //! \copydoc ImplicitProblem::serialize() - void serialize() - { - typedef Restart Restarter; - Restarter res; - res.serializeBegin(this->asImp_()); - std::cout << "Serialize to file '" << res.fileName() << "'\n"; - this->timeManager().serialize(res); - this->asImp_().serialize(res); - res.serializeEnd(); - } - - //! \copydoc ImplicitProblem::restart() - void restart(Scalar tRestart) - { - typedef Restart Restarter; - Restarter res; - res.deserializeBegin(this->asImp_(), tRestart); - std::cout << "Deserialize from file '" << res.fileName() << "'\n"; - this->timeManager().deserialize(res); - this->asImp_().deserialize(res); - res.deserializeEnd(); - } - - //! \copydoc ImplicitProblem::deserialize() - template - void deserialize(Restarter &res) - { - this->model().deserialize(res); - } - - /*! - * \name Simulation control - */ - // \{ - - /*! - * \brief Called by the time manager before the time integration. Calls preTimeStep() - * of the subproblems. - */ - void preTimeStep() - { - asImp_().sdProblem1().preTimeStep(); - asImp_().sdProblem2().preTimeStep(); - } - - //! \copydoc ImplicitProblem::timeIntegration() - void timeIntegration() - { - const int maxFails = - GET_PARAM_FROM_GROUP(TypeTag, int, Newton, MaxTimeStepDivisions); - for (int i = 0; i < maxFails; ++i) - { - if (model_.update(newtonMethod_, newtonCtl_)) - return; - - // update failed - Scalar dt = timeManager().timeStepSize(); - Scalar nextDt = dt / 2; - timeManager().setTimeStepSize(nextDt); - - std::cout << "Newton solver did not converge. Retrying with time step of " - << timeManager().timeStepSize() << "sec\n"; - } - - DUNE_THROW(Dune::MathError, - "Newton solver didn't converge after " - << maxFails - << " timestep divisions. dt=" - << timeManager().timeStepSize()); - } - - /*! - * \brief Called by the time manager after the time integration to - * do some post processing on the solution. Calls postTimeStep() - * of the subproblems. - */ - void postTimeStep() - { - asImp_().sdProblem1().postTimeStep(); - asImp_().sdProblem2().postTimeStep(); - } - - //! \copydoc ImplicitProblem::maxTimeStepSize() - Scalar maxTimeStepSize() const - { - return maxTimeStepSize_; - } - - //! \copydoc ImplicitProblem::nextTimeStepSize() - Scalar nextTimeStepSize(const Scalar dt) - { - return newtonCtl_.suggestTimeStepSize(dt); - } - - /*! - * \brief This method is called by the model if the update to the - * next time step failed completely. - */ - void updateSuccessful() - { - model_.updateSuccessful(); - } - - //! \copydoc ImplicitProblem::shouldWriteOutput() - bool shouldWriteOutput() const - { return true; } - - //! \copydoc ImplicitProblem::shouldWriteRestartFile() - bool shouldWriteRestartFile() const - { return false; } - - //! \copydoc ImplicitProblem::episodeEnd() - void episodeEnd() - { - std::cerr << "The end of an episode is reached, but the problem " - << "does not override the episodeEnd() method. " - << "Doing nothing!\n"; - } - - //! \copydoc ImplicitProblem::advanceTimeLevel() - void advanceTimeLevel() - { - asImp_().sdProblem1().advanceTimeLevel(); - asImp_().sdProblem2().advanceTimeLevel(); - - model_.advanceTimeLevel(); - } - - //! \copydoc ImplicitProblem::writeOutput() - void writeOutput() - { - // write the current result to disk - if (asImp_().shouldWriteOutput()) { - asImp_().sdProblem1().writeOutput(); - asImp_().sdProblem2().writeOutput(); - } - } - - - // \} - - //! \copydoc ImplicitProblem::name() - const std::string& name() const - { return simname_; } - - //! \copydoc ImplicitProblem::setName() - static void setName(std::string newName) - { simname_ = newName; } - - //! \copydoc ImplicitProblem::timeManager() - TimeManager &timeManager() - { return timeManager_; } - - //! \copydoc ImplicitProblem::timeManager() - const TimeManager &timeManager() const - { return timeManager_; } - - //! \copydoc ImplicitProblem::newtonController() - NewtonController &newtonController() - { return newtonCtl_; } - - //! \copydoc ImplicitProblem::newtonController() - const NewtonController &newtonController() const - { return newtonCtl_; } - - //! \copydoc ImplicitProblem::model() - Model &model() - { return model_; } - - //! \copydoc ImplicitProblem::model() - const Model &model() const - { return model_; } - // \} - - /*! - * \brief Returns the ID of the first domain - */ - const typename MultiDomainGrid::SubDomainIndex sdID1() const - { return typename MultiDomainGrid::SubDomainIndex(0); } - - /*! - * \brief Returns the ID of the second domain - */ - const typename MultiDomainGrid::SubDomainIndex sdID2() const - { return typename MultiDomainGrid::SubDomainIndex(1); } - - /*! - * \brief Returns a reference to subproblem1 - */ - SubDomainProblem1& sdProblem1() - { return *sdProblem1_; } - - /*! - * \brief Returns a const reference to subproblem1 - */ - const SubDomainProblem1& sdProblem1() const - { return *sdProblem1_; } - - /*! - * \brief Returns a reference to subproblem2 - */ - SubDomainProblem2& sdProblem2() - { return *sdProblem2_; } - - /*! - * \brief Returns a const reference to subproblem2 - */ - const SubDomainProblem2& sdProblem2() const - { return *sdProblem2_; } - - /*! - * \brief Returns a reference to the localresidual1 - */ - LocalResidual1& localResidual1() - { return sdProblem1().model().localResidual(); } - - /*! - * \brief Returns a reference to the localresidual2 - */ - LocalResidual2& localResidual2() - { return sdProblem2().model().localResidual(); } - - /*! - * \brief Returns a reference to the multidomain grid - */ - MultiDomainGrid& mdGrid() - { return *mdGrid_; } - - /*! - * \brief Returns a const reference to the multidomain grid - */ - const MultiDomainGrid& mdGrid() const - { return *mdGrid_; } - - /*! - * \brief Returns the multidomain gridview - */ - const MultiDomainGridView& mdGridView() const - { return *mdGridView_; } - - /*! - * \brief Returns the multidomain gridview - */ - const MultiDomainGridView& gridView() const - { return *mdGridView_; } - - /*! - * \brief Provides a vertex mapper for the multidomain - */ - VertexMapper& mdVertexMapper() - { return *mdVertexMapper_; } - - /*! - * \brief Returns a const reference to the subdomain1 grid - */ - const SubDomainGrid& sdGrid1() const - { return mdGrid_->subDomain(sdID1()); } - - /*! - * \brief Returns a const reference to the subdomain2 grid - */ - const SubDomainGrid& sdGrid2() const - { return mdGrid_->subDomain(sdID2()); } - - /*! - * \brief Returns the gridview of subdomain1 - */ - const SubDomainGridView1 sdGridView1() const - { return sdGrid1().leafGridView(); } - - /*! - * \brief Returns the gridview of subdomain2 - */ - const SubDomainGridView2 sdGridView2() const - { return sdGrid2().leafGridView(); } - - /*! - * \brief Returns a pointer to the subdomain1 element - * - * \param mdElement1 The multi domain element1 - */ - SubDomainElementPointer sdElementPointer1(const MultiDomainElement& mdElement1) - { return sdGrid1().subDomainEntityPointer(mdElement1); } - - /*! - * \brief Returns a pointer to the subdomain2 element - * - * \param mdElement2 The multi domain element2 - */ - SubDomainElementPointer sdElementPointer2(const MultiDomainElement& mdElement2) - { return sdGrid2().subDomainEntityPointer(mdElement2); } - - -protected: - void initMortarElements() - {} - - Implementation &asImp_() - { return *static_cast(this); } - - //! \copydoc asImp_() - const Implementation &asImp_() const - { return *static_cast(this); } - -private: - // a string for the name of the current simulation, which could be - // set by means of an program argument, for example. - static std::string simname_; - - TimeManager &timeManager_; - Scalar maxTimeStepSize_; - NewtonMethod newtonMethod_; - NewtonController newtonCtl_; - - Model model_; - - std::shared_ptr mdGrid_; - std::shared_ptr mdGridView_; - std::shared_ptr mdVertexMapper_; - - std::shared_ptr sdProblem1_; - std::shared_ptr sdProblem2_; -}; - -// definition of the static class member simname_, -// which is necessary because it is of type string. -template -std::string MultiDomainProblem::simname_ = "simCoupled"; - -} // namespace Dumux - -#endif // DUMUX_MULTIDOMAIN_PROBLEM_HH diff --git a/dumux/multidomain/properties.hh b/dumux/multidomain/properties.hh deleted file mode 100644 index c76e3cc61889d223b8ce1b36b4a2d31eebc79cab..0000000000000000000000000000000000000000 --- a/dumux/multidomain/properties.hh +++ /dev/null @@ -1,116 +0,0 @@ -// -*- mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- -// vi: set et ts=4 sw=4 sts=4: -/***************************************************************************** - * See the file COPYING for full copying permissions. * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 2 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program. If not, see . * - *****************************************************************************/ -/*! - * \file - * \ingroup Properties - * \ingroup ImplicitProperties - * \ingroup MultidomainModel - * \brief Specify properties required for the coupled model - */ -#ifndef DUMUX_MULTIDOMAIN_PROPERTIES_HH -#define DUMUX_MULTIDOMAIN_PROPERTIES_HH - -#include - -namespace Dumux -{ - -namespace Properties -{ -// \{ - -////////////////////////////////////////////////////////////////// -// Type tags tags -////////////////////////////////////////////////////////////////// - -//! The type tag for problems which utilize the coupling approach -NEW_TYPE_TAG(MultiDomain, INHERITS_FROM(ImplicitBase)); - -////////////////////////////////////////////////////////////////// -// Property tags -////////////////////////////////////////////////////////////////// - -//! Specifies the model -NEW_PROP_TAG(Model); - -//! Specifies the maximum number of sub-problems -NEW_PROP_TAG(MaxSubDomains); - -//! Specifies the type tag of the first sub-problem -NEW_PROP_TAG(SubDomain1TypeTag); - -//! Specifies the type tag of the second sub-problem -NEW_PROP_TAG(SubDomain2TypeTag); - -//! Specifies the type tag of the other sub-problem -NEW_PROP_TAG(OtherSubDomainTypeTag); - -//! Specifies the type tag of coupled problem -NEW_PROP_TAG(MultiDomainTypeTag); - -//! Specifies the host grid -NEW_PROP_TAG(Grid); - -//! Specifies the multidomain grid -NEW_PROP_TAG(MultiDomainGrid); - -//! Specifies the number of equations in submodel 1 -NEW_PROP_TAG(NumEq1); - -//! Specifies the number of equations in submodel 2 -NEW_PROP_TAG(NumEq2); - -//! Specifies the fluidsystem that is used in the subdomains -NEW_PROP_TAG(FluidSystem); - -//! the maximum allowed number of timestep divisions for the -//! Newton solver -NEW_PROP_TAG(NewtonMaxTimeStepDivisions); - -//! Specifies the multidomain grid function space -NEW_PROP_TAG(MultiDomainGridFunctionSpace); - -//! Specifies the multidomain grid operator -NEW_PROP_TAG(MultiDomainGridOperator); - -//! Specifies the equality conditions -NEW_PROP_TAG(MultiDomainCondition); - -//! Specifies the multidomain type based subproblem for subdomain 1 -NEW_PROP_TAG(MultiDomainSubProblem1); - -//! Specifies the multidomain type based subproblem for subdomain 2 -NEW_PROP_TAG(MultiDomainSubProblem2); - -//! the local coupling operator for use with dune-multidomain -NEW_PROP_TAG(MultiDomainCouplingLocalOperator); - -//! Specifies the multidomain coupling -NEW_PROP_TAG(MultiDomainCoupling); - -//! Property tag for the multidomain constraints transformation -NEW_PROP_TAG(MultiDomainConstraintsTrafo); - -//! the routines that are used to split and merge solution vectors -NEW_PROP_TAG(SplitAndMerge); - -} // namespace Properties -} // namespace Dumux - -#endif // DUMUX_MULTIDOMAIN_PROPERTIES_HH diff --git a/dumux/multidomain/propertydefaults.hh b/dumux/multidomain/propertydefaults.hh deleted file mode 100644 index b3f837bac32de8113070c0f4e9a27f1275b61e0b..0000000000000000000000000000000000000000 --- a/dumux/multidomain/propertydefaults.hh +++ /dev/null @@ -1,258 +0,0 @@ -// -*- mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- -// vi: set et ts=4 sw=4 sts=4: -/***************************************************************************** - * See the file COPYING for full copying permissions. * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 2 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program. If not, see . * - *****************************************************************************/ -/*! - * \file - * \ingroup Properties - * \ingroup ImplicitProperties - * \ingroup MultidomainModel - * \brief Sets default values for the MultiDomain properties - */ - -#ifndef DUMUX_MULTIDOMAIN_PROPERTY_DEFAULTS_HH -#define DUMUX_MULTIDOMAIN_PROPERTY_DEFAULTS_HH - -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include - -#include - -#include "subdomainpropertydefaults.hh" -#include "model.hh" -#include "properties.hh" -#include "newtoncontroller.hh" -#include "splitandmerge.hh" - -#include -#include - -namespace Dumux -{ -template class MultiDomainModel; -template class MultiDomainAssembler; -template class MultiDomainNewtonController; - -namespace Properties -{ - -SET_INT_PROP(MultiDomain, MaxSubDomains, 2); - -SET_PROP(MultiDomain, MultiDomainGrid) -{ -private: - typedef typename GET_PROP_TYPE(TypeTag, Grid) HostGrid; - enum { maxSubDomains = GET_PROP_VALUE(TypeTag, MaxSubDomains) }; - typedef typename Dune::mdgrid::FewSubDomainsTraits MDGridTraits; -public: - typedef typename Dune::MultiDomainGrid type; -}; - -SET_PROP(MultiDomain, MultiDomainGridFunctionSpace) -{ -private: - typedef typename GET_PROP_TYPE(TypeTag, MultiDomainGrid) MDGrid; - typedef typename Dune::PDELab::LexicographicOrderingTag OrderingTag; - typedef typename GET_PROP_TYPE(TypeTag, SubDomain1TypeTag) SubTypeTag1; - typedef typename GET_PROP_TYPE(TypeTag, SubDomain2TypeTag) SubTypeTag2; - typedef typename GET_PROP_TYPE(SubTypeTag1, GridFunctionSpace) GridFunctionSpace1; - typedef typename GET_PROP_TYPE(SubTypeTag2, GridFunctionSpace) GridFunctionSpace2; -public: - typedef Dune::PDELab::MultiDomain::MultiDomainGridFunctionSpace, - OrderingTag, - GridFunctionSpace1, - GridFunctionSpace2> type; -}; - -// set the subdomain equality condition by default -SET_PROP(MultiDomain, MultiDomainCondition) -{ -private: - typedef typename GET_PROP_TYPE(TypeTag, MultiDomainGrid) MDGrid; -public: - typedef Dune::PDELab::MultiDomain::SubDomainEqualityCondition type; -}; - -SET_PROP(MultiDomain, MultiDomainSubProblem1) -{ -private: - typedef typename GET_PROP_TYPE(TypeTag, MultiDomainGridFunctionSpace) MDGridFunctionSpace; - typedef typename GET_PROP_TYPE(TypeTag, SubDomain1TypeTag) SubTypeTag1; - typedef typename GET_PROP_TYPE(SubTypeTag1, Constraints) Constraints1; - typedef typename GET_PROP_TYPE(SubTypeTag1, LocalOperator) LocalOperator1; - typedef typename GET_PROP_TYPE(TypeTag, MultiDomainCondition) MDCondition; - typedef typename GET_PROP_TYPE(SubTypeTag1, GridFunctionSpace) GridFunctionSpace1; -public: - typedef Dune::PDELab::MultiDomain::SubProblem type; -}; - -SET_PROP(MultiDomain, MultiDomainSubProblem2) -{ -private: - typedef typename GET_PROP_TYPE(TypeTag, MultiDomainGridFunctionSpace) MDGridFunctionSpace; - typedef typename GET_PROP_TYPE(TypeTag, SubDomain2TypeTag) SubTypeTag2; - typedef typename GET_PROP_TYPE(SubTypeTag2, Constraints) Constraints2; - typedef typename GET_PROP_TYPE(SubTypeTag2, LocalOperator) LocalOperator2; - typedef typename GET_PROP_TYPE(TypeTag, MultiDomainCondition) MDCondition; - typedef typename GET_PROP_TYPE(SubTypeTag2, GridFunctionSpace) GridFunctionSpace2; -public: - typedef Dune::PDELab::MultiDomain::SubProblem type; -}; - -SET_PROP(MultiDomain, MultiDomainCoupling) -{ -private: - typedef typename GET_PROP_TYPE(TypeTag, MultiDomainSubProblem1) MDSubProblem1; - typedef typename GET_PROP_TYPE(TypeTag, MultiDomainSubProblem2) MDSubProblem2; - typedef typename GET_PROP_TYPE(TypeTag, MultiDomainCouplingLocalOperator) MDCouplingLocalOperator; -public: - typedef Dune::PDELab::MultiDomain::Coupling type; -}; - -// set trivial constraints transformation by default -SET_PROP(MultiDomain, MultiDomainConstraintsTrafo) -{ -private: - typedef typename GET_PROP_TYPE(TypeTag, MultiDomainGridFunctionSpace) MDGridFunctionSpace; - typedef typename GET_PROP_TYPE(TypeTag, Scalar) Scalar; -public: - typedef typename MDGridFunctionSpace::template ConstraintsContainer::Type type; -}; - -SET_PROP(MultiDomain, MultiDomainGridOperator) -{ -private: - typedef typename GET_PROP_TYPE(TypeTag, MultiDomainGridFunctionSpace) MDGridFunctionSpace; - typedef Dune::PDELab::ISTLMatrixBackend MBE; - typedef typename GET_PROP_TYPE(TypeTag, MultiDomainSubProblem1) MDSubProblem1; - typedef typename GET_PROP_TYPE(TypeTag, MultiDomainSubProblem2) MDSubProblem2; - typedef typename GET_PROP_TYPE(TypeTag, MultiDomainCoupling) MDCoupling; - typedef typename GET_PROP_TYPE(TypeTag, MultiDomainConstraintsTrafo) MDConstraintsTrafo; - typedef typename GET_PROP_TYPE(TypeTag, Scalar) Scalar; -public: - typedef Dune::PDELab::MultiDomain::GridOperator< - MDGridFunctionSpace, MDGridFunctionSpace, - MBE, Scalar, Scalar, Scalar, - MDConstraintsTrafo, MDConstraintsTrafo, - MDSubProblem1, MDSubProblem2, MDCoupling> type; -}; - -SET_PROP(MultiDomain, JacobianMatrix) -{ -private: - typedef typename GET_PROP_TYPE(TypeTag, MultiDomainGridOperator) MDGridOperator; -public: - typedef typename MDGridOperator::Traits::Jacobian type; -}; - -SET_INT_PROP(MultiDomain, LinearSolverBlockSize, GET_PROP_VALUE(TypeTag, NumEq)); - - -// Set property values for the coupled model -SET_TYPE_PROP(MultiDomain, Model, MultiDomainModel); - -SET_PROP(MultiDomain, SolutionVector) -{ -private: - typedef typename GET_PROP_TYPE(TypeTag, Scalar) Scalar; - enum { numEq = GET_PROP_VALUE(TypeTag, NumEq) }; -public: - typedef Dune::BlockVector > type; -}; - -// Specify the type of the multidomain assembler -SET_TYPE_PROP(MultiDomain, JacobianAssembler, MultiDomainAssembler); - -// use the plain newton method for the coupled problems by default -SET_TYPE_PROP(MultiDomain, NewtonMethod, NewtonMethod); - -// use the plain newton controller for coupled problems by default -SET_TYPE_PROP(MultiDomain, NewtonController, MultiDomainNewtonController); - -// Set the default type of the time manager for coupled models -SET_TYPE_PROP(MultiDomain, TimeManager, TimeManager); - -// needed to define size of ImplicitBase's PrimaryVariables -SET_PROP(MultiDomain, NumEq) -{ -private: - typedef typename GET_PROP_TYPE(TypeTag, SubDomain1TypeTag) TypeTag1; - typedef typename GET_PROP_TYPE(TypeTag, SubDomain2TypeTag) TypeTag2; - - enum { - numEq1 = GET_PROP_VALUE(TypeTag1, NumEq), - numEq2 = GET_PROP_VALUE(TypeTag2, NumEq) - }; -public: - static const int value = numEq1; -}; - -SET_PROP(MultiDomain, NumEq1) -{ -private: - typedef typename GET_PROP_TYPE(TypeTag, SubDomain1TypeTag) TypeTag1; - enum {numEq = GET_PROP_VALUE(TypeTag1, NumEq)}; -public: - static const int value = numEq; -}; - -SET_PROP(MultiDomain, NumEq2) -{ -private: - typedef typename GET_PROP_TYPE(TypeTag, SubDomain2TypeTag) TypeTag2; - enum {numEq = GET_PROP_VALUE(TypeTag2, NumEq)}; -public: - static const int value = numEq; -}; - -// set the type of the linear solver -SET_TYPE_PROP(MultiDomain, LinearSolver, ILU0BiCGSTABBackend); - -// set the minimum residual reduction of the linear solver -SET_SCALAR_PROP(MultiDomain, LinearSolverResidualReduction, 1e-6); - -// set the default number of maximum iterations for the linear solver -SET_INT_PROP(MultiDomain, LinearSolverMaxIterations, 250); - -// set the maximum time step divisions -SET_INT_PROP(MultiDomain, NewtonMaxTimeStepDivisions, 10); - -// set the routines for splitting and merging solution vectors -SET_TYPE_PROP(MultiDomain, SplitAndMerge, SplitAndMerge); - -} // namespace Properties -} // namespace Dumux - -#endif // DUMUX_MULTIDOMAIN_PROPERTY_DEFAULTS_HH diff --git a/dumux/multidomain/splitandmerge.hh b/dumux/multidomain/splitandmerge.hh deleted file mode 100644 index 297971ff9cbc346a4629eb63e1392aea953d2fd3..0000000000000000000000000000000000000000 --- a/dumux/multidomain/splitandmerge.hh +++ /dev/null @@ -1,240 +0,0 @@ -// -*- mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- -// vi: set et ts=4 sw=4 sts=4: -/***************************************************************************** - * See the file COPYING for full copying permissions. * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 2 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program. If not, see . * - *****************************************************************************/ -/** - * \file - * \brief Some methods required by several classes of the coupling model. - */ -#ifndef DUMUX_SPLIT_AND_MERGE_HH -#define DUMUX_SPLIT_AND_MERGE_HH - -#include "properties.hh" -#include - -namespace Dumux -{ -/*! - * \ingroup MultidomainModel - * \brief Some methods required by several classes of the coupling model. - */ -template -class SplitAndMerge -{ - typedef typename GET_PROP_TYPE(TypeTag, SubDomain1TypeTag) SubTypeTag1; - typedef typename GET_PROP_TYPE(TypeTag, SubDomain2TypeTag) SubTypeTag2; - - typedef typename GET_PROP_TYPE(TypeTag, SolutionVector) SolutionVector; - typedef typename GET_PROP_TYPE(SubTypeTag1, SolutionVector) SolutionVector1; - typedef typename GET_PROP_TYPE(SubTypeTag2, SolutionVector) SolutionVector2; - - typedef typename GET_PROP_TYPE(TypeTag, JacobianMatrix) JacobianMatrix; - typedef typename GET_PROP_TYPE(SubTypeTag1, JacobianMatrix) JacobianMatrix1; - typedef typename GET_PROP_TYPE(SubTypeTag2, JacobianMatrix) JacobianMatrix2; - - - enum { - numEq1 = GET_PROP_VALUE(SubTypeTag1, NumEq), - numEq2 = GET_PROP_VALUE(SubTypeTag2, NumEq) - }; -public: - /*! - * \brief Merge two solution vectors of the sub models into a - * global vector: nonoverlapping case. - * - * \param vec1 Input vector with solution of subdomain 1 - * \param vec2 Input vector with solution of subdomain 2 - * \param dest Destination vector for global solution - * - */ - static void mergeSolVectors(const SolutionVector1 &vec1, - const SolutionVector2 &vec2, - SolutionVector &dest) - { -// printvector(std::cout, vec1, "vec1", "row", 200, 1, 3); -// printvector(std::cout, vec2, "vec2", "row", 200, 1, 3); - - int nDofs1 = vec1.size(); - int nDofs2 = vec2.size(); - - for (int i = 0; i < nDofs1; ++i) - for (int j = 0; j < numEq1; j++) - { - dest.base()[i*numEq1 + j][0] = vec1[i][j]; - - Valgrind::CheckDefined(dest.base()[i*numEq1 + j][0]); - } - - for (int i = 0; i < nDofs2; ++i) - for (int j = 0; j < numEq2; j++) - { - dest.base()[nDofs1*numEq1 + i*numEq2 + j][0] = vec2[i][j]; - - Valgrind::CheckDefined(dest.base()[nDofs1*numEq1 + i*numEq2 + j][0]); - } -// printvector(std::cout, dest.base(), "dest", "row", 200, 1, 3); - } - - /*! - * \brief Split a global solution vector into two solution vectors - * of the sub models: nonoverlapping case. - * - * \param vec Input vector with global solution - * \param dest1 Destination vector with solution of subdomain 1 - * \param dest2 Destination vector with solution of subdomain 2 - * - */ - static void splitSolVector(const SolutionVector &vec, - SolutionVector1 &dest1, - SolutionVector2 &dest2) - { -// printvector(std::cout, vec.base(), "vec", "row", 200, 1, 3); - - int nDofs1 = dest1.size(); - int nDofs2 = dest2.size(); - - for (int i = 0; i < nDofs1; ++i) - for (int j = 0; j < numEq1; j++) - dest1[i][j] = vec.base()[i*numEq1 + j][0]; - - for (int i = 0; i < nDofs2; ++i) - for (int j = 0; j < numEq2; j++) - dest2[i][j] = vec.base()[nDofs1*numEq1 + i*numEq2 + j][0]; - -// printvector(std::cout, dest1, "dest1", "row", 200, 1, 3); -// printvector(std::cout, dest2, "dest2", "row", 200, 1, 3); - } - - /*! - * \brief Merge two solution vectors of the sub models into a - * global vector: more general case. - * - * \param vec1 Input vector with solution of subdomain 1 - * \param vec2 Input vector with solution of subdomain 2 - * \param dest Destination vector for global solution - * \param subDOFToCoupledDOF unused - * - */ - static void mergeSolVectors(const SolutionVector1 &vec1, - const SolutionVector2 &vec2, - SolutionVector &dest, - const std::vector& subDOFToCoupledDOF) - { - int nDofs1 = vec1.size(); - int nDofs2 = vec2.size(); -// printvector(std::cout, vec1, "vec1", "row", 200, 1, 3); -// printvector(std::cout, vec2, "vec2", "row", 200, 1, 3); - - for (int i = 0; i < nDofs1; ++i) - for (int j = 0; j < numEq1; j++) - dest.base()[i*numEq1 + j] = vec1[i][j]; - - for (int i = 0; i < nDofs2; ++i) - { - for (int j = numEq1; j < numEq2; j++) - dest.base()[nDofs1*numEq1 + i*(numEq2-numEq1) + (j - numEq1)] = vec2[i][j]; - } -// printvector(std::cout, dest.base(), "dest", "row", 200, 1, 3); - } - - /*! - * \brief Split a global solution vector into two solution vectors - * of the sub models: more general case. - * - * \param vec Input vector with global solution - * \param dest1 Destination vector with solution of subdomain 1 - * \param dest2 Destination vector with solution of subdomain 2 - * \param subDOFToCoupledDOF Identification vector between sub and global DOFs - * - */ - static void splitSolVector(const SolutionVector &vec, - SolutionVector1 &dest1, - SolutionVector2 &dest2, - const std::vector& subDOFToCoupledDOF) - { - int nDofs1 = dest1.size(); - int nDofs2 = dest2.size(); - -// printvector(std::cout, vec.base(), "vec", "row", 200, 1, 3); - for (int i = 0; i < nDofs1; ++i) - for (int j = 0; j < numEq1; j++) - dest1[i][j] = vec.base()[i*numEq1 + j]; - - for (int i = 0; i < nDofs2; ++i) - { - int blockIdxCoupled = subDOFToCoupledDOF[i]; - for (int j = 0; j < numEq1; j++) - { - dest2[i][j] = vec.base()[blockIdxCoupled*numEq1 + j]; - } - - for (int j = numEq1; j < numEq2; j++) - dest2[i][j] = vec.base()[nDofs1*numEq1 + i*(numEq2-numEq1) + (j - numEq1)]; - } -// printvector(std::cout, dest1, "dest1", "row", 200, 1, 3); -// printvector(std::cout, dest2, "dest2", "row", 200, 1, 3); - } - - - /*! - * \brief Merge individual jacobian matrices of the sub models - * into a global jacobian matrix. - * - * \param M1 Input jacobian matrix of subdomain 1 - * \param M2 Input jacobian matrix of subdomain 2 - * \param M Destination global jacobian matrix - * - */ - static void mergeMatrices(const JacobianMatrix1 &M1, - const JacobianMatrix2 &M2, - JacobianMatrix &M) - { - DUNE_THROW(Dune::NotImplemented, "mergeMatrices in coupled common"); - } - - /*! - * \brief Copy a sub matrix into into the main diagonal of the global matrix. - * - * \param Msub Sub matrix - * \param M Global matrix - * \param offset Offset in rows and columns - * - */ - template - static void copyMatrix(const SubMatrix &Msub, - JacobianMatrix &M, - size_t offset) - { - // loop over all rows of the submatrix - typedef typename SubMatrix::ConstRowIterator RowIterator; - typedef typename SubMatrix::ConstColIterator ColIterator; - RowIterator endRow = Msub.end(); - for (RowIterator row = Msub.begin(); row != endRow; ++row) { - // loop over columns of the current row - ColIterator endCol = row->end(); - for (ColIterator col = row->begin(); col != endCol; ++ col) { - // copy entry in the global matrix - M[row.index() + offset][col.index() + offset] - = *col; - } - } - } - -}; -} // namespace Dumux - -#endif // DUMUX_SPLIT_AND_MERGE_HH diff --git a/dumux/multidomain/subdomainproperties.hh b/dumux/multidomain/subdomainproperties.hh deleted file mode 100644 index 4af5c2a8faca706ee4c54595288f702b843a6ff1..0000000000000000000000000000000000000000 --- a/dumux/multidomain/subdomainproperties.hh +++ /dev/null @@ -1,66 +0,0 @@ -// -*- mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- -// vi: set et ts=4 sw=4 sts=4: -/***************************************************************************** - * See the file COPYING for full copying permissions. * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 2 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program. If not, see . * - *****************************************************************************/ -/*! - * \file - * \ingroup Properties - * \ingroup ImplicitProperties - * \ingroup MultidomainModel - * \brief Specify properties required for the subdomains of the coupled model - */ -#ifndef DUMUX_SUBDOMAIN_PROPERTIES_HH -#define DUMUX_SUBDOMAIN_PROPERTIES_HH - -#include - -namespace Dumux -{ -namespace Properties -{ - -////////////////////////////////////////////////////////////////// -// Type tags -////////////////////////////////////////////////////////////////// - -//! The type tag from which sub-problems of coupling models inherit -NEW_TYPE_TAG(SubDomain); - -////////////////////////////////////////////////////////////////// -// Property tags -////////////////////////////////////////////////////////////////// -//! Specifies the host grid -NEW_PROP_TAG(Grid); - -//! Specifies the scalar grid function space used for sub-problems -NEW_PROP_TAG(ScalarGridFunctionSpace); - -//! Specifies the grid function space used for sub-problems -NEW_PROP_TAG(GridFunctionSpace); - -//! Specifies the type of the constraints -NEW_PROP_TAG(Constraints); - -//! Specifies the local finite element space -NEW_PROP_TAG(LocalFEMSpace); - -//! Specifies the local operator -NEW_PROP_TAG(LocalOperator); - -} // namespace Properties -} // namespace Dumux -#endif // DUMUX_SUBDOMAIN_PROPERTIES_HH diff --git a/dumux/multidomain/subdomainpropertydefaults.hh b/dumux/multidomain/subdomainpropertydefaults.hh deleted file mode 100644 index 394fc044a82529178c3e43ed021fe4d4d16cd795..0000000000000000000000000000000000000000 --- a/dumux/multidomain/subdomainpropertydefaults.hh +++ /dev/null @@ -1,141 +0,0 @@ -// -*- mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- -// vi: set et ts=4 sw=4 sts=4: -/***************************************************************************** - * See the file COPYING for full copying permissions. * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 2 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program. If not, see . * - *****************************************************************************/ -/*! - * \file - * \ingroup Properties - * \ingroup ImplicitProperties - * \ingroup MultidomainModel - * \brief Specify default properties required in the subdomains of dune-multidomain - */ -#ifndef DUMUX_SUBDOMAIN_PROPERTY_DEFAULTS_HH -#define DUMUX_SUBDOMAIN_PROPERTY_DEFAULTS_HH - -#include -#include -#include -#include -#include - -#include "subdomainproperties.hh" -#include "properties.hh" -#include "localoperator.hh" -#include "boxcouplinglocalresidual.hh" - -namespace Dumux -{ - -namespace Properties -{ - -// Specifies the grid type for the subdomains -SET_PROP(SubDomain, Grid) -{ -private: - typedef typename GET_PROP_TYPE(TypeTag, MultiDomainTypeTag) MultiDomain; - typedef typename GET_PROP_TYPE(MultiDomain, Grid) HostGrid; - enum { maxSubDomains = GET_PROP_VALUE(MultiDomain, MaxSubDomains) }; - typedef typename Dune::mdgrid::FewSubDomainsTraits MDGridTraits; - typedef typename Dune::MultiDomainGrid Grid; -public: - typedef typename Grid::SubDomainGrid type; -}; - -// set the default BaseLocalResidual to BoxCouplingLocalResidual -SET_TYPE_PROP(SubDomain, BaseLocalResidual, BoxCouplingLocalResidual); - -// set the local operator used for submodels -SET_TYPE_PROP(SubDomain, LocalOperator, - PDELab::MultiDomainLocalOperator); - -// use the time manager for the coupled problem in the sub problems -SET_PROP(SubDomain, TimeManager) -{ -private: - typedef typename GET_PROP_TYPE(TypeTag, MultiDomainTypeTag) MultiDomainTypeTag; -public: - typedef typename GET_PROP_TYPE(MultiDomainTypeTag, TimeManager) type; -}; - -// set the constraints for the sub-models -SET_TYPE_PROP(SubDomain, Constraints, Dune::PDELab::NoConstraints); - -// set the grid functions space for the sub-models -SET_PROP(SubDomain, ScalarGridFunctionSpace) -{ -private: - typedef typename GET_PROP_TYPE(TypeTag, LocalFEMSpace) FEM; - typedef typename GET_PROP_TYPE(TypeTag, GridView) GridView; - typedef typename GET_PROP_TYPE(TypeTag, Constraints) Constraints; - enum{numEq = GET_PROP_VALUE(TypeTag, NumEq)}; -public: - typedef Dune::PDELab::GridFunctionSpace > type; -}; - -// set the grid functions space for the sub-models -SET_PROP(SubDomain, GridFunctionSpace) -{ -private: - typedef typename GET_PROP_TYPE(TypeTag, ScalarGridFunctionSpace) ScalarGridFunctionSpace; - enum{numEq = GET_PROP_VALUE(TypeTag, NumEq)}; - typedef typename Dune::PDELab::EntityBlockedOrderingTag OrderingTag; - typedef typename Dune::PDELab::ISTLVectorBackend<> VBE; -public: - typedef Dune::PDELab::PowerGridFunctionSpace type; -}; - -// use the local FEM space associated with cubes by default -SET_PROP(SubDomain, LocalFEMSpace) -{ -private: - typedef typename GET_PROP_TYPE(TypeTag, Scalar) Scalar; - typedef typename GET_PROP_TYPE(TypeTag, GridView) GridView; - enum{dim = GridView::dimension}; -public: - typedef Dune::PDELab::QkLocalFiniteElementMap type; -}; - -SET_PROP(SubDomain, ParameterTree) -{ -private: - typedef typename GET_PROP_TYPE(TypeTag, MultiDomainTypeTag) MultiDomainTypeTag; - typedef typename GET_PROP(MultiDomainTypeTag, ParameterTree) ParameterTree; -public: - typedef typename ParameterTree::type type; - - static type &tree() - { return ParameterTree::tree(); } - - static type &compileTimeParams() - { return ParameterTree::compileTimeParams(); } - - static type &runTimeParams() - { return ParameterTree::runTimeParams(); } - - static type &deprecatedRunTimeParams() - { return ParameterTree::deprecatedRunTimeParams(); } - - static type &unusedNewRunTimeParams() - { return ParameterTree::unusedNewRunTimeParams(); } -}; - -} // namespace Properties -} // namespace Dumux - -#endif // DUMUX_SUBDOMAIN_PROPERTY_DEFAULTS_HH diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index fd9350c01fa87ea13aa70fc72c2cc2438e62a926..25810628f4afa459e88ed327d6975529cd637588 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -1,9 +1,7 @@ add_subdirectory("common") add_subdirectory("freeflow") -add_subdirectory("geomechanics") add_subdirectory("io") add_subdirectory("material") add_subdirectory("mixeddimension") -add_subdirectory("multidomain") add_subdirectory("porousmediumflow") add_subdirectory("discretization") diff --git a/test/geomechanics/CMakeLists.txt b/test/geomechanics/CMakeLists.txt deleted file mode 100644 index 4b65e11703bf32f11f5226f3e7f424618ff2d475..0000000000000000000000000000000000000000 --- a/test/geomechanics/CMakeLists.txt +++ /dev/null @@ -1,3 +0,0 @@ -add_subdirectory("el1p2c") -add_subdirectory("el2p") -add_subdirectory("elastic") diff --git a/test/geomechanics/el1p2c/CMakeLists.txt b/test/geomechanics/el1p2c/CMakeLists.txt deleted file mode 100644 index f1c82c2294c04e492f24755ac99d5a6aa397c7a2..0000000000000000000000000000000000000000 --- a/test/geomechanics/el1p2c/CMakeLists.txt +++ /dev/null @@ -1,15 +0,0 @@ -add_input_file_links() - -add_dumux_test(test_el1p2c test_el1p2c test_el1p2c.cc - python ${CMAKE_SOURCE_DIR}/bin/testing/runtest.py - --script fuzzy - --files ${CMAKE_SOURCE_DIR}/test/references/el1p2c-reference.vtu - ${CMAKE_CURRENT_BINARY_DIR}/el1p2c-00014.vtu - --command "${CMAKE_CURRENT_BINARY_DIR}/test_el1p2c") - -#install sources -install(FILES -el1p2cproblem.hh -el1p2cspatialparams.hh -test_el1p2c.cc -DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/dumux/test/geomechanics/el1p2c) diff --git a/test/geomechanics/el1p2c/el1p2cproblem.hh b/test/geomechanics/el1p2c/el1p2cproblem.hh deleted file mode 100644 index cb7d81761ec017b6293cc72cef3a0c07f7bda01c..0000000000000000000000000000000000000000 --- a/test/geomechanics/el1p2c/el1p2cproblem.hh +++ /dev/null @@ -1,235 +0,0 @@ -// -*- mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- -// vi: set et ts=4 sw=4 sts=4: -/***************************************************************************** - * See the file COPYING for full copying permissions. * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 2 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program. If not, see . * - *****************************************************************************/ -/** - * \file - * \brief Definition of a problem, for the linear elastic 1p2c problem: - * Component transport of nitrogen dissolved in the water phase with a linear - * elastic solid matrix. - */ -#ifndef DUMUX_EL1P2CPROBLEM_HH -#define DUMUX_EL1P2CPROBLEM_HH - -#include -#include -#include - -#include -#include "el1p2cspatialparams.hh" -#include - -namespace Dumux -{ - template - class El1P2CProblem; - - namespace Properties - { - NEW_TYPE_TAG(El1P2CProblem, INHERITS_FROM(BoxElasticOnePTwoC)); - - // Set the grid type - SET_TYPE_PROP(El1P2CProblem, Grid, Dune::YaspGrid<3>); - - // Set the problem property - SET_TYPE_PROP(El1P2CProblem, Problem, El1P2CProblem); - - // Set fluid configuration - SET_PROP(El1P2CProblem, FluidSystem) - { private: - typedef typename GET_PROP_TYPE(TypeTag, Scalar) Scalar; - public: - typedef FluidSystems::H2ON2 type; - }; - - // Set the soil properties - SET_TYPE_PROP(El1P2CProblem, SpatialParams, El1P2CSpatialParams); - - //Define whether mole(true) or mass (false) fractions are used - SET_BOOL_PROP(El1P2CProblem, UseMoles, false); - - // Include stabilization term to prevent pressure oscillations - SET_BOOL_PROP(El1P2CProblem, ImplicitWithStabilization, true); - - // use the algebraic multigrid - SET_TYPE_PROP(El1P2CProblem, LinearSolver, AMGBackend ); -} - -/*! - * \ingroup ElOnePTwoCBoxProblems - * \brief Problem definition for a one-phase two-component transport process - * in an elastic deformable matrix. - * - * The 3D domain given in el1p2c.dgf spans from (0,0,0) to (10,10,10). - * - * Dirichlet boundary conditions (p=101300, X=0.0, u=0.0) are applied at all boundaries. - * In the center of the cube at the location (5,5,5) water with dissolved nitrogen is injected. - * The injection leads to a pressure build-up which results in solid displacement (ux, uy, uz [m]) - * and effective stress changes. - * - */ -template -class El1P2CProblem: public ImplicitPorousMediaProblem -{ - typedef ImplicitPorousMediaProblem ParentType; - typedef typename GET_PROP_TYPE(TypeTag, GridView) GridView; - typedef typename GET_PROP_TYPE(TypeTag, TimeManager) TimeManager; - - typedef typename GET_PROP_TYPE(TypeTag, Indices) Indices; - enum - { - // Grid and world dimension - dim = GridView::dimension, - dimWorld = GridView::dimensionworld, - }; - - enum { - // balance equation indices - transportEqIdx = Indices::transportEqIdx - }; - - typedef typename GET_PROP_TYPE(TypeTag, PrimaryVariables) PrimaryVariables; - typedef typename GET_PROP_TYPE(TypeTag, BoundaryTypes) BoundaryTypes; - - typedef typename GridView::template Codim<0>::Entity Element; - typedef typename GridView::template Codim::Entity Vertex; - typedef typename GridView::Intersection Intersection; - - typedef typename GET_PROP_TYPE(TypeTag, FVElementGeometry) FVElementGeometry; - - typedef typename GET_PROP_TYPE(TypeTag, Scalar) Scalar; - typedef Dune::FieldVector GlobalPosition; - - public: - El1P2CProblem(TimeManager &timeManager, const GridView &gridView) - : ParentType(timeManager, gridView) - {} - - /*! - * \brief The problem name. - * - * This is used as a prefix for files generated by the simulation. - */ - std::string name() const - { return "el1p2c";} - - /*! - * \brief Returns the temperature within the domain. - */ - Scalar temperature() const - { - return 273.15 + 10; // in K - }; - - /*! - * \name Boundary conditions - */ - // \{ - - /*! - * \brief Specifies which kind of boundary condition should be - * used for which equation on a given boundary segment. - * - * \param values The boundary types for the conservation equations - * \param vertex The vertex on the boundary for which the - * conditions needs to be specified - */ - void boundaryTypes(BoundaryTypes &values, const Vertex &vertex) const - { - values.setAllDirichlet(); - } - - /*! - * \brief Evaluate the boundary conditions for a dirichlet - * control volume. - * - * \param values The dirichlet values for the primary variables - * \param vertex The vertex representing the "half volume on the boundary" - * - * For this method, the \a values parameter stores primary variables. - */ - void dirichlet(PrimaryVariables &values, const Vertex &vertex) const - { - values = 0.0; - values[0] = 101300; - } - - /*! - * \brief Evaluate the boundary conditions for a neumann - * boundary segment. - * - * For this method, the \a values parameter stores the mass flux - * in normal direction of each phase. Negative values mean influx. - */ - void neumann(PrimaryVariables &values, - const Element &element, - const FVElementGeometry &fvGeometry, - const Intersection &intersection, - int scvIdx, - int boundaryFaceIdx) const - { - values = 0.0; - } - // \} - - /*! - * \name Volume terms - */ - // \{ - - /*! - * \brief Evaluate the source term for all phases within a given - * sub-control-volume. - * - * For this method, the \a values parameter stores the rate mass - * generated or annihilate per volume unit. Positive values mean - * that mass is created, negative ones mean that it vanishes. - */ - void sourceAtPos(PrimaryVariables &values, - const GlobalPosition &globalPos) const - { - values = Scalar(0.0); - - if(globalPos[0] < 6 + eps_ && globalPos[0] > 4 - eps_ - && globalPos[1] < 6 + eps_ && globalPos[1] > 4 - eps_ - && globalPos[2] < 6 + eps_ && globalPos[2] > 4 - eps_) - { - values[0] = 1.e-3; - values[1] = 1.e-4; - } - } - - /*! - * \brief Evaluate the initial value for a control volume. - * - * For this method, the \a values parameter stores primary - * variables. - */ - void initial(PrimaryVariables &values, - const Element &element, - const FVElementGeometry &fvGeometry, - int scvIdx) const - { - values = 0.0; - values[0] = 101300; - } - - static constexpr Scalar eps_ = 3e-6; -}; -} //end namespace - -#endif diff --git a/test/geomechanics/el1p2c/el1p2cspatialparams.hh b/test/geomechanics/el1p2c/el1p2cspatialparams.hh deleted file mode 100644 index ecfdf5bd69398510ce309ee3ceff5450771cca9d..0000000000000000000000000000000000000000 --- a/test/geomechanics/el1p2c/el1p2cspatialparams.hh +++ /dev/null @@ -1,216 +0,0 @@ -// -*- mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- -// vi: set et ts=4 sw=4 sts=4: -/***************************************************************************** - * See the file COPYING for full copying permissions. * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 2 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program. If not, see . * - *****************************************************************************/ -/*! - * \file - * - * \brief The spatial parameters for the El1P2CProblem which uses the - * linear elastic one-phase two-component model - */ -#ifndef DUMUX_ELONEPTWOCSPARAMETERS_HH -#define DUMUX_ELONEPTWOCSPARAMETERS_HH - -#include -#include -#include -#include - -namespace Dumux -{ - -//forward declaration -template -class El1P2CSpatialParams; - -namespace Properties -{ -// The spatial parameters TypeTag -NEW_TYPE_TAG(El1P2CSpatialParams); - -// Set the spatial parameters -SET_TYPE_PROP(El1P2CSpatialParams, SpatialParams, El1P2CSpatialParams); - -} - -/*! - * \ingroup ElOnePTwoCBoxModel - * \brief The spatial parameters for the El1P2CProblem which uses the - * linear elastic one-phase two-component model - */ -template -class El1P2CSpatialParams : public ImplicitSpatialParamsOneP -{ - typedef ImplicitSpatialParamsOneP ParentType; - typedef typename GET_PROP_TYPE(TypeTag, Grid) Grid; - typedef typename GET_PROP_TYPE(TypeTag, GridView) GridView; - typedef typename GET_PROP_TYPE(TypeTag, Scalar) Scalar; - typedef typename Grid::ctype CoordScalar; - enum { - dim=GridView::dimension, - dimWorld=GridView::dimensionworld, - }; - - typedef Dune::FieldVector GlobalPosition; - typedef Dune::FieldMatrix DimMatrix; - - typedef typename GET_PROP_TYPE(TypeTag, FVElementGeometry) FVElementGeometry; - typedef typename GridView::template Codim<0>::Entity Element; - -public: - - El1P2CSpatialParams(const GridView &gridView) - : ParentType(gridView) - { - // intrinsic permeabilities [m^2] - K_ = Scalar(0.0); - for (int i = 0; i < dim; i++){ - K_[i][i] = 1.E-12; //[m²] - } - - // porosities [-] - phi_ = 0.2; - - // rock density [kg/m^3] - solidDensity_ = 2650.0; - - // Young's modulus [Pa] - E_ = 6.e9; - // Poisson's ratio [-] - nu_ = 0.2; - // Lame parameters [Pa] - lambda_ = (E_ * nu_) / ((1 + nu_)*(1 - 2 * nu_)); - mu_ = E_ / (2 * (1 + nu_)); - } - - ~El1P2CSpatialParams() - {} - - /*! - * \brief Apply the intrinsic permeability tensor \f$[m^2]\f$ to a pressure - * potential gradient. - * - * \param element The current finite element - * \param fvGeometry The current finite volume geometry of the element - * \param scvIdx The local index of the sub-control volume where - * the porosity needs to be defined - */ - - const DimMatrix intrinsicPermeability(const Element &element, - const FVElementGeometry &fvGeometry, - int scvIdx) const - { - return K_; - } - - /*! - * \brief Define the porosity \f$[-]\f$ of the soil - * - * \param element The finite element - * \param fvGeometry The finite volume geometry - * \param scvIdx The local index of the sub-control volume where - * the porosity needs to be defined - */ - double porosity(const Element &element, - const FVElementGeometry &fvGeometry, - int scvIdx) const - { - return phi_; - } - - /*! - * \brief Define the porosity \f$[-]\f$ of the soil - * - * \param globalPos The global position of the vertex - */ - double porosity(const GlobalPosition& globalPos) const - { - return phi_; - } - - /*! - * \brief Define the density \f$[kg/m^3]\f$ of the rock - * - * \param element The finite element - * \param scvIdx The local index of the sub-control volume where - * the porosity needs to be defined - */ - const Scalar rockDensity(const Element &element, - int scvIdx) const - { - return solidDensity_; - } - - /*! - * \brief Define the density \f$[kg/m^3]\f$ of the rock - * - * \param globalPos The global position of the vertex - */ - const Scalar rockDensity(const GlobalPosition &globalPos) const - { - return solidDensity_; - } - - /*! - * \brief Define the Lame parameters \f$[Pa]\f$ linear elastic rock - * - * \param element The finite element - * \param fvGeometry The finite volume geometry - * \param scvIdx The local index of the sub-control volume where - * the porosity needs to be defined - */ - const Dune::FieldVector lameParams(const Element &element, - const FVElementGeometry &fvGeometry, - int scvIdx) const - { - Dune::FieldVector param; - - param[0] = lambda_; - param[1] = mu_; - - return param; - } - - /*! - * \brief Return dispersivity (not needed here - * - * \param element The finite element - * \param fvGeometry The finite volume geometry - * \param scvIdx The local index of the sub-control volume where - */ - Dune::FieldVector dispersivity(const Element &element, - const FVElementGeometry &fvGeometry, - int scvIdx) const - { - return Dune::FieldVector(0); - } - -private: - Dune::FieldMatrix K_; - Scalar layerBottom_; - Scalar solidDensity_; - Scalar phi_; - Scalar lambda_; - Scalar mu_; - Scalar E_; - Scalar nu_; - static constexpr Scalar eps_ = 3e-6; - int episode_; - -}; -} -#endif diff --git a/test/geomechanics/el1p2c/test_el1p2c.cc b/test/geomechanics/el1p2c/test_el1p2c.cc deleted file mode 100644 index 2956391bfcadcf2e29f5fa8e6b621313e5a13607..0000000000000000000000000000000000000000 --- a/test/geomechanics/el1p2c/test_el1p2c.cc +++ /dev/null @@ -1,73 +0,0 @@ -// -*- mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- -// vi: set et ts=4 sw=4 sts=4: -/***************************************************************************** - * See the file COPYING for full copying permissions. * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 2 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program. If not, see . * - *****************************************************************************/ -/*! - * \file - * - * \brief Test for the elasticity 1p2c model - */ -#include - -#include "el1p2cproblem.hh" -#include -#include - -/*! - * \brief Provides an interface for customizing error messages associated with - * reading in parameters. - * - * \param progName The name of the program, that was tried to be started. - * \param errorMsg The error message that was issued by the start function. - * Comprises the thing that went wrong and a general help message. - */ -void usage(const char *progName, const std::string &errorMsg) -{ - if (errorMsg.size() > 0) { - std::string errorMessageOut = "\nUsage: "; - errorMessageOut += progName; - errorMessageOut += " [options]\n"; - errorMessageOut += errorMsg; - errorMessageOut += "\n\nThe List of Mandatory arguments for this program is:\n" - "\t-tEnd The end of the simulation. [s] \n" - "\t-dtInitial The initial timestep size. [s] \n" - "\t-gridFile The file name of the file containing the grid \n" - "\t definition in DGF format\n" - "\t-FluidSystem.nTemperature Number of tabularization entries [-] \n" - "\t-FluidSystem.nPressure Number of tabularization entries [-] \n" - "\t-FluidSystem.pressureLow Low end for tabularization of fluid properties [Pa] \n" - "\t-FluidSystem.pressureHigh High end for tabularization of fluid properties [Pa] \n" - "\t-FluidSystem.temperatureLow Low end for tabularization of fluid properties [Pa] \n" - "\t-FluidSystem.temperatureHigh High end for tabularization of fluid properties [Pa] \n" - "\t-SimulationControl.name The name of the output files [-] \n" - "\t-InitialConditions.temperature Initial temperature in the reservoir [K] \n" - "\t-InitialConditions.depthBOR Depth below ground surface [m] \n"; - - std::cout << errorMessageOut - << "\n"; - } -} - -#include - -int main(int argc, char** argv) -{ - Dune::FMatrixPrecision<>::set_singular_limit(1e-22); - typedef TTAG(El1P2CProblem) ProblemTypeTag; - return Dumux::start(argc, argv, usage); -} - diff --git a/test/geomechanics/el1p2c/test_el1p2c.input b/test/geomechanics/el1p2c/test_el1p2c.input deleted file mode 100644 index 957c2c07c2c09750fde3a40dd28686477f2d8e76..0000000000000000000000000000000000000000 --- a/test/geomechanics/el1p2c/test_el1p2c.input +++ /dev/null @@ -1,10 +0,0 @@ -[TimeManager] -DtInitial = 10 # [s] -TEnd = 1e4 # [s] - -[Problem] -EnableGravity = 0 - -[Grid] -UpperRight = 10 10 10 -Cells = 4 4 4 diff --git a/test/geomechanics/el2p/CMakeLists.txt b/test/geomechanics/el2p/CMakeLists.txt deleted file mode 100644 index b25342849f6c580d40a9e9278adce6c5c4627cbd..0000000000000000000000000000000000000000 --- a/test/geomechanics/el2p/CMakeLists.txt +++ /dev/null @@ -1,25 +0,0 @@ -add_input_file_links() - -add_dumux_test(test_el2p test_el2p test_el2p.cc - python ${CMAKE_SOURCE_DIR}/bin/testing/runtest.py - --script fuzzy - --files ${CMAKE_SOURCE_DIR}/test/references/el2p-reference.vtu - ${CMAKE_CURRENT_BINARY_DIR}/el2p-00047.vtu - --command "${CMAKE_CURRENT_BINARY_DIR}/test_el2p") - -if(MPI_FOUND) - add_dumux_test(test_el2p_parallel test_el2p test_el2p.cc - python ${CMAKE_SOURCE_DIR}/bin/testing/runtest.py - --script fuzzy - --files ${CMAKE_SOURCE_DIR}/test/references/el2p-parallel-reference.vtu - ${CMAKE_CURRENT_BINARY_DIR}/s0004-p0001-el2p-00047.vtu - --command "${MPIEXEC} -np 4 ${CMAKE_CURRENT_BINARY_DIR}/test_el2p") -endif() - -#install sources -install(FILES -el2pco2tables.hh -el2pproblem.hh -el2pspatialparams.hh -test_el2p.cc -DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/dumux/test/geomechanics/el2p) diff --git a/test/geomechanics/el2p/co2values.inc b/test/geomechanics/el2p/co2values.inc deleted file mode 100644 index f2058b3bc644dd7492f9473917325e1263b71b0a..0000000000000000000000000000000000000000 --- a/test/geomechanics/el2p/co2values.inc +++ /dev/null @@ -1,10164 +0,0 @@ -/* Tables for CO2 fluid properties calculated according to Span and - * Wagner (1996). - * - * THIS AN AUTO-GENERATED FILE! DO NOT EDIT IT! - * - * Temperature range: 290.000 K to 340.000 K, using 50 sampling points - * Pressure range: 0.100 MPa to 100.000 MPa, using 495 sampling points - * - * Generated using: - * - * ./extractproperties 290 340 50 100000 100000000 495 - */ - - -struct TabulatedDensityTraits { - typedef double Scalar; - static const char *name; - static const int numTempSteps = 50; - static constexpr Scalar minTemp = 2.900000000000000e+02; - static constexpr Scalar maxTemp = 3.400000000000000e+02; - static const int numPressSteps = 495; - static constexpr Scalar minPress = 1.000000000000000e+05; - static constexpr Scalar maxPress = 1.000000000000000e+08; - static const Scalar vals[numTempSteps][numPressSteps]; -}; - -const char *TabulatedDensityTraits::name = "density"; - -const double TabulatedDensityTraits::vals[50][495] = -{ - { - 1.835234260814301e+00, 5.609578928931403e+00, 9.472491146796987e+00, 1.342952796406621e+01, 1.748683269778940e+01, - 2.165122343212360e+01, 2.593029935168559e+01, 3.033256948925443e+01, 3.486760994292403e+01, 3.954625763994803e+01, - 4.438085158128438e+01, 4.938553658619486e+01, 5.457665050999915e+01, 5.997322476067790e+01, 6.559764140166533e+01, - 7.147651112068229e+01, 7.764187002663628e+01, 8.413284906382685e+01, 9.099806589488004e+01, 9.829916177747781e+01, - 1.061162328373974e+02, 1.145565634586313e+02, 1.237695022715711e+02, 1.339737563439795e+02, 1.455127584898394e+02, - 1.589844988951826e+02, 8.057312521590094e+02, 8.108402128049386e+02, 8.155824061935749e+02, 8.200166853633398e+02, - 8.241879770295383e+02, 8.281315020569276e+02, 8.318754705301706e+02, 8.354428809226469e+02, 8.388527648456439e+02, - 8.421210739019541e+02, 8.452613273185401e+02, 8.482850949368766e+02, 8.512023640281901e+02, 8.540218223473987e+02, - 8.567510796471778e+02, 8.593968432199171e+02, 8.619650585842660e+02, 8.644610233910867e+02, 8.668894805040845e+02, - 8.692546947083739e+02, 8.715605164189047e+02, 8.738104349713153e+02, 8.760076234940765e+02, 8.781549769239836e+02, - 8.802551443967211e+02, 8.823105569917930e+02, 8.843234516164474e+02, 8.862958916618035e+02, 8.882297849456814e+02, - 8.901268993627195e+02, 8.919888765878076e+02, 8.938172441189511e+02, 8.956134258975181e+02, 8.973787517046907e+02, - 8.991144655010476e+02, 9.008217328500687e+02, 9.025016475448055e+02, 9.041552375390970e+02, 9.057834702699156e+02, - 9.073872574449897e+02, 9.089674593594800e+02, 9.105248887967268e+02, 9.120603145606618e+02, 9.135744646812399e+02, - 9.150680293288482e+02, 9.165416634691372e+02, 9.179959892857696e+02, 9.194315983952163e+02, 9.208490538748830e+02, - 9.222488921232612e+02, 9.236316245687019e+02, 9.249977392414849e+02, 9.263477022222110e+02, 9.276819589781255e+02, - 9.290009355977048e+02, 9.303050399327539e+02, 9.315946626562807e+02, 9.328701782435495e+02, 9.341319458829880e+02, - 9.353803103229271e+02, 9.366156026595763e+02, 9.378381410711038e+02, 9.390482315022309e+02, 9.402461683033238e+02, - 9.414322348276013e+02, 9.426067039897403e+02, 9.437698387888621e+02, 9.449218927986193e+02, 9.460631106268573e+02, - 9.471937283471134e+02, 9.483139739040206e+02, 9.494240674944979e+02, 9.505242219264712e+02, 9.516146429567032e+02, - 9.526955296091892e+02, 9.537670744754651e+02, 9.548294639980591e+02, 9.558828787382071e+02, 9.569274936289067e+02, - 9.579634782142432e+02, 9.589909968759001e+02, 9.600102090476771e+02, 9.610212694187628e+02, 9.620243281264900e+02, - 9.630195309392095e+02, 9.640070194299014e+02, 9.649869311410847e+02, 9.659593997415453e+02, 9.669245551758751e+02, - 9.678825238082917e+02, 9.688334285562275e+02, 9.697773890182036e+02, 9.707145215962921e+02, 9.716449395112028e+02, - 9.725687533307679e+02, 9.734860704338224e+02, 9.743969950250054e+02, 9.753016300145251e+02, 9.762000745312771e+02, - 9.770924255831059e+02, 9.779787777799568e+02, 9.788592234149448e+02, 9.797338525419511e+02, 9.806027530499352e+02, - 9.814660107341271e+02, 9.823237093642530e+02, 9.831759307499564e+02, 9.840227548035316e+02, 9.848642596001345e+02, - 9.857005214355536e+02, 9.865316148816996e+02, 9.873576128398920e+02, 9.881785866078823e+02, 9.889946058643169e+02, - 9.898057388155626e+02, 9.906120521731956e+02, 9.914136112152587e+02, 9.922104798284086e+02, 9.930027205484934e+02, - 9.937903945996338e+02, 9.945735619318676e+02, 9.953522812574258e+02, 9.961266100857022e+02, 9.968966047569700e+02, - 9.976623204748978e+02, 9.984238113379236e+02, 9.991811303695266e+02, 9.999343295474530e+02, 1.000683459831928e+03, - 1.001428571192907e+03, 1.002169712636404e+03, 1.002906932229925e+03, 1.003640277127055e+03, 1.004369793591230e+03, - 1.005095527018721e+03, 1.005817521960866e+03, 1.006535822145580e+03, 1.007250470498175e+03, 1.007961509161501e+03, - 1.008668979515456e+03, 1.009372922195876e+03, 1.010073377112828e+03, 1.010770383440929e+03, 1.011463979747993e+03, - 1.012154203841599e+03, 1.012841092900622e+03, 1.013524683461510e+03, 1.014205011433457e+03, 1.014882112113123e+03, - 1.015556020198922e+03, 1.016226769804883e+03, 1.016894394474094e+03, 1.017558927191776e+03, 1.018220400397956e+03, - 1.018878845999779e+03, 1.019534295383483e+03, 1.020186779426009e+03, 1.020836328506299e+03, 1.021482972516269e+03, - 1.022126740871482e+03, 1.022767662521513e+03, 1.023405765960037e+03, 1.024041079234638e+03, 1.024673629956348e+03, - 1.025303445308931e+03, 1.025930552057907e+03, 1.026554976559352e+03, 1.027176744768441e+03, 1.027795882247785e+03, - 1.028412414175532e+03, 1.029026365353268e+03, 1.029637760213705e+03, 1.030246622828171e+03, 1.030852976913905e+03, - 1.031456845841177e+03, 1.032058252640206e+03, 1.032657220007922e+03, 1.033253770314546e+03, 1.033847925610010e+03, - 1.034439707630215e+03, 1.035029137803135e+03, 1.035616237254769e+03, 1.036201026814950e+03, 1.036783527023010e+03, - 1.037363758133303e+03, 1.037941740120608e+03, 1.038517492685385e+03, 1.039091035258922e+03, 1.039662387008345e+03, - 1.040231566841521e+03, 1.040798593411839e+03, 1.041363485122881e+03, 1.041926260132986e+03, 1.042486936359705e+03, - 1.043045531484157e+03, 1.043602062955278e+03, 1.044156547993985e+03, 1.044709003597234e+03, 1.045259446541990e+03, - 1.045807893389116e+03, 1.046354360487154e+03, 1.046898863976050e+03, 1.047441419790771e+03, 1.047982043137158e+03, - 1.048520750590008e+03, 1.049057556978554e+03, 1.049592477452577e+03, 1.050125526973861e+03, 1.050656720319375e+03, - 1.051186072084385e+03, 1.051713596685494e+03, 1.052239308363624e+03, 1.052763221186932e+03, 1.053285349053663e+03, - 1.053805705694950e+03, 1.054324304677543e+03, 1.054841159406498e+03, 1.055356283127795e+03, 1.055869688930911e+03, - 1.056381389751341e+03, 1.056891398373054e+03, 1.057399727459368e+03, 1.057906389440393e+03, 1.058411396689484e+03, - 1.058914761408222e+03, 1.059416495658273e+03, 1.059916611363579e+03, 1.060415120312487e+03, 1.060912034159859e+03, - 1.061407364429125e+03, 1.061901122514297e+03, 1.062393319681952e+03, 1.062883967073170e+03, 1.063373075705431e+03, - 1.063860656474490e+03, 1.064346720156203e+03, 1.064831277408315e+03, 1.065314338772233e+03, 1.065795914674746e+03, - 1.066276015429723e+03, 1.066754651239773e+03, 1.067231832197886e+03, 1.067707568289025e+03, 1.068181869391702e+03, - 1.068654745279526e+03, 1.069126205622712e+03, 1.069596259989572e+03, 1.070064917847971e+03, 1.070532188566768e+03, - 1.070998081417217e+03, 1.071462605574353e+03, 1.071925770118348e+03, 1.072387584035845e+03, 1.072848056221268e+03, - 1.073307195478111e+03, 1.073765010520194e+03, 1.074221509972912e+03, 1.074676702374453e+03, 1.075130596176995e+03, - 1.075583199747882e+03, 1.076034521370788e+03, 1.076484569246844e+03, 1.076933351495765e+03, 1.077380876156941e+03, - 1.077827151190523e+03, 1.078272184478479e+03, 1.078715983825642e+03, 1.079158556960731e+03, 1.079599911537362e+03, - 1.080040055135042e+03, 1.080478995260137e+03, 1.080916739346836e+03, 1.081353294758092e+03, 1.081788668786553e+03, - 1.082222868655466e+03, 1.082655901519581e+03, 1.083087774466031e+03, 1.083518494515197e+03, 1.083948068621567e+03, - 1.084376503674573e+03, 1.084803806499416e+03, 1.085229983857882e+03, 1.085655042449142e+03, 1.086078988910534e+03, - 1.086501829818350e+03, 1.086923571688581e+03, 1.087344220977684e+03, 1.087763784083311e+03, 1.088182267345038e+03, - 1.088599677045082e+03, 1.089016019409006e+03, 1.089431300606409e+03, 1.089845526751614e+03, 1.090258703904333e+03, - 1.090670838070339e+03, 1.091081935202107e+03, 1.091492001199465e+03, 1.091901041910219e+03, 1.092309063130781e+03, - 1.092716070606776e+03, 1.093122070033652e+03, 1.093527067057272e+03, 1.093931067274498e+03, 1.094334076233770e+03, - 1.094736099435675e+03, 1.095137142333506e+03, 1.095537210333812e+03, 1.095936308796946e+03, 1.096334443037596e+03, - 1.096731618325315e+03, 1.097127839885041e+03, 1.097523112897609e+03, 1.097917442500254e+03, 1.098310833787116e+03, - 1.098703291809717e+03, 1.099094821577461e+03, 1.099485428058096e+03, 1.099875116178193e+03, 1.100263890823604e+03, - 1.100651756839920e+03, 1.101038719032923e+03, 1.101424782169025e+03, 1.101809950975711e+03, 1.102194230141964e+03, - 1.102577624318695e+03, 1.102960138119160e+03, 1.103341776119374e+03, 1.103722542858518e+03, 1.104102442839342e+03, - 1.104481480528560e+03, 1.104859660357244e+03, 1.105236986721204e+03, 1.105613463981376e+03, 1.105989096464190e+03, - 1.106363888461944e+03, 1.106737844233169e+03, 1.107110968002986e+03, 1.107483263963467e+03, 1.107854736273980e+03, - 1.108225389061534e+03, 1.108595226421131e+03, 1.108964252416087e+03, 1.109332471078374e+03, 1.109699886408947e+03, - 1.110066502378065e+03, 1.110432322925610e+03, 1.110797351961406e+03, 1.111161593365523e+03, 1.111525050988592e+03, - 1.111887728652099e+03, 1.112249630148693e+03, 1.112610759242472e+03, 1.112971119669282e+03, 1.113330715136997e+03, - 1.113689549325811e+03, 1.114047625888510e+03, 1.114404948450754e+03, 1.114761520611348e+03, 1.115117345942512e+03, - 1.115472427990145e+03, 1.115826770274090e+03, 1.116180376288396e+03, 1.116533249501566e+03, 1.116885393356818e+03, - 1.117236811272331e+03, 1.117587506641493e+03, 1.117937482833142e+03, 1.118286743191812e+03, 1.118635291037963e+03, - 1.118983129668223e+03, 1.119330262355614e+03, 1.119676692349785e+03, 1.120022422877237e+03, 1.120367457141543e+03, - 1.120711798323576e+03, 1.121055449581718e+03, 1.121398414052082e+03, 1.121740694848723e+03, 1.122082295063846e+03, - 1.122423217768017e+03, 1.122763466010363e+03, 1.123103042818781e+03, 1.123441951200136e+03, 1.123780194140454e+03, - 1.124117774605124e+03, 1.124454695539091e+03, 1.124790959867040e+03, 1.125126570493593e+03, 1.125461530303489e+03, - 1.125795842161774e+03, 1.126129508913976e+03, 1.126462533386294e+03, 1.126794918385767e+03, 1.127126666700456e+03, - 1.127457781099614e+03, 1.127788264333858e+03, 1.128118119135344e+03, 1.128447348217929e+03, 1.128775954277337e+03, - 1.129103939991326e+03, 1.129431308019851e+03, 1.129758061005218e+03, 1.130084201572249e+03, 1.130409732328438e+03, - 1.130734655864100e+03, 1.131058974752531e+03, 1.131382691550157e+03, 1.131705808796683e+03, 1.132028329015240e+03, - 1.132350254712535e+03, 1.132671588378992e+03, 1.132992332488898e+03, 1.133312489500543e+03, 1.133632061856361e+03, - 1.133951051983064e+03, 1.134269462291790e+03, 1.134587295178222e+03, 1.134904553022739e+03, 1.135221238190536e+03, - 1.135537353031761e+03, 1.135852899881643e+03, 1.136167881060620e+03, 1.136482298874466e+03, 1.136796155614417e+03, - 1.137109453557293e+03, 1.137422194965625e+03, 1.137734382087772e+03, 1.138046017158041e+03, 1.138357102396813e+03, - 1.138667640010648e+03, 1.138977632192414e+03, 1.139287081121394e+03, 1.139595988963404e+03, 1.139904357870902e+03, - 1.140212189983104e+03, 1.140519487426089e+03, 1.140826252312911e+03, 1.141132486743711e+03, 1.141438192805815e+03, - 1.141743372573847e+03, 1.142048028109829e+03, 1.142352161463289e+03, 1.142655774671360e+03, 1.142958869758882e+03, - 1.143261448738503e+03, 1.143563513610779e+03, 1.143865066364272e+03, 1.144166108975644e+03, 1.144466643409758e+03, - 1.144766671619773e+03, 1.145066195547235e+03, 1.145365217122171e+03, 1.145663738263186e+03, 1.145961760877547e+03, - 1.146259286861280e+03, 1.146556318099259e+03, 1.146852856465289e+03, 1.147148903822202e+03, 1.147444462021937e+03, - 1.147739532905633e+03, 1.148034118303705e+03, 1.148328220035938e+03, 1.148621839911566e+03, 1.148914979729352e+03, - 1.149207641277677e+03, 1.149499826334615e+03, 1.149791536668017e+03, 1.150082774035588e+03, 1.150373540184966e+03 - }, - { - 1.828683380589245e+00, 5.588805124582649e+00, 9.436062746888222e+00, 1.337584058482143e+01, 1.741408146288414e+01, - 2.155736944343814e+01, 2.581302892163222e+01, 3.018924417436374e+01, 3.469520476638449e+01, 3.934128397857346e+01, - 4.413925989468186e+01, 4.910259228876201e+01, 5.424677351983967e+01, 5.958977909685171e+01, 6.515265479137040e+01, - 7.096029444824089e+01, 7.704248997003444e+01, 8.343537951693025e+01, 9.018349522565444e+01, 9.734274409572528e+01, - 1.049848997462957e+02, 1.132046588750517e+02, 1.221313122189737e+02, 1.319493489220186e+02, 1.429380971782167e+02, - 1.555576640070411e+02, 1.706721561780433e+02, 7.982211437667146e+02, 8.036438048727314e+02, 8.086535569475895e+02, - 8.133200547632711e+02, 8.176956993446213e+02, 8.218210929542049e+02, 8.257284441471988e+02, 8.294437995817869e+02, - 8.329885648578564e+02, 8.363805743305986e+02, 8.396348638657445e+02, 8.427642417168597e+02, 8.457797185110439e+02, - 8.486908366287638e+02, 8.515059262973132e+02, 8.542323073531167e+02, 8.568764500922304e+02, 8.594441048807103e+02, - 8.619404076079566e+02, 8.643699662457168e+02, 8.667369324744245e+02, 8.690450613947987e+02, 8.712977616491039e+02, - 8.734981377602197e+02, 8.756490261082964e+02, 8.777530256693814e+02, 8.798125244136257e+02, 8.818297220849778e+02, - 8.838066499470493e+02, 8.857451879717354e+02, 8.876470798615376e+02, 8.895139462280063e+02, 8.913472961937961e+02, - 8.931485376412846e+02, 8.949189862945489e+02, 8.966598737918844e+02, 8.983723548817457e+02, 9.000575138548760e+02, - 9.017163703087317e+02, 9.033498843263775e+02, 9.049589611404177e+02, 9.065444553427326e+02, 9.081071746925238e+02, - 9.096478835681896e+02, 9.111673061026088e+02, 9.126661290363498e+02, 9.141450043189527e+02, 9.156045514847636e+02, - 9.170453598265432e+02, 9.184679903873466e+02, 9.198729777887499e+02, 9.212608319114429e+02, 9.226320394423759e+02, - 9.239870653010923e+02, 9.253263539564844e+02, 9.266503306440147e+02, 9.279594024923617e+02, 9.292539595675349e+02, - 9.305343758416815e+02, 9.318010100930358e+02, 9.330542067428925e+02, 9.342942966348338e+02, 9.355215977609818e+02, - 9.367364159395744e+02, 9.379390454477641e+02, 9.391297696131770e+02, 9.403088613674381e+02, 9.414765837645930e+02, - 9.426331904670923e+02, 9.437789262017454e+02, 9.449140271878952e+02, 9.460387215398126e+02, 9.471532296451804e+02, - 9.482577645213682e+02, 9.493525321510550e+02, 9.504377317986327e+02, 9.515135563087163e+02, 9.525801923879604e+02, - 9.536378208713191e+02, 9.546866169737561e+02, 9.557267505283824e+02, 9.567583862118763e+02, 9.577816837580202e+02, - 9.587967981600881e+02, 9.598038798628020e+02, 9.608030749444827e+02, 9.617945252900059e+02, 9.627783687551300e+02, - 9.637547393237618e+02, 9.647237672579325e+02, 9.656855792374154e+02, 9.666402984940181e+02, 9.675880449397524e+02, - 9.685289352897444e+02, 9.694630830744395e+02, 9.703905987635075e+02, 9.713115906781729e+02, 9.722261635788810e+02, - 9.731344198297264e+02, 9.740364592211804e+02, 9.749323790585327e+02, 9.758222742464957e+02, 9.767062373701616e+02, - 9.775843587725145e+02, 9.784567266286588e+02, 9.793234270169488e+02, 9.801845439871618e+02, 9.810401596258631e+02, - 9.818903541191155e+02, 9.827352058126463e+02, 9.835747912696086e+02, 9.844091853260452e+02, 9.852384611441706e+02, - 9.860626902789561e+02, 9.868819426643638e+02, 9.876962867574506e+02, 9.885057895177333e+02, 9.893105164679736e+02, - 9.901105317363449e+02, 9.909058980970281e+02, 9.916966770093081e+02, 9.924829286552440e+02, 9.932647119759732e+02, - 9.940420847067021e+02, 9.948151034104534e+02, 9.955838235106127e+02, 9.963482993223303e+02, 9.971085840828285e+02, - 9.978647299806561e+02, 9.986167881839376e+02, 9.993648088676575e+02, 1.000108841240021e+03, 1.000848933567926e+03, - 1.001585133201588e+03, 1.002317486598337e+03, 1.003046039345652e+03, 1.003770836183419e+03, 1.004491921025482e+03, - 1.005209336980497e+03, 1.005923126372111e+03, 1.006633330758504e+03, 1.007339990924650e+03, 1.008043147009128e+03, - 1.008742838356337e+03, 1.009439103646048e+03, 1.010131980881481e+03, 1.010821507405475e+03, 1.011507719916182e+03, - 1.012190654482266e+03, 1.012870346557666e+03, 1.013546830995912e+03, 1.014220142064016e+03, 1.014890313455962e+03, - 1.015557378305799e+03, 1.016221369200345e+03, 1.016882318191552e+03, 1.017540256808481e+03, 1.018195216068968e+03, - 1.018847226490939e+03, 1.019496318103420e+03, 1.020142520457233e+03, 1.020785862635394e+03, 1.021426373263233e+03, - 1.022064080518223e+03, 1.022699012139554e+03, 1.023331195437440e+03, 1.023960657302175e+03, 1.024587424212950e+03, - 1.025211522246435e+03, 1.025832977085130e+03, 1.026451814025501e+03, 1.027068057985897e+03, 1.027681733514267e+03, - 1.028292864795675e+03, 1.028901475659622e+03, 1.029507589587175e+03, 1.030111229717925e+03, 1.030712418856764e+03, - 1.031311179480482e+03, 1.031907533744219e+03, 1.032501503487737e+03, 1.033093110241550e+03, 1.033682375232891e+03, - 1.034269319391548e+03, 1.034853963355539e+03, 1.035436327476670e+03, 1.036016431825942e+03, 1.036594296198835e+03, - 1.037169940120468e+03, 1.037743382850635e+03, 1.038314643388717e+03, 1.038883740478488e+03, 1.039450692612798e+03, - 1.040015518038160e+03, 1.040578234759212e+03, 1.041138860543101e+03, 1.041697412923742e+03, 1.042253909205999e+03, - 1.042808366469755e+03, 1.043360801573908e+03, 1.043911231160257e+03, 1.044459671140823e+03, 1.045006138751312e+03, - 1.045550649504227e+03, 1.046093219210257e+03, 1.046633863481215e+03, 1.047172597733454e+03, 1.047709437191195e+03, - 1.048244396889792e+03, 1.048777491678921e+03, 1.049308736225706e+03, 1.049838145017773e+03, 1.050365732366243e+03, - 1.050891512408660e+03, 1.051415499111858e+03, 1.051937706274765e+03, 1.052458147558803e+03, 1.052976836378867e+03, - 1.053493786075259e+03, 1.054009009802215e+03, 1.054522520559250e+03, 1.055034331193641e+03, 1.055544454402848e+03, - 1.056052902736899e+03, 1.056559688600712e+03, 1.057064824256386e+03, 1.057568321825430e+03, 1.058070193290966e+03, - 1.058570450499871e+03, 1.059069105164894e+03, 1.059566168866707e+03, 1.060061653055947e+03, 1.060555569055196e+03, - 1.061047928060926e+03, 1.061538741145414e+03, 1.062028019258618e+03, 1.062515773230008e+03, 1.063002013770373e+03, - 1.063486751473593e+03, 1.063969996818370e+03, 1.064451760169931e+03, 1.064932051781703e+03, 1.065410881796951e+03, - 1.065888260250382e+03, 1.066364197069735e+03, 1.066838702077322e+03, 1.067311784991557e+03, 1.067783455428442e+03, - 1.068253722903046e+03, 1.068722596830932e+03, 1.069190086529582e+03, 1.069656201219779e+03, 1.070120950026975e+03, - 1.070584341982629e+03, 1.071046386025523e+03, 1.071507091003053e+03, 1.071966465672503e+03, 1.072424518702286e+03, - 1.072881258673175e+03, 1.073336694079504e+03, 1.073790833330351e+03, 1.074243684750704e+03, 1.074695256582598e+03, - 1.075145556986243e+03, 1.075594594041125e+03, 1.076042375747089e+03, 1.076488910025412e+03, 1.076934204719843e+03, - 1.077378267597638e+03, 1.077821106350576e+03, 1.078262728595946e+03, 1.078703141877538e+03, 1.079142353666598e+03, - 1.079580371362778e+03, 1.080017202295067e+03, 1.080452853722710e+03, 1.080887332836107e+03, 1.081320646757696e+03, - 1.081752802542834e+03, 1.082183807180647e+03, 1.082613667594876e+03, 1.083042390644710e+03, 1.083469983125600e+03, - 1.083896451770067e+03, 1.084321803248484e+03, 1.084746044169869e+03, 1.085169181082637e+03, 1.085591220475363e+03, - 1.086012168777522e+03, 1.086432032360218e+03, 1.086850817536905e+03, 1.087268530564092e+03, 1.087685177642048e+03, - 1.088100764915476e+03, 1.088515298474199e+03, 1.088928784353821e+03, 1.089341228536380e+03, 1.089752636950998e+03, - 1.090163015474512e+03, 1.090572369932099e+03, 1.090980706097900e+03, 1.091388029695614e+03, 1.091794346399107e+03, - 1.092199661832995e+03, 1.092603981573223e+03, 1.093007311147641e+03, 1.093409656036562e+03, 1.093811021673319e+03, - 1.094211413444814e+03, 1.094610836692048e+03, 1.095009296710658e+03, 1.095406798751442e+03, 1.095803348020864e+03, - 1.096198949681570e+03, 1.096593608852887e+03, 1.096987330611313e+03, 1.097380119991005e+03, 1.097771981984258e+03, - 1.098162921541974e+03, 1.098552943574133e+03, 1.098942052950247e+03, 1.099330254499813e+03, 1.099717553012760e+03, - 1.100103953239888e+03, 1.100489459893302e+03, 1.100874077646836e+03, 1.101257811136481e+03, 1.101640664960793e+03, - 1.102022643681308e+03, 1.102403751822944e+03, 1.102783993874398e+03, 1.103163374288543e+03, 1.103541897482813e+03, - 1.103919567839582e+03, 1.104296389706549e+03, 1.104672367397103e+03, 1.105047505190694e+03, 1.105421807333193e+03, - 1.105795278037247e+03, 1.106167921482637e+03, 1.106539741816622e+03, 1.106910743154280e+03, 1.107280929578851e+03, - 1.107650305142067e+03, 1.108018873864484e+03, 1.108386639735803e+03, 1.108753606715198e+03, 1.109119778731627e+03, - 1.109485159684143e+03, 1.109849753442208e+03, 1.110213563845994e+03, 1.110576594706682e+03, 1.110938849806763e+03, - 1.111300332900325e+03, 1.111661047713349e+03, 1.112020997943985e+03, 1.112380187262841e+03, 1.112738619313261e+03, - 1.113096297711591e+03, 1.113453226047460e+03, 1.113809407884042e+03, 1.114164846758322e+03, 1.114519546181354e+03, - 1.114873509638523e+03, 1.115226740589795e+03, 1.115579242469970e+03, 1.115931018688930e+03, 1.116282072631883e+03, - 1.116632407659606e+03, 1.116982027108683e+03, 1.117330934291740e+03, 1.117679132497680e+03, 1.118026624991913e+03, - 1.118373415016580e+03, 1.118719505790781e+03, 1.119064900510795e+03, 1.119409602350301e+03, 1.119753614460592e+03, - 1.120096939970790e+03, 1.120439581988057e+03, 1.120781543597804e+03, 1.121122827863898e+03, 1.121463437828862e+03, - 1.121803376514082e+03, 1.122142646919999e+03, 1.122481252026314e+03, 1.122819194792175e+03, 1.123156478156370e+03, - 1.123493105037520e+03, 1.123829078334265e+03, 1.124164400925448e+03, 1.124499075670296e+03, 1.124833105408608e+03, - 1.125166492960927e+03, 1.125499241128718e+03, 1.125831352694548e+03, 1.126162830422249e+03, 1.126493677057098e+03, - 1.126823895325979e+03, 1.127153487937555e+03, 1.127482457582429e+03, 1.127810806933309e+03, 1.128138538645167e+03, - 1.128465655355401e+03, 1.128792159683993e+03, 1.129118054233657e+03, 1.129443341590007e+03, 1.129768024321693e+03, - 1.130092104980567e+03, 1.130415586101818e+03, 1.130738470204128e+03, 1.131060759789817e+03, 1.131382457344983e+03, - 1.131703565339644e+03, 1.132024086227886e+03, 1.132344022447992e+03, 1.132663376422588e+03, 1.132982150558776e+03, - 1.133300347248264e+03, 1.133617968867510e+03, 1.133935017777843e+03, 1.134251496325597e+03, 1.134567406842244e+03, - 1.134882751644515e+03, 1.135197533034530e+03, 1.135511753299921e+03, 1.135825414713956e+03, 1.136138519535663e+03, - 1.136451070009945e+03, 1.136763068367706e+03, 1.137074516825966e+03, 1.137385417587977e+03, 1.137695772843342e+03, - 1.138005584768124e+03, 1.138314855524967e+03, 1.138623587263201e+03, 1.138931782118954e+03, 1.139239442215267e+03, - 1.139546569662197e+03, 1.139853166556923e+03, 1.140159234983861e+03, 1.140464777014760e+03, 1.140769794708809e+03, - 1.141074290112744e+03, 1.141378265260944e+03, 1.141681722175534e+03, 1.141984662866488e+03, 1.142287089331724e+03, - 1.142589003557200e+03, 1.142890407517019e+03, 1.143191303173516e+03, 1.143491692477356e+03, 1.143791577367631e+03, - 1.144090959771948e+03, 1.144389841606525e+03, 1.144688224776278e+03, 1.144986111174916e+03, 1.145283502685024e+03, - 1.145580401178159e+03, 1.145876808514930e+03, 1.146172726545092e+03, 1.146468157107622e+03, 1.146763102030815e+03, - 1.147057563132359e+03, 1.147351542219423e+03, 1.147645041088738e+03, 1.147938061526678e+03, 1.148230605309343e+03 - }, - { - 1.822180000150033e+00, 5.568193484734743e+00, 9.399940228377346e+00, 1.332263784880051e+01, 1.734203609089832e+01, - 2.146449422213165e+01, 2.569707341230139e+01, 3.004764778659233e+01, 3.452503897594713e+01, 3.913918052511753e+01, - 4.390132065851967e+01, 4.882427491610381e+01, 5.392274448532730e+01, 5.921372234671126e+01, 6.471701871279591e+01, - 7.045595148932507e+01, 7.645826972783080e+01, 8.275741375663115e+01, 8.939427493666689e+01, 9.641972006091009e+01, - 1.038983291003199e+02, 1.119141429750094e+02, 1.205799201082087e+02, 1.300529287014809e+02, 1.405639705789797e+02, - 1.524763489081062e+02, 1.664242749856375e+02, 1.837226547736785e+02, 7.905659783148591e+02, 7.963288571571167e+02, - 8.016258669287345e+02, 8.065397207595992e+02, 8.111316653328546e+02, 8.154485634297506e+02, 8.195272099794033e+02, - 8.233971067983342e+02, 8.270823234756804e+02, 8.306027889411638e+02, 8.339752137707483e+02, 8.372137648285055e+02, - 8.403305690296386e+02, 8.433360963041742e+02, 8.462394553428804e+02, 8.490486251939167e+02, 8.517706388963175e+02, - 8.544117307225669e+02, 8.569774554438615e+02, 8.594727858281274e+02, 8.619021930174866e+02, 8.642697133055311e+02, - 8.665790040119618e+02, 8.688333905433052e+02, 8.710359062727002e+02, 8.731893265268053e+02, 8.752961977043000e+02, - 8.773588623470667e+02, 8.793794808268979e+02, 8.813600501864229e+02, 8.833024205748435e+02, 8.852083096409599e+02, - 8.870793151833581e+02, 8.889169263071950e+02, 8.907225332960429e+02, 8.924974363738697e+02, 8.942428535048541e+02, - 8.959599273561372e+02, 8.976497315299321e+02, 8.993132761558574e+02, 9.009515129213602e+02, 9.025653396071898e+02, - 9.041556041857089e+02, 9.057231085320379e+02, 9.072686117914826e+02, 9.087928334410300e+02, 9.102964560779484e+02, - 9.117801279643953e+02, 9.132444653534169e+02, 9.146900546186628e+02, 9.161174542075300e+02, 9.175271964351513e+02, - 9.189197891346581e+02, 9.202957171774349e+02, 9.216554438755559e+02, 9.229994122772811e+02, 9.243280463653335e+02, - 9.256417521666436e+02, 9.269409187813638e+02, 9.282259193381593e+02, 9.294971118820656e+02, 9.307548402006024e+02, - 9.319994345932573e+02, 9.332312125889853e+02, 9.344504796159013e+02, 9.356575296269842e+02, 9.368526456852385e+02, - 9.380361005114461e+02, 9.392081569973757e+02, 9.403690686870501e+02, 9.415190802284447e+02, 9.426584277977963e+02, - 9.437873394985048e+02, 9.449060357364435e+02, 9.460147295733635e+02, 9.471136270599005e+02, 9.482029275496139e+02, - 9.492828239953361e+02, 9.503535032290391e+02, 9.514151462263005e+02, 9.524679283564069e+02, 9.535120196190041e+02, - 9.545475848681814e+02, 9.555747840247809e+02, 9.565937722776719e+02, 9.576047002746902e+02, 9.586077143038608e+02, - 9.596029564655915e+02, 9.605905648379299e+02, 9.615706736323517e+02, 9.625434133401455e+02, 9.635089108730801e+02, - 9.644672896974436e+02, 9.654186699617206e+02, 9.663631685089803e+02, 9.673008989836154e+02, 9.682319728881375e+02, - 9.691564979480702e+02, 9.700745794339541e+02, 9.709863199501320e+02, 9.718918195270080e+02, 9.727911757092568e+02, - 9.736844836402300e+02, 9.745718361427258e+02, 9.754533237963335e+02, 9.763290350115171e+02, 9.771990561006030e+02, - 9.780634713458334e+02, 9.789223630646294e+02, 9.797758116721943e+02, 9.806238957416025e+02, 9.814666920614760e+02, - 9.823042756913884e+02, 9.831367200150829e+02, 9.839640968064396e+02, 9.847864762179942e+02, 9.856039269214207e+02, - 9.864165160893125e+02, 9.872243094553173e+02, 9.880273713562742e+02, 9.888257647727938e+02, 9.896195513683438e+02, - 9.904087915269082e+02, 9.911935443892800e+02, 9.919738678880559e+02, 9.927498187813788e+02, 9.935214526854868e+02, - 9.942888241061196e+02, 9.950519864688320e+02, 9.958109921482583e+02, 9.965658924963695e+02, 9.973167378697724e+02, - 9.980635776560821e+02, 9.988064602994071e+02, 9.995454333249908e+02, 1.000280543363030e+03, 1.001011836171717e+03, - 1.001739356659530e+03, 1.002463148906790e+03, 1.003183256158867e+03, 1.003899720958960e+03, 1.004612584995837e+03, - 1.005321889239400e+03, 1.006027673929342e+03, 1.006729978592930e+03, 1.007428842062235e+03, 1.008124302490843e+03, - 1.008816397370048e+03, 1.009505163544563e+03, 1.010190637227751e+03, 1.010872854016404e+03, 1.011551848905081e+03, - 1.012227656300032e+03, 1.012900310032699e+03, 1.013569843372839e+03, 1.014236289041257e+03, 1.014899679222176e+03, - 1.015560045575253e+03, 1.016217419247259e+03, 1.016871830883418e+03, 1.017523310638438e+03, 1.018171888187231e+03, - 1.018817592735335e+03, 1.019460453029050e+03, 1.020100497365295e+03, 1.020737753601199e+03, 1.021372249163429e+03, - 1.022004011057273e+03, 1.022633065875470e+03, 1.023259439806818e+03, 1.023883158644541e+03, 1.024504247794449e+03, - 1.025122732282871e+03, 1.025738636764397e+03, 1.026351985529408e+03, 1.026962802511412e+03, 1.027571111294207e+03, - 1.028176935118842e+03, 1.028780296890419e+03, 1.029381219184711e+03, 1.029979724254625e+03, 1.030575834036496e+03, - 1.031169570156234e+03, 1.031760953935307e+03, 1.032350006396591e+03, 1.032936748270071e+03, 1.033521199998403e+03, - 1.034103381742346e+03, 1.034683313386057e+03, 1.035261014542273e+03, 1.035836504557351e+03, 1.036409802516208e+03, - 1.036980927247133e+03, 1.037549897326487e+03, 1.038116731083305e+03, 1.038681446603779e+03, 1.039244061735637e+03, - 1.039804594092438e+03, 1.040363061057752e+03, 1.040919479789251e+03, 1.041473866702080e+03, 1.042026239538718e+03, - 1.042576614298433e+03, 1.043125007274420e+03, 1.043671434553102e+03, 1.044215912017703e+03, 1.044758455351743e+03, - 1.045299080042458e+03, 1.045837801384147e+03, 1.046374634481443e+03, 1.046909594252516e+03, 1.047442695459020e+03, - 1.047973952600802e+03, 1.048503380083154e+03, 1.049030992109075e+03, 1.049556802710124e+03, 1.050080825749232e+03, - 1.050603074923463e+03, 1.051123563766717e+03, 1.051642305652372e+03, 1.052159313795876e+03, 1.052674601257288e+03, - 1.053188180943759e+03, 1.053700065611974e+03, 1.054210267870531e+03, 1.054718800182291e+03, 1.055225674866658e+03, - 1.055730904101835e+03, 1.056234499927018e+03, 1.056736474244561e+03, 1.057236838822090e+03, 1.057735605294571e+03, - 1.058232785166354e+03, 1.058728389813161e+03, 1.059222430484045e+03, 1.059714918303303e+03, 1.060205864272365e+03, - 1.060695279271633e+03, 1.061183174062295e+03, 1.061669559288101e+03, 1.062154445477101e+03, 1.062637843043361e+03, - 1.063119762288638e+03, 1.063600213404025e+03, 1.064079206471569e+03, 1.064556751465858e+03, 1.065032858255574e+03, - 1.065507536605024e+03, 1.065980796175643e+03, 1.066452646527458e+03, 1.066923097120547e+03, 1.067392157316449e+03, - 1.067859836379561e+03, 1.068326143478513e+03, 1.068791087687505e+03, 1.069254677987635e+03, 1.069716923268193e+03, - 1.070177832327938e+03, 1.070637413876350e+03, 1.071095676534861e+03, 1.071552628838061e+03, 1.072008279234891e+03, - 1.072462636089810e+03, 1.072915707683938e+03, 1.073367502216186e+03, 1.073818027804368e+03, 1.074267292486286e+03, - 1.074715304220799e+03, 1.075162070888886e+03, 1.075607600294667e+03, 1.076051900166433e+03, 1.076494978157637e+03, - 1.076936841847887e+03, 1.077377498743904e+03, 1.077816956280481e+03, 1.078255221821415e+03, 1.078692302660430e+03, - 1.079128206022076e+03, 1.079562939062627e+03, 1.079996508870956e+03, 1.080428922469390e+03, 1.080860186814566e+03, - 1.081290308798258e+03, 1.081719295248205e+03, 1.082147152928912e+03, 1.082573888542449e+03, 1.082999508729231e+03, - 1.083424020068788e+03, 1.083847429080523e+03, 1.084269742224458e+03, 1.084690965901966e+03, 1.085111106456496e+03, - 1.085530170174281e+03, 1.085948163285043e+03, 1.086365091962676e+03, 1.086780962325931e+03, 1.087195780439079e+03, - 1.087609552312570e+03, 1.088022283903688e+03, 1.088433981117175e+03, 1.088844649805875e+03, 1.089254295771340e+03, - 1.089662924764448e+03, 1.090070542486000e+03, 1.090477154587311e+03, 1.090882766670794e+03, 1.091287384290534e+03, - 1.091691012952850e+03, 1.092093658116858e+03, 1.092495325195014e+03, 1.092896019553659e+03, 1.093295746513548e+03, - 1.093694511350380e+03, 1.094092319295310e+03, 1.094489175535462e+03, 1.094885085214431e+03, 1.095280053432778e+03, - 1.095674085248518e+03, 1.096067185677603e+03, 1.096459359694391e+03, 1.096850612232122e+03, 1.097240948183370e+03, - 1.097630372400502e+03, 1.098018889696126e+03, 1.098406504843533e+03, 1.098793222577129e+03, 1.099179047592865e+03, - 1.099563984548667e+03, 1.099948038064845e+03, 1.100331212724507e+03, 1.100713513073968e+03, 1.101094943623147e+03, - 1.101475508845962e+03, 1.101855213180724e+03, 1.102234061030513e+03, 1.102612056763566e+03, 1.102989204713642e+03, - 1.103365509180398e+03, 1.103740974429748e+03, 1.104115604694223e+03, 1.104489404173325e+03, 1.104862377033879e+03, - 1.105234527410372e+03, 1.105605859405297e+03, 1.105976377089489e+03, 1.106346084502451e+03, 1.106714985652688e+03, - 1.107083084518021e+03, 1.107450385045915e+03, 1.107816891153782e+03, 1.108182606729300e+03, 1.108547535630712e+03, - 1.108911681687134e+03, 1.109275048698846e+03, 1.109637640437595e+03, 1.109999460646875e+03, 1.110360513042221e+03, - 1.110720801311489e+03, 1.111080329115138e+03, 1.111439100086500e+03, 1.111797117832057e+03, 1.112154385931709e+03, - 1.112510907939039e+03, 1.112866687381575e+03, 1.113221727761045e+03, 1.113576032553641e+03, 1.113929605210264e+03, - 1.114282449156774e+03, 1.114634567794240e+03, 1.114985964499179e+03, 1.115336642623797e+03, 1.115686605496226e+03, - 1.116035856420761e+03, 1.116384398678086e+03, 1.116732235525506e+03, 1.117079370197172e+03, 1.117425805904302e+03, - 1.117771545835405e+03, 1.118116593156494e+03, 1.118460951011303e+03, 1.118804622521501e+03, 1.119147610786899e+03, - 1.119489918885655e+03, 1.119831549874488e+03, 1.120172506788869e+03, 1.120512792643226e+03, 1.120852410431144e+03, - 1.121191363125556e+03, 1.121529653678938e+03, 1.121867285023497e+03, 1.122204260071363e+03, 1.122540581714773e+03, - 1.122876252826255e+03, 1.123211276258809e+03, 1.123545654846089e+03, 1.123879391402579e+03, 1.124212488723768e+03, - 1.124544949586326e+03, 1.124876776748272e+03, 1.125207972949146e+03, 1.125538540910175e+03, 1.125868483334441e+03, - 1.126197802907042e+03, 1.126526502295257e+03, 1.126854584148701e+03, 1.127182051099490e+03, 1.127508905762392e+03, - 1.127835150734984e+03, 1.128160788597804e+03, 1.128485821914504e+03, 1.128810253231999e+03, 1.129134085080612e+03, - 1.129457319974224e+03, 1.129779960410417e+03, 1.130102008870616e+03, 1.130423467820233e+03, 1.130744339708805e+03, - 1.131064626970130e+03, 1.131384332022411e+03, 1.131703457268384e+03, 1.132022005095453e+03, 1.132339977875828e+03, - 1.132657377966648e+03, 1.132974207710115e+03, 1.133290469433624e+03, 1.133606165449884e+03, 1.133921298057046e+03, - 1.134235869538831e+03, 1.134549882164644e+03, 1.134863338189704e+03, 1.135176239855158e+03, 1.135488589388205e+03, - 1.135800389002206e+03, 1.136111640896809e+03, 1.136422347258058e+03, 1.136732510258509e+03, 1.137042132057339e+03, - 1.137351214800466e+03, 1.137659760620650e+03, 1.137967771637607e+03, 1.138275249958116e+03, 1.138582197676124e+03, - 1.138888616872856e+03, 1.139194509616914e+03, 1.139499877964385e+03, 1.139804723958942e+03, 1.140109049631944e+03, - 1.140412857002538e+03, 1.140716148077759e+03, 1.141018924852627e+03, 1.141321189310241e+03, 1.141622943421884e+03, - 1.141924189147108e+03, 1.142224928433838e+03, 1.142525163218457e+03, 1.142824895425903e+03, 1.143124126969763e+03, - 1.143422859752354e+03, 1.143721095664826e+03, 1.144018836587238e+03, 1.144316084388655e+03, 1.144612840927228e+03, - 1.144909108050290e+03, 1.145204887594427e+03, 1.145500181385576e+03, 1.145794991239102e+03, 1.146089318959881e+03 - }, - { - 1.815723590293792e+00, 5.547741973301347e+00, 9.364119310022142e+00, 1.326991225326139e+01, 1.727068456341575e+01, - 2.137257951347054e+01, 2.558240603613146e+01, 2.990774192557961e+01, 3.435705840324101e+01, 3.893987169743523e+01, - 4.366692914112954e+01, 4.855043988264628e+01, 5.360436398370550e+01, 5.884477899627222e+01, 6.429035094150048e+01, - 6.996294839781959e+01, 7.588845656148489e+01, 8.209787687672627e+01, 8.862884470900872e+01, 9.552777671822825e+01, - 1.028529988491558e+02, 1.106794626721360e+02, 1.191061586891296e+02, 1.282683825351360e+02, 1.383593931771599e+02, - 1.496720644779551e+02, 1.626890437154810e+02, 1.783158872257761e+02, 7.759655938076395e+02, 7.827654443446204e+02, - 7.888967882177874e+02, 7.945016046424854e+02, 7.996783459859646e+02, 8.044986875149965e+02, 8.090167432063699e+02, - 8.132745433995641e+02, 8.173054864216909e+02, 8.211366154781526e+02, 8.247901771479186e+02, 8.282847211852928e+02, - 8.316358968022694e+02, 8.348570419779442e+02, 8.379596279524818e+02, 8.409536001121702e+02, 8.438476432852797e+02, - 8.466493909304822e+02, 8.493655920326007e+02, 8.520022456754344e+02, 8.545647106009353e+02, 8.570577951904645e+02, - 8.594858319632351e+02, 8.618527397137098e+02, 8.641620756938623e+02, 8.664170797129203e+02, 8.686207116258228e+02, - 8.707756833761058e+02, 8.728844865242942e+02, 8.749494160109864e+02, 8.769725907616720e+02, 8.789559716283544e+02, - 8.809013770741921e+02, 8.828104969364056e+02, 8.846849045456253e+02, 8.865260674336650e+02, 8.883353568241341e+02, - 8.901140560695940e+02, 8.918633681736341e+02, 8.935844225154053e+02, 8.952782808767492e+02, 8.969459428576579e+02, - 8.985883507536204e+02, 9.002063939582870e+02, 9.018009129462303e+02, 9.033727028833380e+02, 9.049225169061532e+02, - 9.064510691062139e+02, 9.079590372508969e+02, 9.094470652684203e+02, 9.109157655212886e+02, 9.123657208895953e+02, - 9.137974866830930e+02, 9.152115923987628e+02, 9.166085433387542e+02, 9.179888221018713e+02, 9.193528899603913e+02, - 9.207011881327031e+02, 9.220341389611542e+02, 9.233521470035181e+02, 9.246556000456335e+02, 9.259448700419941e+02, - 9.272203139904137e+02, 9.284822747462575e+02, 9.297310817812383e+02, 9.309670518912712e+02, 9.321904898574668e+02, - 9.334016890639774e+02, 9.346009320760390e+02, 9.357884911812955e+02, 9.369646288971685e+02, 9.381295984468353e+02, - 9.392836442061239e+02, 9.404270021234601e+02, 9.415599001147950e+02, 9.426825584353112e+02, 9.437951900295321e+02, - 9.448980008613340e+02, 9.459911902252514e+02, 9.470749510403330e+02, 9.481494701277246e+02, 9.492149284730643e+02, - 9.502715014746709e+02, 9.513193591784631e+02, 9.523586665004456e+02, 9.533895834375616e+02, 9.544122652676351e+02, - 9.554268627390778e+02, 9.564335222513002e+02, 9.574323860279009e+02, 9.584235922783270e+02, 9.594072753515109e+02, - 9.603835658829469e+02, 9.613525909347144e+02, 9.623144741288221e+02, 9.632693356567873e+02, 9.642172923682851e+02, - 9.651584589914841e+02, 9.660929462442829e+02, 9.670208623342101e+02, 9.679423127085462e+02, 9.688574001504629e+02, - 9.697662248709338e+02, 9.706688845966414e+02, 9.715654746540890e+02, 9.724560880501147e+02, 9.733408155489898e+02, - 9.742197457462864e+02, 9.750929651396610e+02, 9.759605581967243e+02, 9.768226074201312e+02, 9.776791934100336e+02, - 9.785303949240247e+02, 9.793762889346899e+02, 9.802169506848896e+02, 9.810524537408476e+02, 9.818828700574539e+02, - 9.827082699692683e+02, 9.835287223268355e+02, 9.843442944812390e+02, 9.851550523434257e+02, 9.859610604262920e+02, - 9.867623818852047e+02, 9.875590785570450e+02, 9.883512109978215e+02, 9.891388385189290e+02, 9.899220192221070e+02, - 9.907008100331568e+02, 9.914752667344615e+02, 9.922454439963763e+02, 9.930113954075197e+02, 9.937731735040229e+02, - 9.945308297977765e+02, 9.952844148037173e+02, 9.960339780661939e+02, 9.967795681844466e+02, 9.975212328372460e+02, - 9.982590188067089e+02, 9.989929720013389e+02, 9.997231374517032e+02, 1.000449559440276e+03, 1.001172281357039e+03, - 1.001891345831880e+03, 1.002606794725588e+03, 1.003318669148805e+03, 1.004027009480390e+03, 1.004731855385216e+03, - 1.005433245831406e+03, 1.006131219107054e+03, 1.006825812836436e+03, 1.007517063995720e+03, 1.008205008928221e+03, - 1.008889683359185e+03, 1.009571122410147e+03, 1.010249360612858e+03, 1.010924431922815e+03, 1.011596369732380e+03, - 1.012265206883538e+03, 1.012930975680285e+03, 1.013593707900647e+03, 1.014253434808380e+03, 1.014910187164329e+03, - 1.015563995237466e+03, 1.016214888815630e+03, 1.016862897215960e+03, 1.017508049295051e+03, 1.018150373458822e+03, - 1.018789897672122e+03, 1.019426649468078e+03, 1.020060655957187e+03, 1.020691943836166e+03, 1.021320539396569e+03, - 1.021946468533175e+03, 1.022569756752160e+03, 1.023190429179046e+03, 1.023808510566456e+03, 1.024424025301656e+03, - 1.025036997413914e+03, 1.025647450581668e+03, 1.026255408139510e+03, 1.026860893084989e+03, 1.027463928085262e+03, - 1.028064535483552e+03, 1.028662737305468e+03, 1.029258555265159e+03, 1.029852010771315e+03, 1.030443124933030e+03, - 1.031031918565510e+03, 1.031618412195654e+03, 1.032202626067499e+03, 1.032784580147528e+03, 1.033364294129856e+03, - 1.033941787441297e+03, 1.034517079246304e+03, 1.035090188451795e+03, 1.035661133711877e+03, 1.036229933432441e+03, - 1.036796605775669e+03, 1.037361168664426e+03, 1.037923639278940e+03, 1.038484036074895e+03, 1.039042375791241e+03, - 1.039598675435571e+03, 1.040152951796690e+03, 1.040705221448446e+03, 1.041255500753481e+03, 1.041803805893988e+03, - 1.042350152765770e+03, 1.042894557147801e+03, 1.043437034593738e+03, 1.043977600463575e+03, 1.044516269926915e+03, - 1.045053057966190e+03, 1.045587979379803e+03, 1.046121048785203e+03, 1.046652280621900e+03, 1.047181689154404e+03, - 1.047709288475126e+03, 1.048235092507188e+03, 1.048759115007203e+03, 1.049281369567976e+03, 1.049801869621161e+03, - 1.050320628439861e+03, 1.050837659141173e+03, 1.051352974688683e+03, 1.051866587894910e+03, 1.052378511423700e+03, - 1.052888757792573e+03, 1.053397339375022e+03, 1.053904268402770e+03, 1.054409556967972e+03, 1.054913217025389e+03, - 1.055415260394507e+03, 1.055915698761615e+03, 1.056414543681852e+03, 1.056911806581207e+03, 1.057407498758476e+03, - 1.057901631387196e+03, 1.058394215517525e+03, 1.058885262078099e+03, 1.059374781877843e+03, 1.059862785607761e+03, - 1.060349283842679e+03, 1.060834287042962e+03, 1.061317805556201e+03, 1.061799849618858e+03, 1.062280429357898e+03, - 1.062759554792371e+03, 1.063237235834981e+03, 1.063713482293618e+03, 1.064188303872861e+03, 1.064661710175463e+03, - 1.065133710703794e+03, 1.065604314861275e+03, 1.066073531953774e+03, 1.066541371190978e+03, 1.067007841687747e+03, - 1.067472952465441e+03, 1.067936712453220e+03, 1.068399130489324e+03, 1.068860215322332e+03, 1.069319975612398e+03, - 1.069778419932462e+03, 1.070235556769443e+03, 1.070691394525415e+03, 1.071145941518753e+03, 1.071599205985269e+03, - 1.072051196079325e+03, 1.072501919874923e+03, 1.072951385366786e+03, 1.073399600471407e+03, 1.073846573028095e+03, - 1.074292310799996e+03, 1.074736821475092e+03, 1.075180112667193e+03, 1.075622191916911e+03, 1.076063066692609e+03, - 1.076502744391344e+03, 1.076941232339790e+03, 1.077378537795149e+03, 1.077814667946042e+03, 1.078249629913391e+03, - 1.078683430751281e+03, 1.079116077447815e+03, 1.079547576925950e+03, 1.079977936044320e+03, 1.080407161598048e+03, - 1.080835260319541e+03, 1.081262238879283e+03, 1.081688103886600e+03, 1.082112861890421e+03, 1.082536519380033e+03, - 1.082959082785813e+03, 1.083380558479953e+03, 1.083800952777175e+03, 1.084220271935437e+03, 1.084638522156621e+03, - 1.085055709587217e+03, 1.085471840318991e+03, 1.085886920389650e+03, 1.086300955783492e+03, 1.086713952432041e+03, - 1.087125916214687e+03, 1.087536852959298e+03, 1.087946768442842e+03, 1.088355668391981e+03, 1.088763558483670e+03, - 1.089170444345742e+03, 1.089576331557482e+03, 1.089981225650196e+03, 1.090385132107770e+03, 1.090788056367222e+03, - 1.091190003819245e+03, 1.091590979808741e+03, 1.091990989635349e+03, 1.092390038553964e+03, 1.092788131775250e+03, - 1.093185274466144e+03, 1.093581471750355e+03, 1.093976728708850e+03, 1.094371050380344e+03, 1.094764441761769e+03, - 1.095156907808748e+03, 1.095548453436057e+03, 1.095939083518081e+03, 1.096328802889263e+03, 1.096717616344550e+03, - 1.097105528639827e+03, 1.097492544492352e+03, 1.097878668581176e+03, 1.098263905547569e+03, 1.098648259995427e+03, - 1.099031736491684e+03, 1.099414339566711e+03, 1.099796073714716e+03, 1.100176943394132e+03, 1.100556953028006e+03, - 1.100936107004374e+03, 1.101314409676644e+03, 1.101691865363960e+03, 1.102068478351571e+03, 1.102444252891188e+03, - 1.102819193201345e+03, 1.103193303467741e+03, 1.103566587843598e+03, 1.103939050449989e+03, 1.104310695376187e+03, - 1.104681526679989e+03, 1.105051548388049e+03, 1.105420764496202e+03, 1.105789178969776e+03, 1.106156795743918e+03, - 1.106523618723899e+03, 1.106889651785421e+03, 1.107254898774922e+03, 1.107619363509876e+03, 1.107983049779086e+03, - 1.108345961342977e+03, 1.108708101933884e+03, 1.109069475256335e+03, 1.109430084987331e+03, 1.109789934776628e+03, - 1.110149028247004e+03, 1.110507368994530e+03, 1.110864960588842e+03, 1.111221806573398e+03, 1.111577910465740e+03, - 1.111933275757751e+03, 1.112287905915909e+03, 1.112641804381536e+03, 1.112994974571046e+03, 1.113347419876188e+03, - 1.113699143664288e+03, 1.114050149278488e+03, 1.114400440037977e+03, 1.114750019238231e+03, 1.115098890151233e+03, - 1.115447056025707e+03, 1.115794520087338e+03, 1.116141285538996e+03, 1.116487355560951e+03, 1.116832733311091e+03, - 1.117177421925135e+03, 1.117521424516844e+03, 1.117864744178228e+03, 1.118207383979752e+03, 1.118549346970541e+03, - 1.118890636178577e+03, 1.119231254610902e+03, 1.119571205253808e+03, 1.119910491073039e+03, 1.120249115013974e+03, - 1.120587080001821e+03, 1.120924388941804e+03, 1.121261044719347e+03, 1.121597050200254e+03, 1.121932408230893e+03, - 1.122267121638373e+03, 1.122601193230722e+03, 1.122934625797059e+03, 1.123267422107765e+03, 1.123599584914659e+03, - 1.123931116951160e+03, 1.124262020932457e+03, 1.124592299555674e+03, 1.124921955500030e+03, 1.125250991427002e+03, - 1.125579409980481e+03, 1.125907213786935e+03, 1.126234405455558e+03, 1.126560987578428e+03, 1.126886962730656e+03, - 1.127212333470539e+03, 1.127537102339705e+03, 1.127861271863266e+03, 1.128184844549954e+03, 1.128507822892274e+03, - 1.128830209366642e+03, 1.129152006433523e+03, 1.129473216537573e+03, 1.129793842107780e+03, 1.130113885557590e+03, - 1.130433349285051e+03, 1.130752235672941e+03, 1.131070547088901e+03, 1.131388285885563e+03, 1.131705454400686e+03, - 1.132022054957269e+03, 1.132338089863695e+03, 1.132653561413839e+03, 1.132968471887203e+03, 1.133282823549032e+03, - 1.133596618650433e+03, 1.133909859428502e+03, 1.134222548106433e+03, 1.134534686893644e+03, 1.134846277985881e+03, - 1.135157323565346e+03, 1.135467825800798e+03, 1.135777786847671e+03, 1.136087208848185e+03, 1.136396093931452e+03, - 1.136704444213590e+03, 1.137012261797824e+03, 1.137319548774596e+03, 1.137626307221670e+03, 1.137932539204235e+03, - 1.138238246775009e+03, 1.138543431974336e+03, 1.138848096830297e+03, 1.139152243358799e+03, 1.139455873563681e+03, - 1.139758989436807e+03, 1.140061592958167e+03, 1.140363686095968e+03, 1.140665270806736e+03, 1.140966349035399e+03, - 1.141266922715392e+03, 1.141566993768738e+03, 1.141866564106147e+03, 1.142165635627104e+03, 1.142464210219955e+03, - 1.142762289761997e+03, 1.143059876119570e+03, 1.143356971148134e+03, 1.143653576692366e+03, 1.143949694586235e+03 - }, - { - 1.809313629947665e+00, 5.527448591099636e+00, 9.328595799244161e+00, 1.321765646975879e+01, 1.720001517166403e+01, - 2.128160758050582e+01, 2.546900083803720e+01, 2.976948949436231e+01, 3.419121088414567e+01, 3.874328495886331e+01, - 4.343598520541453e+01, 4.828094951183329e+01, 5.329144298328825e+01, 5.848268921223323e+01, 6.387229307058556e+01, - 6.948078785959135e+01, 7.533235451764996e+01, 8.145578378310805e+01, 8.788578945127421e+01, 9.466484262474484e+01, - 1.018458031644321e+02, 1.094958156802023e+02, 1.177022989812728e+02, 1.265825861884704e+02, 1.363003535367639e+02, - 1.470957566237750e+02, 1.593464514463227e+02, 1.737099074333793e+02, 1.915389226689061e+02, 7.675225995554495e+02, - 7.748212077104222e+02, 7.813507535409474e+02, 7.872845228622162e+02, 7.927398507367348e+02, 7.978006430981470e+02, - 8.025293654686037e+02, 8.069739893528382e+02, 8.111722806964480e+02, 8.151545814687862e+02, 8.189456867946710e+02, - 8.225661536781591e+02, 8.260332387054800e+02, 8.293615857322313e+02, 8.325637404541292e+02, 8.356505422583509e+02, - 8.386314272757180e+02, 8.415146660027340e+02, 8.443075519284051e+02, 8.470165529382887e+02, 8.496474340683425e+02, - 8.522053579445470e+02, 8.546949676547539e+02, 8.571204556524733e+02, 8.594856214535901e+02, 8.617939202657772e+02, - 8.640485042248040e+02, 8.662522575594522e+02, 8.684078267369522e+02, 8.705176464327252e+02, 8.725839620060142e+02, - 8.746088490357226e+02, 8.765942303701324e+02, 8.785418910639560e+02, 8.804534915118968e+02, 8.823305790360133e+02, - 8.841745981420603e+02, 8.859868996256340e+02, 8.877687486806938e+02, 8.895213321398653e+02, 8.912457649565370e+02, - 8.929430960228397e+02, 8.946143134040823e+02, 8.962603490590532e+02, 8.978820831060226e+02, 8.994803476863232e+02, - 9.010559304705299e+02, 9.026095778464775e+02, 9.041419978233812e+02, 9.056538626820836e+02, 9.071458113977808e+02, - 9.086184518584356e+02, 9.100723628993467e+02, 9.115080961719987e+02, 9.129261778632140e+02, 9.143271102789028e+02, - 9.157113733050595e+02, 9.170794257573617e+02, 9.184317066294529e+02, 9.197686362489786e+02, 9.210906173494939e+02, - 9.223980360655230e+02, 9.236912628573501e+02, 9.249706533714403e+02, 9.262365492418428e+02, 9.274892788373954e+02, - 9.287291579591041e+02, 9.299564904916623e+02, 9.311715690127055e+02, 9.323746753630725e+02, 9.335660811810575e+02, - 9.347460484033631e+02, 9.359148297352348e+02, 9.370726690920396e+02, 9.382198020143657e+02, 9.393564560585340e+02, - 9.404828511642746e+02, 9.415992000011463e+02, 9.427057082951852e+02, 9.438025751371298e+02, 9.448899932734539e+02, - 9.459681493813665e+02, 9.470372243288432e+02, 9.480973934206320e+02, 9.491488266311843e+02, 9.501916888253102e+02, - 9.512261399673437e+02, 9.522523353195342e+02, 9.532704256311487e+02, 9.542805573190734e+02, 9.552828726359891e+02, - 9.562775098314069e+02, 9.572646033052281e+02, 9.582442837538858e+02, 9.592166783094843e+02, 9.601819101488558e+02, - 9.611401005475792e+02, 9.620913663075141e+02, 9.630358215618702e+02, 9.639735774833689e+02, 9.649047423890220e+02, - 9.658294218402451e+02, 9.667477187385299e+02, 9.676597334169351e+02, 9.685655637275923e+02, 9.694653051254541e+02, - 9.703590507484719e+02, 9.712468914943806e+02, 9.721289160942781e+02, 9.730052111831420e+02, 9.738758613674498e+02, - 9.747409492900443e+02, 9.756005556923727e+02, 9.764547594742349e+02, 9.773036377511587e+02, 9.781472659095107e+02, - 9.789857176741831e+02, 9.798190650992198e+02, 9.806473787094021e+02, 9.814707274840052e+02, 9.822891789183656e+02, - 9.831027990674879e+02, 9.839116525880347e+02, 9.847158027787654e+02, 9.855153116194912e+02, 9.863102398086253e+02, - 9.871006467993676e+02, 9.878865908346045e+02, 9.886681289805671e+02, 9.894453171593053e+02, 9.902182101800261e+02, - 9.909868617693431e+02, 9.917513246004892e+02, 9.925116503215280e+02, 9.932678895826081e+02, 9.940200920623009e+02, - 9.947683064930551e+02, 9.955125806858125e+02, 9.962529615283617e+02, 9.969894951118794e+02, 9.977222265951764e+02, - 9.984512003335331e+02, 9.991764598722348e+02, 9.998980479667700e+02, 1.000616006602397e+03, 1.001330377013085e+03, - 1.002041199699880e+03, 1.002748514448686e+03, 1.003452360347509e+03, 1.004152775803175e+03, 1.004849798557532e+03, - 1.005543465703172e+03, 1.006233813698678e+03, 1.006920878383415e+03, 1.007604694991892e+03, 1.008285298167690e+03, - 1.008962721976992e+03, 1.009636999921719e+03, 1.010308164952282e+03, 1.010976249479977e+03, 1.011641285389021e+03, - 1.012303304048245e+03, 1.012962336322468e+03, 1.013618412583541e+03, 1.014271562721096e+03, 1.014921816152985e+03, - 1.015569201835444e+03, 1.016213748272970e+03, 1.016855483527943e+03, 1.017494435229970e+03, 1.018130630584994e+03, - 1.018764096384156e+03, 1.019394859012413e+03, 1.020022944456947e+03, 1.020648378315332e+03, 1.021271185803506e+03, - 1.021891391763527e+03, 1.022509020671134e+03, 1.023124096643107e+03, 1.023736643444448e+03, 1.024346684495373e+03, - 1.024954242878135e+03, 1.025559341343668e+03, 1.026162002318071e+03, 1.026762247908929e+03, 1.027360099911479e+03, - 1.027955579814620e+03, 1.028548708806787e+03, 1.029139507781672e+03, 1.029727997343809e+03, 1.030314197814030e+03, - 1.030898129234785e+03, 1.031479811375338e+03, 1.032059263736839e+03, 1.032636505557279e+03, 1.033211555816324e+03, - 1.033784433240043e+03, 1.034355156305520e+03, 1.034923742735057e+03, 1.035490211524955e+03, 1.036054579938216e+03, - 1.036616865526263e+03, 1.037177085533333e+03, 1.037735257061145e+03, 1.038291396964539e+03, 1.038845521882697e+03, - 1.039397648242903e+03, 1.039947792264209e+03, 1.040495969961037e+03, 1.041042197146686e+03, 1.041586489436770e+03, - 1.042128862252588e+03, 1.042669330824406e+03, 1.043207910194682e+03, 1.043744615221219e+03, 1.044279460580244e+03, - 1.044812460769430e+03, 1.045343630110854e+03, 1.045872982753885e+03, 1.046400532678022e+03, 1.046926293695667e+03, - 1.047450279454839e+03, 1.047972503441839e+03, 1.048492978983853e+03, 1.049011719251509e+03, 1.049528737261372e+03, - 1.050044045878402e+03, 1.050557657818351e+03, 1.051069585650117e+03, 1.051579841798048e+03, 1.052088438544207e+03, - 1.052595388030581e+03, 1.053100702261261e+03, 1.053604393104564e+03, 1.054106472295122e+03, 1.054606951435933e+03, - 1.055105842000362e+03, 1.055603155334115e+03, 1.056098902657167e+03, 1.056593095065654e+03, 1.057085743533734e+03, - 1.057576858915406e+03, 1.058066451946302e+03, 1.058554533245436e+03, 1.059041113316928e+03, 1.059526202551693e+03, - 1.060009811229099e+03, 1.060491949518592e+03, 1.060972627481292e+03, 1.061451855071568e+03, 1.061929642138567e+03, - 1.062405998427729e+03, 1.062880933582271e+03, 1.063354457144642e+03, 1.063826578557953e+03, 1.064297307167385e+03, - 1.064766652221563e+03, 1.065234622873911e+03, 1.065701228183989e+03, 1.066166477118793e+03, 1.066630378554043e+03, - 1.067092941275443e+03, 1.067554173979922e+03, 1.068014085276850e+03, 1.068472683689235e+03, 1.068929977654901e+03, - 1.069385975527641e+03, 1.069840685578358e+03, 1.070294115996172e+03, 1.070746274889529e+03, 1.071197170287271e+03, - 1.071646810139702e+03, 1.072095202319626e+03, 1.072542354623377e+03, 1.072988274771826e+03, 1.073432970411367e+03, - 1.073876449114901e+03, 1.074318718382787e+03, 1.074759785643784e+03, 1.075199658255990e+03, 1.075638343507739e+03, - 1.076075848618507e+03, 1.076512180739795e+03, 1.076947346955992e+03, 1.077381354285234e+03, 1.077814209680243e+03, - 1.078245920029154e+03, 1.078676492156329e+03, 1.079105932823158e+03, 1.079534248728846e+03, 1.079961446511191e+03, - 1.080387532747345e+03, 1.080812513954568e+03, 1.081236396590965e+03, 1.081659187056216e+03, 1.082080891692291e+03, - 1.082501516784159e+03, 1.082921068560481e+03, 1.083339553194289e+03, 1.083756976803669e+03, 1.084173345452420e+03, - 1.084588665150703e+03, 1.085002941855689e+03, 1.085416181472193e+03, 1.085828389853295e+03, 1.086239572800955e+03, - 1.086649736066620e+03, 1.087058885351820e+03, 1.087467026308752e+03, 1.087874164540861e+03, 1.088280305603412e+03, - 1.088685455004049e+03, 1.089089618203348e+03, 1.089492800615362e+03, 1.089895007608163e+03, 1.090296244504362e+03, - 1.090696516581641e+03, 1.091095829073259e+03, 1.091494187168565e+03, 1.091891596013490e+03, 1.092288060711050e+03, - 1.092683586321815e+03, 1.093078177864407e+03, 1.093471840315953e+03, 1.093864578612563e+03, 1.094256397649782e+03, - 1.094647302283038e+03, 1.095037297328099e+03, 1.095426387561500e+03, 1.095814577720983e+03, 1.096201872505921e+03, - 1.096588276577740e+03, 1.096973794560334e+03, 1.097358431040471e+03, 1.097742190568208e+03, 1.098125077657272e+03, - 1.098507096785468e+03, 1.098888252395056e+03, 1.099268548893141e+03, 1.099647990652043e+03, 1.100026582009674e+03, - 1.100404327269903e+03, 1.100781230702918e+03, 1.101157296545579e+03, 1.101532529001777e+03, 1.101906932242780e+03, - 1.102280510407570e+03, 1.102653267603189e+03, 1.103025207905066e+03, 1.103396335357352e+03, 1.103766653973245e+03, - 1.104136167735306e+03, 1.104504880595778e+03, 1.104872796476900e+03, 1.105239919271214e+03, 1.105606252841872e+03, - 1.105971801022931e+03, 1.106336567619655e+03, 1.106700556408805e+03, 1.107063771138930e+03, 1.107426215530649e+03, - 1.107787893276936e+03, 1.108148808043397e+03, 1.108508963468545e+03, 1.108868363164069e+03, 1.109227010715106e+03, - 1.109584909680498e+03, 1.109942063593063e+03, 1.110298475959843e+03, 1.110654150262366e+03, 1.111009089956890e+03, - 1.111363298474659e+03, 1.111716779222145e+03, 1.112069535581284e+03, 1.112421570909726e+03, 1.112772888541063e+03, - 1.113123491785067e+03, 1.113473383927915e+03, 1.113822568232424e+03, 1.114171047938268e+03, 1.114518826262206e+03, - 1.114865906398300e+03, 1.115212291518128e+03, 1.115557984771005e+03, 1.115902989284187e+03, 1.116247308163085e+03, - 1.116590944491471e+03, 1.116933901331681e+03, 1.117276181724816e+03, 1.117617788690944e+03, 1.117958725229292e+03, - 1.118298994318447e+03, 1.118638598916542e+03, 1.118977541961450e+03, 1.119315826370972e+03, 1.119653455043017e+03, - 1.119990430855795e+03, 1.120326756667989e+03, 1.120662435318940e+03, 1.120997469628819e+03, 1.121331862398810e+03, - 1.121665616411274e+03, 1.121998734429927e+03, 1.122331219200003e+03, 1.122663073448430e+03, 1.122994299883984e+03, - 1.123324901197463e+03, 1.123654880061838e+03, 1.123984239132422e+03, 1.124312981047025e+03, 1.124641108426106e+03, - 1.124968623872934e+03, 1.125295529973735e+03, 1.125621829297844e+03, 1.125947524397857e+03, 1.126272617809776e+03, - 1.126597112053158e+03, 1.126921009631254e+03, 1.127244313031155e+03, 1.127567024723935e+03, 1.127889147164785e+03, - 1.128210682793157e+03, 1.128531634032897e+03, 1.128852003292382e+03, 1.129171792964650e+03, 1.129491005427537e+03, - 1.129809643043802e+03, 1.130127708161264e+03, 1.130445203112920e+03, 1.130762130217082e+03, 1.131078491777493e+03, - 1.131394290083455e+03, 1.131709527409953e+03, 1.132024206017771e+03, 1.132338328153619e+03, 1.132651896050245e+03, - 1.132964911926553e+03, 1.133277377987726e+03, 1.133589296425330e+03, 1.133900669417437e+03, 1.134211499128733e+03, - 1.134521787710628e+03, 1.134831537301372e+03, 1.135140750026154e+03, 1.135449427997222e+03, 1.135757573313979e+03, - 1.136065188063094e+03, 1.136372274318607e+03, 1.136678834142029e+03, 1.136984869582447e+03, 1.137290382676623e+03, - 1.137595375449096e+03, 1.137899849912283e+03, 1.138203808066571e+03, 1.138507251900421e+03, 1.138810183390460e+03, - 1.139112604501578e+03, 1.139414517187021e+03, 1.139715923388486e+03, 1.140016825036212e+03, 1.140317224049069e+03, - 1.140617122334657e+03, 1.140916521789383e+03, 1.141215424298563e+03, 1.141513831736498e+03, 1.141811745966569e+03 - }, - { - 1.802949606005701e+00, 5.507311374944670e+00, 9.293365589617125e+00, 1.316586333859079e+01, 1.713001650557099e+01, - 2.119156118394337e+01, 2.535683266000191e+01, 2.963285463893812e+01, 3.402744615770619e+01, 3.854935065135555e+01, - 4.320839303547432e+01, 4.801567258955310e+01, 5.298380211306726e+01, 5.812720764131053e+01, 6.346250851939712e+01, - 6.900900574742812e+01, 7.478931871238875e+01, 8.083022921097614e+01, 8.716382137619996e+01, 9.382905453392922e+01, - 1.008739876810596e+02, 1.083590176604777e+02, 1.163617568119723e+02, 1.249846891547300e+02, 1.343678119517787e+02, - 1.447108882606782e+02, 1.563160393367302e+02, 1.696792305158197e+02, 1.857235452502538e+02, 2.065973190359904e+02, - 7.588924632129282e+02, 7.667372959839546e+02, 7.736959082390420e+02, 7.799800450186664e+02, 7.857295505784103e+02, - 7.910425794825978e+02, 7.959911505257468e+02, 8.006299306308250e+02, 8.050015473097812e+02, 8.091399764521744e+02, - 8.130727961365870e+02, 8.168227389363965e+02, 8.204087925106738e+02, 8.238469993899859e+02, 8.271510506375374e+02, - 8.303327347339151e+02, 8.334022825592878e+02, 8.363686363772583e+02, 8.392396622843371e+02, 8.420223199638976e+02, - 8.447227997542524e+02, 8.473466343835626e+02, 8.498987908489154e+02, 8.523837465723221e+02, 8.548055529885371e+02, - 8.571678889991530e+02, 8.594741061901954e+02, 8.617272673054086e+02, 8.639301791588259e+02, 8.660854209330131e+02, - 8.681953686251559e+02, 8.702622162592425e+02, 8.722879943689366e+02, 8.742745861655906e+02, 8.762237417337147e+02, - 8.781370905381930e+02, 8.800161524804955e+02, 8.818623477029201e+02, 8.836770053085260e+02, 8.854613711386157e+02, - 8.872166147283491e+02, 8.889438355432820e+02, 8.906440685848814e+02, 8.923182894406451e+02, 8.939674188440410e+02, - 8.955923268006555e+02, 8.971938363294836e+02, 8.987727268619362e+02, 9.003297373357054e+02, 9.018655690160062e+02, - 9.033808880726966e+02, 9.048763279383670e+02, 9.063524914694952e+02, 9.078099529302140e+02, 9.092492598159815e+02, - 9.106709345325212e+02, 9.120754759436692e+02, 9.134633608003226e+02, 9.148350450613303e+02, 9.161909651160622e+02, - 9.175315389173534e+02, 9.188571670326598e+02, 9.201682336204359e+02, 9.214651073380884e+02, 9.227481421871950e+02, - 9.240176783011799e+02, 9.252740426800916e+02, 9.265175498767254e+02, 9.277485026379394e+02, 9.289671925046413e+02, - 9.301739003736291e+02, 9.313688970241847e+02, 9.325524436120440e+02, 9.337247921331768e+02, 9.348861858595600e+02, - 9.360368597489777e+02, 9.371770408306899e+02, 9.383069485686710e+02, 9.394267952039779e+02, 9.405367860776764e+02, - 9.416371199356548e+02, 9.427279892165260e+02, 9.438095803237553e+02, 9.448820738830415e+02, 9.459456449859014e+02, - 9.470004634203566e+02, 9.480466938895268e+02, 9.490844962189408e+02, 9.501140255547201e+02, 9.511354325509520e+02, - 9.521488635453246e+02, 9.531544607274585e+02, 9.541523622990874e+02, 9.551427026264414e+02, 9.561256123852903e+02, - 9.571012181150734e+02, 9.580696445046956e+02, 9.590310115059765e+02, 9.599854363440868e+02, 9.609330331826791e+02, - 9.618739132329370e+02, 9.628081848577186e+02, 9.637359536710719e+02, 9.646573226333633e+02, 9.655723921422441e+02, - 9.664812601196920e+02, 9.673840220953130e+02, 9.682807712861045e+02, 9.691715986728683e+02, 9.700565930734246e+02, - 9.709358412128021e+02, 9.718094277905537e+02, 9.726774355453343e+02, 9.735399453168733e+02, 9.743970361054792e+02, - 9.752487851291779e+02, 9.760952678938256e+02, 9.769365581835999e+02, 9.777727282074155e+02, 9.786038485822751e+02, - 9.794299883969971e+02, 9.802512152573717e+02, 9.810675953296342e+02, 9.818791933823226e+02, 9.826860728265964e+02, - 9.834882957550820e+02, 9.842859229793153e+02, 9.850790140658354e+02, 9.858676273709904e+02, 9.866518200745162e+02, - 9.874316482119319e+02, 9.882071667058043e+02, 9.889784293959354e+02, 9.897454890685133e+02, 9.905083974842631e+02, - 9.912672054056547e+02, 9.920219625972015e+02, 9.927727179566147e+02, 9.935195193779268e+02, 9.942624138848743e+02, - 9.950014476259554e+02, 9.957366658966689e+02, 9.964681131610462e+02, 9.971958330724781e+02, 9.979198684939016e+02, - 9.986402615173321e+02, 9.993570534827937e+02, 1.000070284996659e+03, 1.000779995949418e+03, 1.001486225532911e+03, - 1.002189012257021e+03, 1.002888393965876e+03, 1.003584407853555e+03, 1.004277090479327e+03, 1.004966477782434e+03, - 1.005652605096443e+03, 1.006335507163171e+03, 1.007015218146215e+03, 1.007691771644071e+03, 1.008365200702895e+03, - 1.009035537828892e+03, 1.009702815000345e+03, 1.010367063679318e+03, 1.011028314823017e+03, 1.011686598894844e+03, - 1.012341945875143e+03, 1.012994385271640e+03, 1.013643946129611e+03, 1.014290657041759e+03, 1.014934546157838e+03, - 1.015575641194005e+03, 1.016213969441927e+03, 1.016849557777650e+03, 1.017482432670219e+03, 1.018112620190092e+03, - 1.018740146017314e+03, 1.019365035449492e+03, 1.019987313409552e+03, 1.020607004453313e+03, 1.021224132776846e+03, - 1.021838722223665e+03, 1.022450796291724e+03, 1.023060378140242e+03, 1.023667490596358e+03, 1.024272156161618e+03, - 1.024874397018303e+03, 1.025474235035601e+03, 1.026071691775630e+03, 1.026666788499302e+03, 1.027259546172069e+03, - 1.027849985469504e+03, 1.028438126782765e+03, 1.029023990223924e+03, 1.029607595631170e+03, 1.030188962573883e+03, - 1.030768110357432e+03, 1.031345058054161e+03, 1.031919823891675e+03, 1.032492427446978e+03, 1.033062886521899e+03, - 1.033631219173196e+03, 1.034197443221219e+03, 1.034761576254120e+03, 1.035323635631972e+03, 1.035883638490796e+03, - 1.036441601746496e+03, 1.036997542098705e+03, 1.037551476034553e+03, 1.038103419832342e+03, 1.038653389565144e+03, - 1.039201401104329e+03, 1.039747470123000e+03, 1.040291612099372e+03, 1.040833842320058e+03, 1.041374175883305e+03, - 1.041912627702149e+03, 1.042449212507500e+03, 1.042983944851176e+03, 1.043516839108857e+03, 1.044047909482989e+03, - 1.044577170005622e+03, 1.045104634541187e+03, 1.045630316789226e+03, 1.046154230287051e+03, 1.046676388412360e+03, - 1.047196804385794e+03, 1.047715491273446e+03, 1.048232461989315e+03, 1.048747729297717e+03, 1.049261305815634e+03, - 1.049773204015039e+03, 1.050283436225149e+03, 1.050792014634651e+03, 1.051298951293883e+03, 1.051804258116961e+03, - 1.052307946883877e+03, 1.052810029242546e+03, 1.053310516710824e+03, 1.053809420678476e+03, 1.054306752409115e+03, - 1.054802523042100e+03, 1.055296743594395e+03, 1.055789424962400e+03, 1.056280577923744e+03, 1.056770213139037e+03, - 1.057258341153604e+03, 1.057744972399173e+03, 1.058230117195538e+03, 1.058713785752195e+03, 1.059195988169934e+03, - 1.059676734442420e+03, 1.060156034457731e+03, 1.060633897999872e+03, 1.061110334750267e+03, 1.061585354289214e+03, - 1.062058966097324e+03, 1.062531179556926e+03, 1.063002003953453e+03, 1.063471448476796e+03, 1.063939522222646e+03, - 1.064406234193796e+03, 1.064871593301437e+03, 1.065335608366417e+03, 1.065798288120488e+03, 1.066259641207525e+03, - 1.066719676184731e+03, 1.067178401523808e+03, 1.067635825612126e+03, 1.068091956753855e+03, 1.068546803171089e+03, - 1.069000373004944e+03, 1.069452674316643e+03, 1.069903715088579e+03, 1.070353503225359e+03, 1.070802046554834e+03, - 1.071249352829113e+03, 1.071695429725551e+03, 1.072140284847732e+03, 1.072583925726427e+03, 1.073026359820546e+03, - 1.073467594518060e+03, 1.073907637136922e+03, 1.074346494925965e+03, 1.074784175065788e+03, 1.075220684669628e+03, - 1.075656030784213e+03, 1.076090220390609e+03, 1.076523260405053e+03, 1.076955157679762e+03, 1.077385919003741e+03, - 1.077815551103572e+03, 1.078244060644195e+03, 1.078671454229672e+03, 1.079097738403938e+03, 1.079522919651551e+03, - 1.079947004398415e+03, 1.080369999012502e+03, 1.080791909804562e+03, 1.081212743028816e+03, 1.081632504883647e+03, - 1.082051201512272e+03, 1.082468839003408e+03, 1.082885423391932e+03, 1.083300960659520e+03, 1.083715456735285e+03, - 1.084128917496407e+03, 1.084541348768742e+03, 1.084952756327437e+03, 1.085363145897521e+03, 1.085772523154501e+03, - 1.086180893724939e+03, 1.086588263187025e+03, 1.086994637071140e+03, 1.087400020860410e+03, 1.087804419991256e+03, - 1.088207839853934e+03, 1.088610285793059e+03, 1.089011763108138e+03, 1.089412277054077e+03, 1.089811832841699e+03, - 1.090210435638236e+03, 1.090608090567828e+03, 1.091004802712010e+03, 1.091400577110190e+03, 1.091795418760121e+03, - 1.092189332618373e+03, 1.092582323600786e+03, 1.092974396582928e+03, 1.093365556400538e+03, 1.093755807849973e+03, - 1.094145155688635e+03, 1.094533604635403e+03, 1.094921159371059e+03, 1.095307824538696e+03, 1.095693604744137e+03, - 1.096078504556338e+03, 1.096462528507783e+03, 1.096845681094887e+03, 1.097227966778376e+03, 1.097609389983676e+03, - 1.097989955101289e+03, 1.098369666487170e+03, 1.098748528463087e+03, 1.099126545316992e+03, 1.099503721303377e+03, - 1.099880060643627e+03, 1.100255567526369e+03, 1.100630246107814e+03, 1.101004100512101e+03, 1.101377134831631e+03, - 1.101749353127394e+03, 1.102120759429298e+03, 1.102491357736493e+03, 1.102861152017687e+03, 1.103230146211456e+03, - 1.103598344226563e+03, 1.103965749942251e+03, 1.104332367208558e+03, 1.104698199846603e+03, 1.105063251648889e+03, - 1.105427526379587e+03, 1.105791027774825e+03, 1.106153759542972e+03, 1.106515725364915e+03, 1.106876928894335e+03, - 1.107237373757979e+03, 1.107597063555931e+03, 1.107956001861874e+03, 1.108314192223355e+03, 1.108671638162041e+03, - 1.109028343173977e+03, 1.109384310729836e+03, 1.109739544275169e+03, 1.110094047230654e+03, 1.110447822992332e+03, - 1.110800874931856e+03, 1.111153206396722e+03, 1.111504820710501e+03, 1.111855721173081e+03, 1.112205911060882e+03, - 1.112555393627091e+03, 1.112904172101883e+03, 1.113252249692640e+03, 1.113599629584165e+03, 1.113946314938909e+03, - 1.114292308897169e+03, 1.114637614577305e+03, 1.114982235075949e+03, 1.115326173468208e+03, 1.115669432807862e+03, - 1.116012016127571e+03, 1.116353926439070e+03, 1.116695166733361e+03, 1.117035739980913e+03, 1.117375649131846e+03, - 1.117714897116122e+03, 1.118053486843734e+03, 1.118391421204886e+03, 1.118728703070178e+03, 1.119065335290782e+03, - 1.119401320698627e+03, 1.119736662106566e+03, 1.120071362308555e+03, 1.120405424079827e+03, 1.120738850177054e+03, - 1.121071643338522e+03, 1.121403806284293e+03, 1.121735341716371e+03, 1.122066252318864e+03, 1.122396540758141e+03, - 1.122726209682997e+03, 1.123055261724804e+03, 1.123383699497668e+03, 1.123711525598582e+03, 1.124038742607577e+03, - 1.124365353087877e+03, 1.124691359586036e+03, 1.125016764632096e+03, 1.125341570739725e+03, 1.125665780406363e+03, - 1.125989396113362e+03, 1.126312420326128e+03, 1.126634855494260e+03, 1.126956704051683e+03, 1.127277968416789e+03, - 1.127598650992565e+03, 1.127918754166734e+03, 1.128238280311877e+03, 1.128557231785570e+03, 1.128875610930507e+03, - 1.129193420074632e+03, 1.129510661531258e+03, 1.129827337599201e+03, 1.130143450562893e+03, 1.130459002692509e+03, - 1.130773996244087e+03, 1.131088433459644e+03, 1.131402316567299e+03, 1.131715647781385e+03, 1.132028429302566e+03, - 1.132340663317951e+03, 1.132652352001206e+03, 1.132963497512668e+03, 1.133274101999453e+03, 1.133584167595568e+03, - 1.133893696422015e+03, 1.134202690586904e+03, 1.134511152185552e+03, 1.134819083300596e+03, 1.135126486002089e+03, - 1.135433362347606e+03, 1.135739714382350e+03, 1.136045544139245e+03, 1.136350853639038e+03, 1.136655644890404e+03, - 1.136959919890032e+03, 1.137263680622733e+03, 1.137566929061527e+03, 1.137869667167744e+03, 1.138171896891111e+03, - 1.138473620169852e+03, 1.138774838930776e+03, 1.139075555089366e+03, 1.139375770549873e+03, 1.139675487205403e+03 - }, - { - 1.796631013169837e+00, 5.487328396771806e+00, 9.258424658445046e+00, 1.311452586346833e+01, 1.706067744330778e+01, - 2.110242356299819e+01, 2.524587710756039e+01, 2.949780269134198e+01, 3.386571577142732e+01, 3.835800184003740e+01, - 4.298406088351287e+01, 4.775448395350730e+01, 5.268127099616643e+01, 5.777810232377322e+01, 6.306068074879938e+01, - 6.854716815554468e+01, 7.425875032730765e+01, 8.022037911258907e+01, 8.646176480327708e+01, 9.301872972748357e+01, - 9.993509716187536e+01, 1.072653980141988e+02, 1.150788719189642e+02, 1.234656052842210e+02, 1.325463822318869e+02, - 1.424894055847202e+02, 1.535407933349483e+02, 1.660857969141240e+02, 1.807895760401114e+02, 1.989974918507586e+02, - 7.401717920801317e+02, 7.500793249395105e+02, 7.585204649240183e+02, 7.659396264169146e+02, 7.725954042471931e+02, - 7.786542504014960e+02, 7.842307823638457e+02, 7.894078584351200e+02, 7.942476308748182e+02, 7.987980961057967e+02, - 8.030972021839211e+02, 8.071755429580018e+02, 8.110581913329490e+02, 8.147659855374395e+02, 8.183164553622611e+02, - 8.217245042128776e+02, 8.250029212073373e+02, 8.281627722876167e+02, 8.312137034770950e+02, 8.341641792094712e+02, - 8.370216719104498e+02, 8.397928144586180e+02, 8.424835240144104e+02, 8.450991035060649e+02, 8.476443254937265e+02, - 8.501235019990894e+02, 8.525405430570637e+02, 8.548990061291433e+02, 8.572021380553524e+02, 8.594529108703987e+02, - 8.616540525406524e+02, 8.638080734705501e+02, 8.659172894648582e+02, 8.679838417056782e+02, 8.700097142021871e+02, - 8.719967490905418e+02, 8.739466600967640e+02, 8.758610444231897e+02, 8.777413932766761e+02, 8.795891012220454e+02, - 8.814054745158161e+02, 8.831917385517360e+02, 8.849490445301460e+02, 8.866784754469608e+02, 8.883810514844469e+02, - 8.900577348745884e+02, 8.917094342961481e+02, 8.933370088584296e+02, 8.949412717177785e+02, 8.965229933669684e+02, - 8.980829046325614e+02, 8.996216994110034e+02, 9.011400371704607e+02, 9.026385452422234e+02, 9.041178209226665e+02, - 9.055784334043824e+02, 9.070209255529638e+02, 9.084458155440967e+02, 9.098535983740153e+02, 9.112447472549592e+02, - 9.126197149060424e+02, 9.139789347488544e+02, 9.153228220161616e+02, 9.166517747812137e+02, 9.179661749144321e+02, - 9.192663889735641e+02, 9.205527690328311e+02, 9.218256534560314e+02, 9.230853676181207e+02, 9.243322245793570e+02, - 9.255665257157275e+02, 9.267885613090406e+02, 9.279986110997476e+02, 9.291969448053228e+02, 9.303838226067351e+02, - 9.315594956053791e+02, 9.327242062525901e+02, 9.338781887537127e+02, 9.350216694485268e+02, 9.361548671696745e+02, - 9.372779935806146e+02, 9.383912534944999e+02, 9.394948451752596e+02, 9.405889606220869e+02, 9.416737858384084e+02, - 9.427495010863594e+02, 9.438162811276973e+02, 9.448742954520161e+02, 9.459237084933035e+02, 9.469646798371923e+02, - 9.479973644149638e+02, 9.490219126872854e+02, 9.500384708197935e+02, 9.510471808500059e+02, 9.520481808460701e+02, - 9.530416050578235e+02, 9.540275834105041e+02, 9.550062440433321e+02, 9.559777100796402e+02, 9.569421018610075e+02, - 9.578995365651907e+02, 9.588501283195050e+02, 9.597939883090771e+02, 9.607312248802639e+02, 9.616619436394724e+02, - 9.625862475476548e+02, 9.635042370106834e+02, 9.644160099658368e+02, 9.653216619645840e+02, 9.662212862518736e+02, - 9.671149738420843e+02, 9.680028135918342e+02, 9.688848922697742e+02, 9.697612946235356e+02, 9.706321034439705e+02, - 9.714973996268079e+02, 9.723572622318520e+02, 9.732117685398557e+02, 9.740609941212464e+02, 9.749050128309433e+02, - 9.757438969475328e+02, 9.765777171612019e+02, 9.774065426360349e+02, 9.782304410549854e+02, 9.790494786631747e+02, - 9.798637203095852e+02, 9.806732294872294e+02, 9.814780683718535e+02, 9.822782978592437e+02, 9.830739776011977e+02, - 9.838651660402149e+02, 9.846519204429624e+02, 9.854342969325702e+02, 9.862123505198024e+02, 9.869861351331543e+02, - 9.877557036479193e+02, 9.885211078897005e+02, 9.892823987615056e+02, 9.900396261173207e+02, 9.907928388911184e+02, - 9.915420850949547e+02, 9.922874118426738e+02, 9.930288653728448e+02, 9.937664910709550e+02, 9.945003334908885e+02, - 9.952304363757258e+02, 9.959568426778760e+02, 9.966795945785855e+02, 9.973987335068249e+02, 9.981143001576061e+02, - 9.988263345097160e+02, 9.995348758429218e+02, 1.000239962754645e+03, 1.000941633176136e+03, 1.001639924388160e+03, - 1.002334873036211e+03, 1.003026515145289e+03, 1.003714886134223e+03, 1.004400020829592e+03, 1.005081953479223e+03, - 1.005760717765326e+03, 1.006436346817213e+03, 1.007108873223694e+03, 1.007778329045098e+03, 1.008444745824954e+03, - 1.009108154601360e+03, 1.009768585918018e+03, 1.010426069834979e+03, 1.011080635939080e+03, 1.011732313354102e+03, - 1.012381130750651e+03, 1.013027116355767e+03, 1.013670297962285e+03, 1.014310702937932e+03, 1.014948358234196e+03, - 1.015583290394953e+03, 1.016215525564862e+03, 1.016845089497560e+03, 1.017472007563619e+03, 1.018096304758316e+03, - 1.018718005709200e+03, 1.019337134683457e+03, 1.019953715595100e+03, 1.020567772011965e+03, 1.021179327162545e+03, - 1.021788403942639e+03, 1.022395024921848e+03, 1.022999212349903e+03, 1.023600988162836e+03, 1.024200373989013e+03, - 1.024797391154998e+03, 1.025392060716835e+03, 1.025984403362364e+03, 1.026574439573342e+03, 1.027162189525140e+03, - 1.027747673118662e+03, 1.028330909985432e+03, 1.028911918978536e+03, 1.029490720216181e+03, 1.030067332054090e+03, - 1.030641773094760e+03, 1.031214061695008e+03, 1.031784215970373e+03, 1.032352253799441e+03, 1.032918192828060e+03, - 1.033482050473466e+03, 1.034043843928303e+03, 1.034603590164576e+03, 1.035161305937495e+03, 1.035717007789245e+03, - 1.036270712052671e+03, 1.036822434854882e+03, 1.037372192120774e+03, 1.037919999576480e+03, 1.038465872752746e+03, - 1.039009826988230e+03, 1.039551877432732e+03, 1.040092039050360e+03, 1.040630326622623e+03, 1.041166754751459e+03, - 1.041701337862205e+03, 1.042234090206497e+03, 1.042765025865117e+03, 1.043294158750776e+03, 1.043821502610841e+03, - 1.044347071030006e+03, 1.044870877432909e+03, 1.045392935086697e+03, 1.045913257103531e+03, 1.046431856443057e+03, - 1.046948745914806e+03, 1.047463938180563e+03, 1.047977445756686e+03, 1.048489281016364e+03, 1.048999456191854e+03, - 1.049507983376658e+03, 1.050014874527657e+03, 1.050520141467218e+03, 1.051023795885236e+03, 1.051525849341166e+03, - 1.052026313265987e+03, 1.052525198964147e+03, 1.053022517615466e+03, 1.053518280277005e+03, 1.054012497884886e+03, - 1.054505181256102e+03, 1.054996341090269e+03, 1.055485987971360e+03, 1.055974132369405e+03, 1.056460784642148e+03, - 1.056945955036692e+03, 1.057429653691097e+03, 1.057911890635958e+03, 1.058392675795951e+03, 1.058872018991351e+03, - 1.059349929939524e+03, 1.059826418256390e+03, 1.060301493457862e+03, 1.060775164961253e+03, 1.061247442086671e+03, - 1.061718334058370e+03, 1.062187850006103e+03, 1.062655998966417e+03, 1.063122789883960e+03, 1.063588231612743e+03, - 1.064052332917385e+03, 1.064515102474340e+03, 1.064976548873102e+03, 1.065436680617381e+03, 1.065895506126273e+03, - 1.066353033735399e+03, 1.066809271698025e+03, 1.067264228186172e+03, 1.067717911291696e+03, 1.068170329027357e+03, - 1.068621489327864e+03, 1.069071400050914e+03, 1.069520068978199e+03, 1.069967503816405e+03, 1.070413712198193e+03, - 1.070858701683163e+03, 1.071302479758805e+03, 1.071745053841426e+03, 1.072186431277074e+03, 1.072626619342434e+03, - 1.073065625245724e+03, 1.073503456127562e+03, 1.073940119061829e+03, 1.074375621056514e+03, 1.074809969054543e+03, - 1.075243169934604e+03, 1.075675230511948e+03, 1.076106157539184e+03, 1.076535957707060e+03, 1.076964637645228e+03, - 1.077392203923006e+03, 1.077818663050116e+03, 1.078244021477422e+03, 1.078668285597649e+03, 1.079091461746090e+03, - 1.079513556201313e+03, 1.079934575185844e+03, 1.080354524866844e+03, 1.080773411356780e+03, 1.081191240714080e+03, - 1.081608018943784e+03, 1.082023751998174e+03, 1.082438445777411e+03, 1.082852106130149e+03, 1.083264738854143e+03, - 1.083676349696852e+03, 1.084086944356027e+03, 1.084496528480299e+03, 1.084905107669746e+03, 1.085312687476463e+03, - 1.085719273405118e+03, 1.086124870913500e+03, 1.086529485413058e+03, 1.086933122269442e+03, 1.087335786803016e+03, - 1.087737484289386e+03, 1.088138219959905e+03, 1.088537999002176e+03, 1.088936826560549e+03, 1.089334707736612e+03, - 1.089731647589664e+03, 1.090127651137199e+03, 1.090522723355369e+03, 1.090916869179447e+03, 1.091310093504279e+03, - 1.091702401184736e+03, 1.092093797036155e+03, 1.092484285834776e+03, 1.092873872318166e+03, 1.093262561185652e+03, - 1.093650357098734e+03, 1.094037264681495e+03, 1.094423288521012e+03, 1.094808433167758e+03, 1.095192703135990e+03, - 1.095576102904148e+03, 1.095958636915233e+03, 1.096340309577194e+03, 1.096721125263293e+03, 1.097101088312483e+03, - 1.097480203029767e+03, 1.097858473686561e+03, 1.098235904521046e+03, 1.098612499738519e+03, 1.098988263511741e+03, - 1.099363199981273e+03, 1.099737313255815e+03, 1.100110607412540e+03, 1.100483086497415e+03, 1.100854754525534e+03, - 1.101225615481426e+03, 1.101595673319377e+03, 1.101964931963739e+03, 1.102333395309237e+03, 1.102701067221271e+03, - 1.103067951536214e+03, 1.103434052061709e+03, 1.103799372576959e+03, 1.104163916833015e+03, 1.104527688553060e+03, - 1.104890691432686e+03, 1.105252929140176e+03, 1.105614405316774e+03, 1.105975123576955e+03, 1.106335087508691e+03, - 1.106694300673713e+03, 1.107052766607776e+03, 1.107410488820907e+03, 1.107767470797666e+03, 1.108123715997391e+03, - 1.108479227854447e+03, 1.108834009778469e+03, 1.109188065154605e+03, 1.109541397343752e+03, 1.109894009682790e+03, - 1.110245905484817e+03, 1.110597088039378e+03, 1.110947560612690e+03, 1.111297326447863e+03, 1.111646388765130e+03, - 1.111994750762056e+03, 1.112342415613757e+03, 1.112689386473118e+03, 1.113035666470996e+03, 1.113381258716431e+03, - 1.113726166296855e+03, 1.114070392278291e+03, 1.114413939705555e+03, 1.114756811602454e+03, 1.115099010971985e+03, - 1.115440540796522e+03, 1.115781404038017e+03, 1.116121603638181e+03, 1.116461142518673e+03, 1.116800023581290e+03, - 1.117138249708142e+03, 1.117475823761837e+03, 1.117812748585662e+03, 1.118149027003750e+03, 1.118484661821266e+03, - 1.118819655824572e+03, 1.119154011781397e+03, 1.119487732441013e+03, 1.119820820534391e+03, 1.120153278774373e+03, - 1.120485109855836e+03, 1.120816316455843e+03, 1.121146901233814e+03, 1.121476866831678e+03, 1.121806215874025e+03, - 1.122134950968268e+03, 1.122463074704787e+03, 1.122790589657085e+03, 1.123117498381934e+03, 1.123443803419524e+03, - 1.123769507293604e+03, 1.124094612511632e+03, 1.124419121564914e+03, 1.124743036928744e+03, 1.125066361062544e+03, - 1.125389096410004e+03, 1.125711245399210e+03, 1.126032810442791e+03, 1.126353793938042e+03, 1.126674198267061e+03, - 1.126994025796875e+03, 1.127313278879573e+03, 1.127631959852432e+03, 1.127950071038042e+03, 1.128267614744434e+03, - 1.128584593265198e+03, 1.128901008879610e+03, 1.129216863852750e+03, 1.129532160435625e+03, 1.129846900865281e+03, - 1.130161087364927e+03, 1.130474722144045e+03, 1.130787807398510e+03, 1.131100345310699e+03, 1.131412338049602e+03, - 1.131723787770938e+03, 1.132034696617263e+03, 1.132345066718077e+03, 1.132654900189931e+03, 1.132964199136538e+03, - 1.133272965648871e+03, 1.133581201805275e+03, 1.133888909671565e+03, 1.134196091301131e+03, 1.134502748735035e+03, - 1.134808884002117e+03, 1.135114499119086e+03, 1.135419596090628e+03, 1.135724176909494e+03, 1.136028243556601e+03, - 1.136331798001123e+03, 1.136634842200592e+03, 1.136937378100984e+03, 1.137239407636813e+03, 1.137540932731226e+03 - }, - { - 1.790357353794845e+00, 5.467497762786267e+00, 9.223769064426595e+00, 1.306363720639769e+01, 1.699198714129444e+01, - 2.101417841717759e+01, 2.513611051805647e+01, 2.936430011599800e+01, 3.370597299247665e+01, 3.816917416826316e+01, - 4.276290083525803e+01, 4.749726411510587e+01, 5.238368764053718e+01, 5.743515370830182e+01, 6.266651165759374e+01, - 6.809486876255168e+01, 7.374009221247701e+01, 7.962546319280096e+01, 8.577854319760696e+01, 9.223234286702719e+01, - 9.902693266639693e+01, 1.062117171566220e+02, 1.138487387807767e+02, 1.220176409660805e+02, 1.308234309965059e+02, - 1.404092372126969e+02, 1.509786193955294e+02, 1.628378760678107e+02, 1.764856437045852e+02, 1.928360274620348e+02, - 2.139463080793848e+02, 7.302618034821361e+02, 7.410913461504847e+02, 7.501805456121971e+02, 7.580916656664427e+02, - 7.651397216991020e+02, 7.715222822428424e+02, 7.773727951899780e+02, 7.827863008478756e+02, 7.878332439408063e+02, - 7.925674982878143e+02, 7.970313171255708e+02, 8.012585355114339e+02, 8.052767237662958e+02, 8.091086829823822e+02, - 8.127735123508019e+02, 8.162873889646755e+02, 8.196641492696912e+02, 8.229157304249655e+02, 8.260525106571039e+02, - 8.290835754394329e+02, 8.320169283013951e+02, 8.348596596928119e+02, 8.376180836474199e+02, 8.402978494259564e+02, - 8.429040335026779e+02, 8.454412159527121e+02, 8.479135443448974e+02, 8.503247875409636e+02, 8.526783812758913e+02, - 8.549774669968315e+02, 8.572249251346024e+02, 8.594234037480176e+02, 8.615753432996540e+02, 8.636829981792456e+02, - 8.657484554784927e+02, 8.677736514316069e+02, 8.697603858643236e+02, 8.717103349363485e+02, 8.736250624154349e+02, - 8.755060296830901e+02, 8.773546046406682e+02, 8.791720696587238e+02, 8.809596286912819e+02, 8.827184136587832e+02, - 8.844494901887210e+02, 8.861538627904781e+02, 8.878324795304097e+02, 8.894862362643362e+02, 8.911159804770925e+02, - 8.927225147723631e+02, 8.943066000505495e+02, 8.958689584077581e+02, 8.974102757848981e+02, 8.989312043924674e+02, - 9.004323649335408e+02, 9.019143486449003e+02, 9.033777191739661e+02, 9.048230143071994e+02, 9.062507475639479e+02, - 9.076614096681658e+02, 9.090554699091354e+02, 9.104333774011220e+02, 9.117955622509065e+02, 9.131424366411856e+02, - 9.144743958370591e+02, 9.157918191220987e+02, 9.170950706698536e+02, 9.183845003560978e+02, 9.196604445166174e+02, - 9.209232266548738e+02, 9.221731581035018e+02, 9.234105386432302e+02, 9.246356570824803e+02, 9.258487918006288e+02, - 9.270502112576454e+02, 9.282401744725927e+02, 9.294189314732459e+02, 9.305867237189240e+02, 9.317437844984292e+02, - 9.328903393048469e+02, 9.340266061888083e+02, 9.351527960916999e+02, 9.362691131601741e+02, 9.373757550432146e+02, - 9.384729131729149e+02, 9.395607730300400e+02, 9.406395143953514e+02, 9.417093116488471e+02, 9.427703336898326e+02, - 9.438227447650812e+02, 9.448667040576076e+02, 9.459023661849387e+02, 9.469298813207234e+02, 9.479493953684940e+02, - 9.489610501268850e+02, 9.499649830460452e+02, 9.509613286585550e+02, 9.519502173868092e+02, 9.529317759444248e+02, - 9.539061278109959e+02, 9.548733931988289e+02, 9.558336891707286e+02, 9.567871297524110e+02, 9.577338260398864e+02, - 9.586738863020373e+02, 9.596074160786783e+02, 9.605345182743234e+02, 9.614552932478944e+02, 9.623698388985713e+02, - 9.632782507479961e+02, 9.641806220190105e+02, 9.650770437110942e+02, 9.659676046726906e+02, 9.668523916705514e+02, - 9.677314894562701e+02, 9.686049808301171e+02, 9.694729467023319e+02, 9.703354661519778e+02, 9.711926164977807e+02, - 9.720444732939287e+02, 9.728911104722634e+02, 9.737326003309943e+02, 9.745690135988144e+02, 9.754004194813895e+02, - 9.762268857061091e+02, 9.770484785651770e+02, 9.778652629571114e+02, 9.786773024267310e+02, 9.794846592036823e+02, - 9.802873942395875e+02, 9.810855672438646e+02, 9.818792367182695e+02, 9.826684599902361e+02, 9.834532932450387e+02, - 9.842337915320074e+02, 9.850100088956282e+02, 9.857819982500629e+02, 9.865498115120344e+02, 9.873134996011172e+02, - 9.880731124658772e+02, 9.888286991091350e+02, 9.895803076124012e+02, 9.903279851595108e+02, 9.910717780594911e+02, - 9.918117317686898e+02, 9.925478909121981e+02, 9.932802993045868e+02, 9.940089999699928e+02, 9.947340351615723e+02, - 9.954554463803464e+02, 9.961732743934667e+02, 9.968875592519179e+02, 9.975983403076767e+02, 9.983056562303527e+02, - 9.990095450233284e+02, 9.997100440394133e+02, 1.000407189996031e+03, 1.001101018989964e+03, 1.001791566511654e+03, - 1.002478867459093e+03, 1.003162956151312e+03, 1.003843866341474e+03, 1.004521631229599e+03, 1.005196283474917e+03, - 1.005867855207884e+03, 1.006536378041849e+03, 1.007201883084401e+03, 1.007864400948400e+03, 1.008523961762696e+03, - 1.009180595182565e+03, 1.009834330399854e+03, 1.010485196152846e+03, 1.011133220735871e+03, 1.011778432008645e+03, - 1.012420857405373e+03, 1.013060523943599e+03, 1.013697458232832e+03, 1.014331686482940e+03, 1.014963234512328e+03, - 1.015592127755902e+03, 1.016218391272830e+03, 1.016842049754101e+03, 1.017463127529896e+03, 1.018081648576763e+03, - 1.018697636524627e+03, 1.019311114663605e+03, 1.019922105975289e+03, 1.020530633039634e+03, 1.021136718192396e+03, - 1.021740383429396e+03, 1.022341650438311e+03, 1.022940540604567e+03, 1.023537075017060e+03, 1.024131274473767e+03, - 1.024723159487196e+03, 1.025312749791936e+03, 1.025900066323758e+03, 1.026485128289402e+03, 1.027067955111608e+03, - 1.027648565953093e+03, 1.028226979721287e+03, 1.028803215072960e+03, 1.029377290418742e+03, 1.029949223927543e+03, - 1.030519033530871e+03, 1.031086736927049e+03, 1.031652351585345e+03, 1.032215894749997e+03, 1.032777383444166e+03, - 1.033336834473779e+03, 1.033894264431311e+03, 1.034449689699462e+03, 1.035003126454771e+03, 1.035554590671138e+03, - 1.036104098123281e+03, 1.036651664390109e+03, 1.037197304858029e+03, 1.037741034724177e+03, 1.038282868999588e+03, - 1.038822822512289e+03, 1.039360909910335e+03, 1.039897145664776e+03, 1.040431544072569e+03, 1.040964119259417e+03, - 1.041494885182564e+03, 1.042023855633519e+03, 1.042551044240739e+03, 1.043076464472239e+03, 1.043600129638164e+03, - 1.044122052893302e+03, 1.044642247239548e+03, 1.045160725528320e+03, 1.045677500462920e+03, 1.046192584600859e+03, - 1.046705990356126e+03, 1.047217730001419e+03, 1.047727815670324e+03, 1.048236259359465e+03, 1.048743072930597e+03, - 1.049248268112667e+03, 1.049751856503834e+03, 1.050253849573450e+03, 1.050754258664002e+03, 1.051253094993018e+03, - 1.051750369654932e+03, 1.052246093622927e+03, 1.052740277750724e+03, 1.053232932774356e+03, 1.053724069313894e+03, - 1.054213697875153e+03, 1.054701828851355e+03, 1.055188472524773e+03, 1.055673639068333e+03, 1.056157338547196e+03, - 1.056639580920305e+03, 1.057120376041908e+03, 1.057599733663053e+03, 1.058077663433050e+03, 1.058554174900918e+03, - 1.059029277516793e+03, 1.059502980633321e+03, 1.059975293507021e+03, 1.060446225299628e+03, 1.060915785079410e+03, - 1.061383981822455e+03, 1.061850824413952e+03, 1.062316321649432e+03, 1.062780482235999e+03, 1.063243314793537e+03, - 1.063704827855890e+03, 1.064165029872032e+03, 1.064623929207211e+03, 1.065081534144072e+03, 1.065537852883764e+03, - 1.065992893547030e+03, 1.066446664175273e+03, 1.066899172731608e+03, 1.067350427101897e+03, 1.067800435095764e+03, - 1.068249204447593e+03, 1.068696742817513e+03, 1.069143057792367e+03, 1.069588156886656e+03, 1.070032047543480e+03, - 1.070474737135455e+03, 1.070916232965619e+03, 1.071356542268319e+03, 1.071795672210094e+03, 1.072233629890530e+03, - 1.072670422343110e+03, 1.073106056536046e+03, 1.073540539373108e+03, 1.073973877694419e+03, 1.074406078277264e+03, - 1.074837147836860e+03, 1.075267093027134e+03, 1.075695920441482e+03, 1.076123636613508e+03, 1.076550248017765e+03, - 1.076975761070477e+03, 1.077400182130250e+03, 1.077823517498771e+03, 1.078245773421506e+03, 1.078666956088371e+03, - 1.079087071634404e+03, 1.079506126140427e+03, 1.079924125633694e+03, 1.080341076088528e+03, 1.080756983426951e+03, - 1.081171853519309e+03, 1.081585692184875e+03, 1.081998505192460e+03, 1.082410298260998e+03, 1.082821077060134e+03, - 1.083230847210798e+03, 1.083639614285773e+03, 1.084047383810253e+03, 1.084454161262393e+03, 1.084859952073853e+03, - 1.085264761630331e+03, 1.085668595272089e+03, 1.086071458294474e+03, 1.086473355948429e+03, 1.086874293440996e+03, - 1.087274275935815e+03, 1.087673308553613e+03, 1.088071396372686e+03, 1.088468544429375e+03, 1.088864757718539e+03, - 1.089260041194012e+03, 1.089654399769063e+03, 1.090047838316847e+03, 1.090440361670842e+03, 1.090831974625293e+03, - 1.091222681935642e+03, 1.091612488318949e+03, 1.092001398454316e+03, 1.092389416983299e+03, 1.092776548510313e+03, - 1.093162797603041e+03, 1.093548168792823e+03, 1.093932666575053e+03, 1.094316295409562e+03, 1.094699059720999e+03, - 1.095080963899212e+03, 1.095462012299608e+03, 1.095842209243526e+03, 1.096221559018600e+03, 1.096600065879108e+03, - 1.096977734046326e+03, 1.097354567708876e+03, 1.097730571023067e+03, 1.098105748113230e+03, 1.098480103072056e+03, - 1.098853639960917e+03, 1.099226362810201e+03, 1.099598275619620e+03, 1.099969382358533e+03, 1.100339686966257e+03, - 1.100709193352375e+03, 1.101077905397037e+03, 1.101445826951261e+03, 1.101812961837230e+03, 1.102179313848584e+03, - 1.102544886750708e+03, 1.102909684281015e+03, 1.103273710149231e+03, 1.103636968037667e+03, 1.103999461601501e+03, - 1.104361194469039e+03, 1.104722170241989e+03, 1.105082392495725e+03, 1.105441864779543e+03, 1.105800590616919e+03, - 1.106158573505769e+03, 1.106515816918693e+03, 1.106872324303225e+03, 1.107228099082079e+03, 1.107583144653390e+03, - 1.107937464390952e+03, 1.108291061644456e+03, 1.108643939739718e+03, 1.108996101978918e+03, 1.109347551640815e+03, - 1.109698291980983e+03, 1.110048326232028e+03, 1.110397657603806e+03, 1.110746289283641e+03, 1.111094224436538e+03, - 1.111441466205398e+03, 1.111788017711221e+03, 1.112133882053316e+03, 1.112479062309505e+03, 1.112823561536323e+03, - 1.113167382769219e+03, 1.113510529022749e+03, 1.113853003290775e+03, 1.114194808546654e+03, 1.114535947743431e+03, - 1.114876423814021e+03, 1.115216239671401e+03, 1.115555398208788e+03, 1.115893902299828e+03, 1.116231754798761e+03, - 1.116568958540616e+03, 1.116905516341370e+03, 1.117241430998131e+03, 1.117576705289306e+03, 1.117911341974766e+03, - 1.118245343796024e+03, 1.118578713476387e+03, 1.118911453721128e+03, 1.119243567217644e+03, 1.119575056635620e+03, - 1.119905924627179e+03, 1.120236173827044e+03, 1.120565806852696e+03, 1.120894826304516e+03, 1.121223234765943e+03, - 1.121551034803622e+03, 1.121878228967553e+03, 1.122204819791235e+03, 1.122530809791809e+03, 1.122856201470205e+03, - 1.123180997311279e+03, 1.123505199783954e+03, 1.123828811341361e+03, 1.124151834420970e+03, 1.124474271444731e+03, - 1.124796124819201e+03, 1.125117396935685e+03, 1.125438090170358e+03, 1.125758206884398e+03, 1.126077749424117e+03, - 1.126396720121081e+03, 1.126715121292240e+03, 1.127032955240053e+03, 1.127350224252604e+03, 1.127666930603730e+03, - 1.127983076553138e+03, 1.128298664346525e+03, 1.128613696215691e+03, 1.128928174378662e+03, 1.129242101039801e+03, - 1.129555478389921e+03, 1.129868308606400e+03, 1.130180593853290e+03, 1.130492336281429e+03, 1.130803538028552e+03, - 1.131114201219392e+03, 1.131424327965794e+03, 1.131733920366817e+03, 1.132042980508841e+03, 1.132351510465665e+03, - 1.132659512298619e+03, 1.132966988056656e+03, 1.133273939776459e+03, 1.133580369482533e+03, 1.133886279187314e+03, - 1.134191670891256e+03, 1.134496546582933e+03, 1.134800908239132e+03, 1.135104757824952e+03, 1.135408097293888e+03 - }, - { - 1.784128137737149e+00, 5.447817612638968e+00, 9.189394945402508e+00, 1.301319068276671e+01, 1.692393502464531e+01, - 2.092680988894299e+01, 2.502750993056841e+01, 2.923231445913096e+01, 3.354817272437052e+01, 3.798280572234996e+01, - 4.254482859230704e+01, 4.724389891085903e+01, 5.209089788109560e+01, 5.709815375699551e+01, 6.227972013831053e+01, - 6.765172647978235e+01, 7.323282500898418e+01, 7.904476841139990e+01, 8.511316805641117e+01, 9.146850649594452e+01, - 9.814751624617556e+01, 1.051950999732374e+02, 1.126670750756091e+02, 1.206342179476226e+02, 1.291884430403934e+02, - 1.384526672002441e+02, 1.485974351486633e+02, 1.598709471374148e+02, 1.726584929797579e+02, 1.876161751446942e+02, - 2.060368813032386e+02, 2.312793329273013e+02, 7.200888616262192e+02, 7.319416134778551e+02, 7.417307879594317e+02, - 7.501642780614142e+02, 7.576240206252805e+02, 7.643434817359722e+02, 7.704773843907412e+02, 7.761343065469871e+02, - 7.813937843614359e+02, 7.863160631987325e+02, 7.909480194802480e+02, 7.953269411402308e+02, 7.994830410066404e+02, - 8.034411851215641e+02, 8.072221156180166e+02, 8.108433374080104e+02, 8.143197749061239e+02, 8.176642675658613e+02, - 8.208879499877705e+02, 8.240005477818443e+02, 8.270106108907581e+02, 8.299256997745460e+02, 8.327525355724613e+02, - 8.354971223904631e+02, 8.381648477726766e+02, 8.407605659196262e+02, 8.432886671306239e+02, 8.457531361495375e+02, - 8.481576014990246e+02, 8.505053774411418e+02, 8.527994998621625e+02, 8.550427571182039e+02, 8.572377166759447e+02, - 8.593867482245221e+02, 8.614920438101761e+02, 8.635556354463706e+02, 8.655794105731588e+02, 8.675651256760794e+02, - 8.695144183234750e+02, 8.714288178393106e+02, 8.733097547943360e+02, 8.751585694703192e+02, 8.769765194287359e+02, - 8.787647862960223e+02, 8.805244818613579e+02, 8.822566535693835e+02, 8.839622894789543e+02, 8.856423227493690e+02, - 8.872976357074052e+02, 8.889290635415546e+02, 8.905373976639439e+02, 8.921233887753576e+02, 8.936877496644477e+02, - 8.952311577684477e+02, 8.967542575194909e+02, 8.982576624978193e+02, 8.997419574107325e+02, 9.012076999140090e+02, - 9.026554222906925e+02, 9.040856330004789e+02, 9.054988181115656e+02, 9.068954426255369e+02, 9.082759517047912e+02, - 9.096407718110082e+02, 9.109903117623311e+02, 9.123249637161641e+02, 9.136451040837921e+02, 9.149510943824620e+02, - 9.162432820300033e+02, 9.175220010866001e+02, 9.187875729479002e+02, 9.200403069932519e+02, 9.212805011925426e+02, - 9.225084426747677e+02, 9.237244082612212e+02, 9.249286649659293e+02, 9.261214704657061e+02, 9.273030735420581e+02, - 9.284737144969288e+02, 9.296336255441300e+02, 9.307830311781685e+02, 9.319221485220141e+02, 9.330511876552470e+02, - 9.341703519239090e+02, 9.352798382332741e+02, 9.363798373246618e+02, 9.374705340373368e+02, 9.385521075564899e+02, - 9.396247316496685e+02, 9.406885748901230e+02, 9.417438008662858e+02, 9.427905683819802e+02, 9.438290316466404e+02, - 9.448593404560210e+02, 9.458816403639780e+02, 9.468960723858989e+02, 9.479027746519915e+02, 9.489018809258141e+02, - 9.498935211838592e+02, 9.508778220623093e+02, 9.518549068255717e+02, 9.528248954885123e+02, 9.537879049331106e+02, - 9.547440490198381e+02, 9.556934386940462e+02, 9.566361820876405e+02, 9.575723846162803e+02, 9.585021490723520e+02, - 9.594255757139236e+02, 9.603427623499022e+02, 9.612538044215743e+02, 9.621587950807351e+02, 9.630578252645477e+02, - 9.639509837673334e+02, 9.648383573094060e+02, 9.657200306031317e+02, 9.665960864163213e+02, 9.674666056330983e+02, - 9.683316673267390e+02, 9.691913487569939e+02, 9.700457255145186e+02, 9.708948715109354e+02, 9.717388590446338e+02, - 9.725777588487991e+02, 9.734116401376341e+02, 9.742405706508556e+02, 9.750646166965395e+02, 9.758838431923991e+02, - 9.766983137055551e+02, 9.775080904908605e+02, 9.783132345278646e+02, 9.791138055564476e+02, 9.799098620861873e+02, - 9.807014615313764e+02, 9.814886600874603e+02, 9.822715128676456e+02, 9.830500739058070e+02, 9.838243961853209e+02, - 9.845945316669249e+02, 9.853605313156449e+02, 9.861224451268215e+02, 9.868803221512757e+02, 9.876342105196538e+02, - 9.883841574659692e+02, 9.891302093503849e+02, 9.898724116812695e+02, 9.906108091365363e+02, 9.913454455843183e+02, - 9.920763641029797e+02, 9.928036070005131e+02, 9.935272158333223e+02, 9.942472314244318e+02, 9.949636938811367e+02, - 9.956766426121142e+02, 9.963861163440135e+02, 9.970921531375549e+02, 9.977947904031398e+02, 9.984940649159996e+02, - 9.991900128308988e+02, 9.998826696964089e+02, 1.000572070468760e+03, 1.001258249525296e+03, 1.001941240677548e+03, - 1.002621077183915e+03, 1.003297791762012e+03, 1.003971416600645e+03, 1.004641983371458e+03, 1.005309523240265e+03, - 1.005974066878053e+03, 1.006635644471682e+03, 1.007294285734312e+03, 1.007950019915519e+03, 1.008602875811152e+03, - 1.009252881772924e+03, 1.009900065717742e+03, 1.010544455136793e+03, 1.011186077104385e+03, 1.011824958286555e+03, - 1.012461124949463e+03, 1.013094602967549e+03, 1.013725417856360e+03, 1.014353594679698e+03, 1.014979158209842e+03, - 1.015602132831909e+03, 1.016222542577097e+03, 1.016840411129675e+03, 1.017455761833805e+03, 1.018068617700189e+03, - 1.018679001412550e+03, 1.019286935333965e+03, 1.019892441513025e+03, 1.020495541689863e+03, 1.021096257302017e+03, - 1.021694609490174e+03, 1.022290618605680e+03, 1.022884306190824e+03, 1.023475692047790e+03, 1.024064796184456e+03, - 1.024651638338515e+03, 1.025236237982444e+03, 1.025818614328341e+03, 1.026398786332672e+03, 1.026976772700895e+03, - 1.027552591891977e+03, 1.028126262122814e+03, 1.028697801372552e+03, 1.029267227386802e+03, 1.029834557681768e+03, - 1.030399809548277e+03, 1.030963000055726e+03, 1.031524146055935e+03, 1.032083264186918e+03, 1.032640370876573e+03, - 1.033195482346286e+03, 1.033748614614463e+03, 1.034299783499981e+03, 1.034849004625567e+03, 1.035396293421104e+03, - 1.035941665126865e+03, 1.036485134796682e+03, 1.037026717301045e+03, 1.037566427330134e+03, 1.038104279396792e+03, - 1.038640287839435e+03, 1.039174466824897e+03, 1.039706830351226e+03, 1.040237392250406e+03, 1.040766166191043e+03, - 1.041293165680983e+03, 1.041818404069879e+03, 1.042341894551710e+03, 1.042863650167243e+03, 1.043383683806456e+03, - 1.043902008210899e+03, 1.044418635976019e+03, 1.044933579553434e+03, 1.045446851253166e+03, 1.045958463245821e+03, - 1.046468427564742e+03, 1.046976756108102e+03, 1.047483460640973e+03, 1.047988552797341e+03, 1.048492044082094e+03, - 1.048993945872964e+03, 1.049494269422437e+03, 1.049993025859621e+03, 1.050490226192086e+03, 1.050985881307662e+03, - 1.051480001976210e+03, 1.051972598851356e+03, 1.052463682472191e+03, 1.052953263264945e+03, 1.053441351544627e+03, - 1.053927957516632e+03, 1.054413091278326e+03, 1.054896762820594e+03, 1.055378982029364e+03, 1.055859758687105e+03, - 1.056339102474295e+03, 1.056817022970862e+03, 1.057293529657602e+03, 1.057768631917573e+03, 1.058242339037457e+03, - 1.058714660208906e+03, 1.059185604529861e+03, 1.059655181005845e+03, 1.060123398551241e+03, 1.060590265990537e+03, - 1.061055792059562e+03, 1.061519985406689e+03, 1.061982854594023e+03, 1.062444408098570e+03, 1.062904654313384e+03, - 1.063363601548691e+03, 1.063821258032999e+03, 1.064277631914190e+03, 1.064732731260588e+03, 1.065186564062014e+03, - 1.065639138230818e+03, 1.066090461602903e+03, 1.066540541938721e+03, 1.066989386924262e+03, 1.067437004172018e+03, - 1.067883401221942e+03, 1.068328585542379e+03, 1.068772564530987e+03, 1.069215345515651e+03, 1.069656935755370e+03, - 1.070097342441133e+03, 1.070536572696785e+03, 1.070974633579879e+03, 1.071411532082505e+03, 1.071847275132121e+03, - 1.072281869592356e+03, 1.072715322263809e+03, 1.073147639884838e+03, 1.073578829132322e+03, 1.074008896622430e+03, - 1.074437848911365e+03, 1.074865692496099e+03, 1.075292433815101e+03, 1.075718079249051e+03, 1.076142635121538e+03, - 1.076566107699755e+03, 1.076988503195182e+03, 1.077409827764257e+03, 1.077830087509029e+03, 1.078249288477820e+03, - 1.078667436665857e+03, 1.079084538015909e+03, 1.079500598418906e+03, 1.079915623714548e+03, 1.080329619691918e+03, - 1.080742592090066e+03, 1.081154546598599e+03, 1.081565488858260e+03, 1.081975424461492e+03, 1.082384358953001e+03, - 1.082792297830305e+03, 1.083199246544282e+03, 1.083605210499701e+03, 1.084010195055753e+03, 1.084414205526572e+03, - 1.084817247181745e+03, 1.085219325246821e+03, 1.085620444903805e+03, 1.086020611291653e+03, 1.086419829506756e+03, - 1.086818104603414e+03, 1.087215441594308e+03, 1.087611845450968e+03, 1.088007321104226e+03, 1.088401873444665e+03, - 1.088795507323069e+03, 1.089188227550859e+03, 1.089580038900524e+03, 1.089970946106050e+03, 1.090360953863338e+03, - 1.090750066830622e+03, 1.091138289628873e+03, 1.091525626842205e+03, 1.091912083018278e+03, 1.092297662668679e+03, - 1.092682370269317e+03, 1.093066210260806e+03, 1.093449187048839e+03, 1.093831305004556e+03, 1.094212568464917e+03, - 1.094592981733060e+03, 1.094972549078660e+03, 1.095351274738278e+03, 1.095729162915713e+03, 1.096106217782341e+03, - 1.096482443477453e+03, 1.096857844108594e+03, 1.097232423751885e+03, 1.097606186452356e+03, 1.097979136224260e+03, - 1.098351277051396e+03, 1.098722612887414e+03, 1.099093147656131e+03, 1.099462885251834e+03, 1.099831829539575e+03, - 1.100199984355476e+03, 1.100567353507016e+03, 1.100933940773324e+03, 1.101299749905461e+03, 1.101664784626704e+03, - 1.102029048632827e+03, 1.102392545592369e+03, 1.102755279146912e+03, 1.103117252911347e+03, 1.103478470474136e+03, - 1.103838935397577e+03, 1.104198651218061e+03, 1.104557621446323e+03, 1.104915849567700e+03, 1.105273339042375e+03, - 1.105630093305625e+03, 1.105986115768062e+03, 1.106341409815873e+03, 1.106695978811056e+03, 1.107049826091654e+03, - 1.107402954971986e+03, 1.107755368742877e+03, 1.108107070671879e+03, 1.108458064003496e+03, 1.108808351959404e+03, - 1.109157937738667e+03, 1.109506824517953e+03, 1.109855015451747e+03, 1.110202513672557e+03, 1.110549322291121e+03, - 1.110895444396617e+03, 1.111240883056861e+03, 1.111585641318505e+03, 1.111929722207238e+03, 1.112273128727979e+03, - 1.112615863865072e+03, 1.112957930582473e+03, 1.113299331823941e+03, 1.113640070513224e+03, 1.113980149554240e+03, - 1.114319571831264e+03, 1.114658340209101e+03, 1.114996457533270e+03, 1.115333926630176e+03, 1.115670750307285e+03, - 1.116006931353293e+03, 1.116342472538301e+03, 1.116677376613975e+03, 1.117011646313720e+03, 1.117345284352836e+03, - 1.117678293428688e+03, 1.118010676220859e+03, 1.118342435391312e+03, 1.118673573584549e+03, 1.119004093427758e+03, - 1.119333997530976e+03, 1.119663288487232e+03, 1.119991968872704e+03, 1.120320041246860e+03, 1.120647508152609e+03, - 1.120974372116445e+03, 1.121300635648589e+03, 1.121626301243133e+03, 1.121951371378179e+03, 1.122275848515974e+03, - 1.122599735103053e+03, 1.122923033570371e+03, 1.123245746333438e+03, 1.123567875792452e+03, 1.123889424332428e+03, - 1.124210394323332e+03, 1.124530788120205e+03, 1.124850608063291e+03, 1.125169856478166e+03, 1.125488535675858e+03, - 1.125806647952973e+03, 1.126124195591812e+03, 1.126441180860500e+03, 1.126757606013095e+03, 1.127073473289713e+03, - 1.127388784916641e+03, 1.127703543106456e+03, 1.128017750058133e+03, 1.128331407957165e+03, 1.128644518975668e+03, - 1.128957085272498e+03, 1.129269108993355e+03, 1.129580592270896e+03, 1.129891537224836e+03, 1.130201945962063e+03, - 1.130511820576733e+03, 1.130821163150383e+03, 1.131129975752025e+03, 1.131438260438257e+03, 1.131746019253355e+03, - 1.132053254229379e+03, 1.132359967386269e+03, 1.132666160731942e+03, 1.132971836262391e+03, 1.133276995961780e+03 - }, - { - 1.777942882207403e+00, 5.428286118627769e+00, 9.155298516182892e+00, 1.296317975662621e+01, 1.685651077803315e+01, - 2.084030254720316e+01, 2.492005305740344e+01, 2.910181430103813e+01, 3.339227142875285e+01, 3.779883690523879e+01, - 4.232976326997334e+01, 4.699427918056829e+01, 5.180275486819037e+01, 5.676690513079360e+01, 6.190004077364777e+01, - 6.721738334843764e+01, 7.273646371845251e+01, 7.847763330418658e+01, 8.446472933224382e+01, 9.072595451342302e+01, - 9.729506160539736e+01, 1.042129819138394e+02, 1.115301180882636e+02, 1.193096629063413e+02, 1.276325624730369e+02, - 1.366052347071769e+02, 1.463721586349016e+02, 1.571376706598486e+02, 1.692067228189007e+02, 1.830694491768787e+02, - 1.996049724878702e+02, 2.207063241773465e+02, 2.524278211101979e+02, 7.096716840971882e+02, 7.226492715339948e+02, - 7.331882281860643e+02, 7.421722825213556e+02, 7.500611850142686e+02, 7.571291082619841e+02, 7.635544529417624e+02, - 7.694606415023716e+02, 7.749370585385019e+02, 7.800507815198040e+02, 7.848536016447434e+02, 7.893864506222692e+02, - 7.936823124330288e+02, 7.977682070170428e+02, 8.016665823966003e+02, 8.053963168147152e+02, 8.089734562261336e+02, - 8.124117676132771e+02, 8.157231612600975e+02, 8.189180179407922e+02, 8.220054458949400e+02, 8.249934851330432e+02, - 8.278892716677619e+02, 8.306991708587942e+02, 8.334288866718384e+02, 8.360835519521438e+02, 8.386678035849758e+02, - 8.411858455159708e+02, 8.436415019376071e+02, 8.460382624479404e+02, 8.483793206087560e+02, 8.506676070401645e+02, - 8.529058179644718e+02, 8.550964399375410e+02, 8.572417713685800e+02, 8.593439413207194e+02, 8.614049259981246e+02, - 8.634265632559305e+02, 8.654105654131376e+02, 8.673585306030536e+02, 8.692719528585650e+02, 8.711522310989980e+02, - 8.730006771600173e+02, 8.748185229870820e+02, 8.766069270955352e+02, 8.783669803857833e+02, 8.800997113897441e+02, - 8.818060910144083e+02, 8.834870368395551e+02, 8.851434170192563e+02, 8.867760538304046e+02, 8.883857269060986e+02, - 8.899731761870339e+02, 8.915391046200399e+02, 8.930841806294267e+02, 8.946090403838235e+02, 8.961142898785605e+02, - 8.976005068513920e+02, 8.990682425473867e+02, 9.005180233470616e+02, 9.019503522703350e+02, 9.033657103675461e+02, - 9.047645580075896e+02, 9.061473360722172e+02, 9.075144670646124e+02, 9.088663561395472e+02, 9.102033920617129e+02, - 9.115259480981804e+02, 9.128343828503545e+02, 9.141290410303254e+02, 9.154102541860049e+02, 9.166783413790927e+02, - 9.179336098195122e+02, 9.191763554596314e+02, 9.204068635513248e+02, 9.216254091686242e+02, 9.228322576984983e+02, - 9.240276653020718e+02, 9.252118793484140e+02, 9.263851388228243e+02, 9.275476747114228e+02, 9.286997103636656e+02, - 9.298414618343114e+02, 9.309731382062203e+02, 9.320949418952661e+02, 9.332070689385558e+02, 9.343097092670259e+02, - 9.354030469637378e+02, 9.364872605103276e+02, 9.375625230177343e+02, 9.386290024446749e+02, 9.396868618058702e+02, - 9.407362593697205e+02, 9.417773488460484e+02, 9.428102795645153e+02, 9.438351961172967e+02, 9.448522402661330e+02, - 9.458615491235938e+02, 9.468632559468410e+02, 9.478574905439639e+02, 9.488443792459143e+02, 9.498240450332399e+02, - 9.507966076570144e+02, 9.517621837542692e+02, 9.527208869582295e+02, 9.536728280036399e+02, 9.546181148274395e+02, - 9.555568526650261e+02, 9.564891441423515e+02, 9.574150893640609e+02, 9.583347859978765e+02, 9.592483293554245e+02, - 9.601558124696753e+02, 9.610573261691827e+02, 9.619529591492633e+02, 9.628427980402820e+02, 9.637269274731779e+02, - 9.646054301423646e+02, 9.654783868804550e+02, 9.663458766576407e+02, 9.672079767275955e+02, 9.680647626194268e+02, - 9.689163082050466e+02, 9.697626857487487e+02, 9.706039659549119e+02, 9.714402180139184e+02, 9.722715096463558e+02, - 9.730979071455962e+02, 9.739194754188125e+02, 9.747362780265086e+02, 9.755483772206161e+02, 9.763558339579681e+02, - 9.771587080304907e+02, 9.779570579546129e+02, 9.787509411026307e+02, 9.795404137094653e+02, 9.803255309034216e+02, - 9.811063467358766e+02, 9.818829142099742e+02, 9.826552853083444e+02, 9.834235110199006e+02, 9.841876413657428e+02, - 9.849477254242078e+02, 9.857038113550988e+02, 9.864559464231262e+02, 9.872041770205939e+02, 9.879485486893531e+02, - 9.886891061420606e+02, 9.894258932827657e+02, 9.901589532268429e+02, 9.908883283203124e+02, 9.916140601585514e+02, - 9.923361896044388e+02, 9.930547568059385e+02, 9.937698012131472e+02, 9.944813615948332e+02, 9.951894760544748e+02, - 9.958941820458206e+02, 9.965955163879903e+02, 9.972935152801330e+02, 9.979882143156491e+02, 9.986796484960095e+02, - 9.993678522441672e+02, 1.000052859417588e+03, 1.000734703320910e+03, 1.001413416718240e+03, 1.002089031845109e+03, - 1.002761580420088e+03, 1.003431093656084e+03, 1.004097602271324e+03, 1.004761136500026e+03, 1.005421726102801e+03, - 1.006079400376743e+03, 1.006734188165275e+03, 1.007386117867710e+03, 1.008035217472528e+03, 1.008681514469466e+03, - 1.009325036005542e+03, 1.009965808794324e+03, 1.010603859149435e+03, 1.011239212992712e+03, 1.011871895862145e+03, - 1.012501932919615e+03, 1.013129348958434e+03, 1.013754168410695e+03, 1.014376415354436e+03, 1.014996113520620e+03, - 1.015613286299949e+03, 1.016227956749501e+03, 1.016840147599204e+03, 1.017449881258157e+03, 1.018057179820787e+03, - 1.018662065072866e+03, 1.019264557999529e+03, 1.019864680764712e+03, 1.020462453782305e+03, 1.021057897660723e+03, - 1.021651032727688e+03, 1.022241879035425e+03, 1.022830456365744e+03, 1.023416784234998e+03, 1.024000881898927e+03, - 1.024582768357391e+03, 1.025162462358997e+03, 1.025739982405610e+03, 1.026315346756777e+03, 1.026888573434035e+03, - 1.027459680225132e+03, 1.028028684688151e+03, 1.028595604155538e+03, 1.029160455738047e+03, 1.029723256328592e+03, - 1.030284022606017e+03, 1.030842771038786e+03, 1.031399517888584e+03, 1.031954279213851e+03, 1.032507070873229e+03, - 1.033057908528944e+03, 1.033606807650110e+03, 1.034153783515965e+03, 1.034698851219034e+03, 1.035242025668234e+03, - 1.035783321591905e+03, 1.036322753540784e+03, 1.036860335890911e+03, 1.037396082846479e+03, 1.037930008442627e+03, - 1.038462126548168e+03, 1.038992450868272e+03, 1.039520994947081e+03, 1.040047772170283e+03, 1.040572795767632e+03, - 1.041096078815404e+03, 1.041617634238829e+03, 1.042137474814450e+03, 1.042655613172446e+03, 1.043172061798913e+03, - 1.043686833038091e+03, 1.044199939094555e+03, 1.044711392035356e+03, 1.045221203792131e+03, 1.045729386163157e+03, - 1.046235950815384e+03, 1.046740909286409e+03, 1.047244272986430e+03, 1.047746053200152e+03, 1.048246261088658e+03, - 1.048744907691252e+03, 1.049242003927258e+03, 1.049737560597788e+03, 1.050231588387485e+03, 1.050724097866218e+03, - 1.051215099490763e+03, 1.051704603606440e+03, 1.052192620448723e+03, 1.052679160144829e+03, 1.053164232715262e+03, - 1.053647848075348e+03, 1.054130016036725e+03, 1.054610746308815e+03, 1.055090048500273e+03, 1.055567932120400e+03, - 1.056044406580535e+03, 1.056519481195431e+03, 1.056993165184593e+03, 1.057465467673600e+03, 1.057936397695404e+03, - 1.058405964191603e+03, 1.058874176013695e+03, 1.059341041924306e+03, 1.059806570598407e+03, 1.060270770624492e+03, - 1.060733650505758e+03, 1.061195218661244e+03, 1.061655483426965e+03, 1.062114453057023e+03, 1.062572135724692e+03, - 1.063028539523498e+03, 1.063483672468268e+03, 1.063937542496171e+03, 1.064390157467737e+03, 1.064841525167856e+03, - 1.065291653306770e+03, 1.065740549521041e+03, 1.066188221374503e+03, 1.066634676359205e+03, 1.067079921896327e+03, - 1.067523965337096e+03, 1.067966813963675e+03, 1.068408474990045e+03, 1.068848955562866e+03, 1.069288262762332e+03, - 1.069726403603005e+03, 1.070163385034644e+03, 1.070599213943009e+03, 1.071033897150667e+03, 1.071467441417772e+03, - 1.071899853442841e+03, 1.072331139863515e+03, 1.072761307257309e+03, 1.073190362142344e+03, 1.073618310978083e+03, - 1.074045160166040e+03, 1.074470916050483e+03, 1.074895584919132e+03, 1.075319173003837e+03, 1.075741686481254e+03, - 1.076163131473502e+03, 1.076583514048823e+03, 1.077002840222214e+03, 1.077421115956070e+03, 1.077838347160799e+03, - 1.078254539695439e+03, 1.078669699368262e+03, 1.079083831937369e+03, 1.079496943111278e+03, 1.079909038549503e+03, - 1.080320123863119e+03, 1.080730204615328e+03, 1.081139286322009e+03, 1.081547374452265e+03, 1.081954474428958e+03, - 1.082360591629241e+03, 1.082765731385075e+03, 1.083169898983749e+03, 1.083573099668381e+03, 1.083975338638420e+03, - 1.084376621050140e+03, 1.084776952017122e+03, 1.085176336610734e+03, 1.085574779860603e+03, 1.085972286755080e+03, - 1.086368862241697e+03, 1.086764511227619e+03, 1.087159238580091e+03, 1.087553049126880e+03, 1.087945947656701e+03, - 1.088337938919651e+03, 1.088729027627629e+03, 1.089119218454750e+03, 1.089508516037755e+03, 1.089896924976418e+03, - 1.090284449833941e+03, 1.090671095137351e+03, 1.091056865377887e+03, 1.091441765011380e+03, 1.091825798458633e+03, - 1.092208970105797e+03, 1.092591284304729e+03, 1.092972745373368e+03, 1.093353357596077e+03, 1.093733125224011e+03, - 1.094112052475457e+03, 1.094490143536176e+03, 1.094867402559750e+03, 1.095243833667910e+03, 1.095619440950870e+03, - 1.095994228467651e+03, 1.096368200246402e+03, 1.096741360284721e+03, 1.097113712549966e+03, 1.097485260979566e+03, - 1.097856009481321e+03, 1.098225961933712e+03, 1.098595122186194e+03, 1.098963494059487e+03, 1.099331081345872e+03, - 1.099697887809473e+03, 1.100063917186542e+03, 1.100429173185736e+03, 1.100793659488396e+03, 1.101157379748814e+03, - 1.101520337594509e+03, 1.101882536626483e+03, 1.102243980419490e+03, 1.102604672522295e+03, 1.102964616457924e+03, - 1.103323815723922e+03, 1.103682273792599e+03, 1.104039994111277e+03, 1.104396980102533e+03, 1.104753235164441e+03, - 1.105108762670805e+03, 1.105463565971398e+03, 1.105817648392191e+03, 1.106171013235582e+03, 1.106523663780621e+03, - 1.106875603283234e+03, 1.107226834976447e+03, 1.107577362070595e+03, 1.107927187753547e+03, 1.108276315190911e+03, - 1.108624747526250e+03, 1.108972487881286e+03, 1.109319539356105e+03, 1.109665905029361e+03, 1.110011587958477e+03, - 1.110356591179841e+03, 1.110700917709003e+03, 1.111044570540868e+03, 1.111387552649885e+03, 1.111729866990241e+03, - 1.112071516496042e+03, 1.112412504081501e+03, 1.112752832641118e+03, 1.113092505049863e+03, 1.113431524163351e+03, - 1.113769892818020e+03, 1.114107613831306e+03, 1.114444690001811e+03, 1.114781124109479e+03, 1.115116918915760e+03, - 1.115452077163775e+03, 1.115786601578486e+03, 1.116120494866853e+03, 1.116453759717999e+03, 1.116786398803366e+03, - 1.117118414776870e+03, 1.117449810275063e+03, 1.117780587917282e+03, 1.118110750305801e+03, 1.118440300025982e+03, - 1.118769239646425e+03, 1.119097571719110e+03, 1.119425298779547e+03, 1.119752423346922e+03, 1.120078947924231e+03, - 1.120404874998424e+03, 1.120730207040550e+03, 1.121054946505884e+03, 1.121379095834071e+03, 1.121702657449260e+03, - 1.122025633760229e+03, 1.122348027160527e+03, 1.122669840028599e+03, 1.122991074727914e+03, 1.123311733607095e+03, - 1.123631819000043e+03, 1.123951333226063e+03, 1.124270278589986e+03, 1.124588657382294e+03, 1.124906471879236e+03, - 1.125223724342952e+03, 1.125540417021587e+03, 1.125856552149412e+03, 1.126172131946940e+03, 1.126487158621032e+03, - 1.126801634365023e+03, 1.127115561358826e+03, 1.127428941769042e+03, 1.127741777749076e+03, 1.128054071439240e+03, - 1.128365824966863e+03, 1.128677040446400e+03, 1.128987719979529e+03, 1.129297865655265e+03, 1.129607479550057e+03, - 1.129916563727892e+03, 1.130225120240397e+03, 1.130533151126935e+03, 1.130840658414709e+03, 1.131147644118858e+03 - }, - { - 1.771801111626728e+00, 5.408901484923344e+00, 9.121476066451514e+00, 1.291359803615823e+01, 1.678970433662002e+01, - 2.075464137159469e+01, 2.481371825706919e+01, 2.897276921103781e+01, 3.323822705190988e+01, 3.761721031840201e+01, - 4.211762720935092e+01, 4.674830046990809e+01, 5.151911859788451e+01, 5.644122044680288e+01, 6.152722265739238e+01, - 6.679150265444119e+01, 7.225055465861996e+01, 7.792344300089340e+01, 8.383238714214187e+01, 9.000352808704336e+01, - 9.646794954273483e+01, 1.032630647978712e+02, 1.104345419839553e+02, 1.180390451331968e+02, 1.261482535560900e+02, - 1.348549656702011e+02, 1.442827669485019e+02, 1.546021584874622e+02, 1.660592868291566e+02, 1.790317125507279e+02, - 1.941502756754422e+02, 2.126167593331151e+02, 2.373242298827303e+02, 6.790990805784359e+02, 6.990439746187120e+02, - 7.132408968104803e+02, 7.245741000619931e+02, 7.341331202663666e+02, 7.424658821163131e+02, 7.498917242735298e+02, - 7.566149138725791e+02, 7.627748917365442e+02, 7.684715623158573e+02, 7.737792385156214e+02, 7.787548782005300e+02, - 7.834432192595070e+02, 7.878801244004337e+02, 7.920948404151090e+02, 7.961115717486267e+02, 7.999506056694154e+02, - 8.036291353555642e+02, 8.071618741305355e+02, 8.105615219833329e+02, 8.138391254847097e+02, 8.170043593718502e+02, - 8.200657496380406e+02, 8.230308522984219e+02, 8.259063981222356e+02, 8.286984109160156e+02, 8.314123050240743e+02, - 8.340529663327881e+02, 8.366248200586494e+02, 8.391318878566138e+02, 8.415778362296207e+02, 8.439660178003273e+02, - 8.462995066857416e+02, 8.485811289685522e+02, 8.508134890671312e+02, 8.529989926558003e+02, 8.551398666682575e+02, - 8.572381768225777e+02, 8.592958430305513e+02, 8.613146529931701e+02, 8.632962742345866e+02, 8.652422647865478e+02, - 8.671540827022187e+02, 8.690330945510473e+02, 8.708805830237172e+02, 8.726977537574534e+02, 8.744857414762191e+02, - 8.762456155271670e+02, 8.779783848835721e+02, 8.796850026750907e+02, 8.813663702981922e+02, 8.830233411528241e+02, - 8.846567240455281e+02, 8.862672862942777e+02, 8.878557565659829e+02, 8.894228274739279e+02, 8.909691579592047e+02, - 8.924953754774178e+02, 8.940020780095288e+02, 8.954898359136141e+02, 8.969591936324366e+02, 8.984106712701592e+02, - 8.998447660500830e+02, 9.012619536640591e+02, 9.026626895231302e+02, 9.040474099179680e+02, 9.054165330968451e+02, - 9.067704602680852e+02, 9.081095765332699e+02, 9.094342517569078e+02, 9.107448413776698e+02, 9.120416871658814e+02, - 9.133251179314966e+02, 9.145954501863957e+02, 9.158529887645146e+02, 9.170980274030040e+02, 9.183308492873228e+02, - 9.195517275629348e+02, 9.207609258160411e+02, 9.219586985255834e+02, 9.231452914885525e+02, 9.243209422204930e+02, - 9.254858803329189e+02, 9.266403278892276e+02, 9.277844997405751e+02, 9.289186038430523e+02, 9.300428415574124e+02, - 9.311574079325186e+02, 9.322624919918668e+02, 9.333582770165865e+02, 9.344449403845443e+02, 9.355226547729601e+02, - 9.365915873116835e+02, 9.376519003462569e+02, 9.387037515176697e+02, 9.397472935317431e+02, 9.407826758109278e+02, - 9.418100425329635e+02, 9.428295345782803e+02, 9.438412884988237e+02, 9.448454372864090e+02, 9.458421103496291e+02, - 9.468314336451442e+02, 9.478135298029185e+02, 9.487885182457411e+02, 9.497565153033485e+02, 9.507176343214282e+02, - 9.516719857657965e+02, 9.526196773219916e+02, 9.535608139905302e+02, 9.544954981780566e+02, 9.554238297845867e+02, - 9.563459062870621e+02, 9.572618228193930e+02, 9.581716722491592e+02, 9.590755452511598e+02, 9.599735303779391e+02, - 9.608657141274616e+02, 9.617521810080628e+02, 9.626330136149566e+02, 9.635082926321674e+02, 9.643780969791766e+02, - 9.652425038052833e+02, 9.661015885584299e+02, 9.669554250363400e+02, 9.678040854357109e+02, 9.686476403995623e+02, - 9.694861590628082e+02, 9.703197090961445e+02, 9.711483567483240e+02, 9.719721668636655e+02, 9.727912030158814e+02, - 9.736055274014063e+02, 9.744152009741101e+02, 9.752202834554552e+02, 9.760208333684687e+02, 9.768169080705235e+02, - 9.776085637849973e+02, 9.783958556318310e+02, 9.791788376570553e+02, 9.799575628613162e+02, 9.807320832274394e+02, - 9.815024497470724e+02, 9.822687124464576e+02, 9.830309204113394e+02, 9.837891218110746e+02, 9.845433639219486e+02, - 9.852936931497472e+02, 9.860401550516077e+02, 9.867827943571684e+02, 9.875216549890590e+02, 9.882567800827469e+02, - 9.889882120057603e+02, 9.897159923763240e+02, 9.904401620814223e+02, 9.911607612943016e+02, 9.918778294914567e+02, - 9.925914054690934e+02, 9.933015273591072e+02, 9.940082326445777e+02, 9.947115581748164e+02, 9.954115401799626e+02, - 9.961082142851604e+02, 9.968016155243211e+02, 9.974917783534928e+02, 9.981787366638397e+02, 9.988625237942637e+02, - 9.995431725436562e+02, 1.000220715182818e+03, 1.000895183466035e+03, 1.001566608642215e+03, 1.002235021489557e+03, - 1.002900452231473e+03, 1.003562930690106e+03, 1.004222486200002e+03, 1.004879147642291e+03, 1.005532943454227e+03, - 1.006183901638476e+03, 1.006832049772157e+03, 1.007477415015652e+03, 1.008120024121167e+03, 1.008759903441093e+03, - 1.009397078936133e+03, 1.010031576183225e+03, 1.010663420383267e+03, 1.011292636368639e+03, 1.011919248610536e+03, - 1.012543281226116e+03, 1.013164757985470e+03, 1.013783702318420e+03, 1.014400137321142e+03, 1.015014085762630e+03, - 1.015625570091009e+03, 1.016234611942555e+03, 1.016841234118341e+03, 1.017445457660516e+03, 1.018047303793743e+03, - 1.018646793451118e+03, 1.019243947279612e+03, 1.019838785645393e+03, 1.020431328639023e+03, 1.021021596080522e+03, - 1.021609607524326e+03, 1.022195382264124e+03, 1.022778939337584e+03, 1.023360297530976e+03, 1.023939475383681e+03, - 1.024516491192598e+03, 1.025091363016462e+03, 1.025664108680056e+03, 1.026234745778325e+03, 1.026803291680410e+03, - 1.027369763533580e+03, 1.027934178267091e+03, 1.028496552595945e+03, 1.029056903024578e+03, 1.029615245850462e+03, - 1.030171597167635e+03, 1.030725972870146e+03, 1.031278388655435e+03, 1.031828860027634e+03, 1.032377402300801e+03, - 1.032924030602084e+03, 1.033468759874825e+03, 1.034011604881587e+03, 1.034552580207124e+03, 1.035091700261296e+03, - 1.035628979281908e+03, 1.036164431337509e+03, 1.036698070330114e+03, 1.037229909997889e+03, 1.037759963917769e+03, - 1.038288245508027e+03, 1.038814768030793e+03, 1.039339544594516e+03, 1.039862588156388e+03, 1.040383911524707e+03, - 1.040903527361202e+03, 1.041421448183311e+03, 1.041937686366410e+03, 1.042452254146001e+03, 1.042965163619862e+03, - 1.043476426750141e+03, 1.043986055365432e+03, 1.044494061162788e+03, 1.045000455709710e+03, 1.045505250446093e+03, - 1.046008456686137e+03, 1.046510085620221e+03, 1.047010148316737e+03, 1.047508655723899e+03, 1.048005618671511e+03, - 1.048501047872703e+03, 1.048994953925638e+03, 1.049487347315184e+03, 1.049978238414558e+03, 1.050467637486936e+03, - 1.050955554687039e+03, 1.051442000062686e+03, 1.051926983556318e+03, 1.052410515006500e+03, 1.052892604149392e+03, - 1.053373260620192e+03, 1.053852493954556e+03, 1.054330313589995e+03, 1.054806728867242e+03, 1.055281749031599e+03, - 1.055755383234255e+03, 1.056227640533590e+03, 1.056698529896449e+03, 1.057168060199391e+03, 1.057636240229930e+03, - 1.058103078687739e+03, 1.058568584185842e+03, 1.059032765251785e+03, 1.059495630328782e+03, 1.059957187776852e+03, - 1.060417445873921e+03, 1.060876412816922e+03, 1.061334096722866e+03, 1.061790505629894e+03, 1.062245647498324e+03, - 1.062699530211666e+03, 1.063152161577624e+03, 1.063603549329089e+03, 1.064053701125109e+03, 1.064502624551842e+03, - 1.064950327123498e+03, 1.065396816283258e+03, 1.065842099404196e+03, 1.066286183790159e+03, 1.066729076676654e+03, - 1.067170785231719e+03, 1.067611316556764e+03, 1.068050677687419e+03, 1.068488875594355e+03, 1.068925917184100e+03, - 1.069361809299832e+03, 1.069796558722173e+03, 1.070230172169958e+03, 1.070662656300998e+03, 1.071094017712838e+03, - 1.071524262943482e+03, 1.071953398472135e+03, 1.072381430719909e+03, 1.072808366050532e+03, 1.073234210771042e+03, - 1.073658971132471e+03, 1.074082653330519e+03, 1.074505263506214e+03, 1.074926807746568e+03, 1.075347292085221e+03, - 1.075766722503071e+03, 1.076185104928901e+03, 1.076602445239992e+03, 1.077018749262731e+03, 1.077434022773205e+03, - 1.077848271497789e+03, 1.078261501113727e+03, 1.078673717249700e+03, 1.079084925486391e+03, 1.079495131357036e+03, - 1.079904340347974e+03, 1.080312557899180e+03, 1.080719789404799e+03, 1.081126040213666e+03, 1.081531315629825e+03, - 1.081935620913029e+03, 1.082338961279250e+03, 1.082741341901165e+03, 1.083142767908646e+03, 1.083543244389236e+03, - 1.083942776388627e+03, 1.084341368911118e+03, 1.084739026920082e+03, 1.085135755338417e+03, 1.085531559048986e+03, - 1.085926442895068e+03, 1.086320411680785e+03, 1.086713470171532e+03, 1.087105623094399e+03, 1.087496875138590e+03, - 1.087887230955830e+03, 1.088276695160772e+03, 1.088665272331399e+03, 1.089052967009414e+03, 1.089439783700630e+03, - 1.089825726875358e+03, 1.090210800968778e+03, 1.090595010381318e+03, 1.090978359479020e+03, 1.091360852593906e+03, - 1.091742494024332e+03, 1.092123288035345e+03, 1.092503238859034e+03, 1.092882350694867e+03, 1.093260627710039e+03, - 1.093638074039806e+03, 1.094014693787813e+03, 1.094390491026420e+03, 1.094765469797029e+03, 1.095139634110401e+03, - 1.095512987946968e+03, 1.095885535257143e+03, 1.096257279961631e+03, 1.096628225951723e+03, 1.096998377089602e+03, - 1.097367737208635e+03, 1.097736310113662e+03, 1.098104099581282e+03, 1.098471109360141e+03, 1.098837343171211e+03, - 1.099202804708059e+03, 1.099567497637131e+03, 1.099931425598013e+03, 1.100294592203699e+03, 1.100657001040857e+03, - 1.101018655670083e+03, 1.101379559626161e+03, 1.101739716418315e+03, 1.102099129530458e+03, 1.102457802421442e+03, - 1.102815738525296e+03, 1.103172941251472e+03, 1.103529413985079e+03, 1.103885160087122e+03, 1.104240182894731e+03, - 1.104594485721391e+03, 1.104948071857168e+03, 1.105300944568934e+03, 1.105653107100586e+03, 1.106004562673268e+03, - 1.106355314485581e+03, 1.106705365713804e+03, 1.107054719512095e+03, 1.107403379012709e+03, 1.107751347326196e+03, - 1.108098627541609e+03, 1.108445222726702e+03, 1.108791135928129e+03, 1.109136370171643e+03, 1.109480928462285e+03, - 1.109824813784579e+03, 1.110168029102720e+03, 1.110510577360762e+03, 1.110852461482803e+03, 1.111193684373166e+03, - 1.111534248916581e+03, 1.111874157978364e+03, 1.112213414404594e+03, 1.112552021022286e+03, 1.112889980639564e+03, - 1.113227296045831e+03, 1.113563970011941e+03, 1.113900005290360e+03, 1.114235404615337e+03, 1.114570170703063e+03, - 1.114904306251831e+03, 1.115237813942200e+03, 1.115570696437150e+03, 1.115902956382237e+03, 1.116234596405746e+03, - 1.116565619118849e+03, 1.116896027115748e+03, 1.117225822973829e+03, 1.117555009253810e+03, 1.117883588499881e+03, - 1.118211563239854e+03, 1.118538935985304e+03, 1.118865709231705e+03, 1.119191885458579e+03, 1.119517467129624e+03, - 1.119842456692857e+03, 1.120166856580745e+03, 1.120490669210342e+03, 1.120813896983419e+03, 1.121136542286592e+03, - 1.121458607491454e+03, 1.121780094954707e+03, 1.122101007018277e+03, 1.122421346009452e+03, 1.122741114240996e+03, - 1.123060314011276e+03, 1.123378947604382e+03, 1.123697017290246e+03, 1.124014525324763e+03, 1.124331473949905e+03, - 1.124647865393841e+03, 1.124963701871047e+03, 1.125278985582424e+03, 1.125593718715407e+03, 1.125907903444080e+03, - 1.126221541929281e+03, 1.126534636318718e+03, 1.126847188747070e+03, 1.127159201336095e+03, 1.127470676194743e+03, - 1.127781615419247e+03, 1.128092021093240e+03, 1.128401895287850e+03, 1.128711240061801e+03, 1.129020057461517e+03 - }, - { - 1.765702357486508e+00, 5.389661946818883e+00, 9.087923958744215e+00, 1.286443926932324e+01, 1.672350587905711e+01, - 2.066981173750811e+01, 2.470848450863655e+01, 2.884514970492415e+01, 3.308599895569249e+01, 3.743787065137631e+01, - 4.190834580243521e+01, 4.650586275524100e+01, 5.123985548004623e+01, 5.612092160006851e+01, 6.116102832581466e+01, - 6.637376723440282e+01, 7.177467275366800e+01, 7.738162483897882e+01, 8.321536455901604e+01, 8.930016358013921e+01, - 9.566470725896033e+01, 1.023432803279684e+02, 1.093773912504896e+02, 1.168180495422962e+02, 1.247290451947226e+02, - 1.331918217234719e+02, 1.423129937120476e+02, 1.522364820667242e+02, 1.631642395930380e+02, 1.753942930035297e+02, - 1.893976008030213e+02, 2.059958320166604e+02, 2.268683638713153e+02, 2.566877827685357e+02, 6.657348335675499e+02, - 6.882593411716831e+02, 7.037519829070548e+02, 7.159142689887299e+02, 7.260669078413629e+02, 7.348544721213481e+02, - 7.426450564595893e+02, 7.496705428778206e+02, 7.560873241776071e+02, 7.620063565085974e+02, 7.675095059169084e+02, - 7.726590936660893e+02, 7.775037891000143e+02, 7.820824152228369e+02, 7.864264997652492e+02, 7.905620400127840e+02, - 7.945107571081365e+02, 7.982910086129102e+02, 8.019184661776384e+02, 8.054066279635822e+02, 8.087672123905104e+02, - 8.120104650755843e+02, 8.151454012141174e+02, 8.181799992276768e+02, 8.211213571240439e+02, 8.239758199715358e+02, - 8.267490847429744e+02, 8.294462872454400e+02, 8.320720747334213e+02, 8.346306669795197e+02, 8.371259079633298e+02, - 8.395613098770218e+02, 8.419400907943767e+02, 8.442652070797992e+02, 8.465393814042484e+02, 8.487651270712353e+02, - 8.509447692268653e+02, 8.530804634254803e+02, 8.551742119404449e+02, 8.572278781437549e+02, 8.592431992247024e+02, - 8.612217974744126e+02, 8.631651903274104e+02, 8.650747993221071e+02, 8.669519581178356e+02, 8.687979196858935e+02, - 8.706138627752572e+02, 8.724008977394850e+02, 8.741600717994739e+02, 8.758923738066792e+02, 8.775987385628994e+02, - 8.792800507454641e+02, 8.809371484804838e+02, 8.825708266015088e+02, 8.841818396263707e+02, 8.857709044810675e+02, - 8.873387029961377e+02, 8.888858841980227e+02, 8.904130664153558e+02, 8.919208392178958e+02, 8.934097652038317e+02, - 8.948803816495448e+02, 8.963332020343382e+02, 8.977687174513835e+02, 8.991873979149517e+02, 9.005896935729575e+02, - 9.019760358329646e+02, 9.033468384089679e+02, 9.047024982955678e+02, 9.060433966755218e+02, 9.073698997660726e+02, - 9.086823596089600e+02, 9.099811148085612e+02, 9.112664912222203e+02, 9.125388026064298e+02, 9.137983512222229e+02, - 9.150454284028478e+02, 9.162803150865042e+02, 9.175032823167087e+02, 9.187145917126239e+02, 9.199144959114957e+02, - 9.211032389851783e+02, 9.222810568325339e+02, 9.234481775493903e+02, 9.246048217775789e+02, 9.257512030344448e+02, - 9.268875280241688e+02, 9.280139969338380e+02, 9.291308037468331e+02, 9.302381365023493e+02, 9.313361775101475e+02, - 9.324251024720592e+02, 9.335050843913014e+02, 9.345762890072989e+02, 9.356388779685202e+02, 9.366930077175784e+02, - 9.377388313003887e+02, 9.387764968654792e+02, 9.398061482324952e+02, 9.408279254173508e+02, 9.418419646036090e+02, - 9.428483982850051e+02, 9.438473554013084e+02, 9.448389614679015e+02, 9.458233386994166e+02, 9.468006061277582e+02, - 9.477708797148288e+02, 9.487342724602156e+02, 9.496908945041387e+02, 9.506408532258896e+02, 9.515842533380059e+02, - 9.525211969763980e+02, 9.534517837866473e+02, 9.543761110066566e+02, 9.552942735458462e+02, 9.562063640610698e+02, - 9.571124730294106e+02, 9.580126888180064e+02, 9.589070977510640e+02, 9.597957841880535e+02, 9.606788305286661e+02, - 9.615563173594923e+02, 9.624283234513010e+02, 9.632949258291949e+02, 9.641561998253210e+02, 9.650122191295596e+02, - 9.658630558383145e+02, 9.667087805014545e+02, 9.675494621444456e+02, 9.683851684058957e+02, 9.692159654358052e+02, - 9.700419180336551e+02, 9.708630896624533e+02, 9.716795424862976e+02, 9.724913374066075e+02, 9.732985340970758e+02, - 9.741011910374009e+02, 9.748993655458424e+02, 9.756931138106639e+02, 9.764824909204870e+02, 9.772675508936252e+02, - 9.780483467064215e+02, 9.788249303206427e+02, 9.795973527099569e+02, 9.803656638855416e+02, 9.811299129208498e+02, - 9.818901479755725e+02, 9.826464163188222e+02, 9.833987643515771e+02, 9.841472376284079e+02, 9.848918808785148e+02, - 9.856327380261031e+02, 9.863698522101281e+02, 9.871032658034179e+02, 9.878330204312124e+02, 9.885591569891362e+02, - 9.892817156606191e+02, 9.900007359337934e+02, 9.907162566178868e+02, 9.914283158591165e+02, 9.921369511561256e+02, - 9.928421993749504e+02, 9.935440967635629e+02, 9.942426789659795e+02, 9.949379810359708e+02, 9.956300374737550e+02, - 9.963188821442528e+02, 9.970045484334307e+02, 9.976870691634412e+02, 9.983664766290776e+02, 9.990428026093043e+02, - 9.997160783784818e+02, 1.000386334717270e+03, 1.001053601923241e+03, 1.001717909821200e+03, 1.002379287773227e+03, - 1.003037764688450e+03, 1.003693369032555e+03, 1.004346128837043e+03, 1.004996071708246e+03, 1.005643224836102e+03, - 1.006287615002699e+03, 1.006929268590605e+03, 1.007568211590975e+03, 1.008204469611451e+03, 1.008838067883864e+03, - 1.009469031271737e+03, 1.010097384277595e+03, 1.010723151050100e+03, 1.011346355391004e+03, 1.011967020761919e+03, - 1.012585170290937e+03, 1.013200826283163e+03, 1.013814012192650e+03, 1.014424749706681e+03, 1.015033060682181e+03, - 1.015638966673264e+03, 1.016242488936933e+03, 1.016843648438651e+03, 1.017442465857774e+03, 1.018038961592864e+03, - 1.018633155766866e+03, 1.019225068232176e+03, 1.019814718575582e+03, 1.020402126123095e+03, 1.020987309944665e+03, - 1.021570288858797e+03, 1.022151081437053e+03, 1.022729706008457e+03, 1.023306180663797e+03, 1.023880523259837e+03, - 1.024452751423422e+03, 1.025022882555510e+03, 1.025590933835098e+03, 1.026156922223070e+03, 1.026720864465959e+03, - 1.027282777099628e+03, 1.027842676452866e+03, 1.028400578650915e+03, 1.028956499618910e+03, 1.029510455085259e+03, - 1.030062460584935e+03, 1.030612531462715e+03, 1.031160682876334e+03, 1.031706929799587e+03, 1.032251287025353e+03, - 1.032793769168571e+03, 1.033334390669139e+03, 1.033873165794763e+03, 1.034410108643744e+03, 1.034945233147708e+03, - 1.035478553074279e+03, 1.036010082029706e+03, 1.036539833461422e+03, 1.037067820660562e+03, 1.037594056764433e+03, - 1.038118554758925e+03, 1.038641327480881e+03, 1.039162387620419e+03, 1.039681747723207e+03, 1.040199420192692e+03, - 1.040715417292290e+03, 1.041229751147530e+03, 1.041742433748159e+03, 1.042253476950198e+03, 1.042762892477976e+03, - 1.043270691926105e+03, 1.043776886761429e+03, 1.044281488324937e+03, 1.044784507833632e+03, 1.045285956382374e+03, - 1.045785844945678e+03, 1.046284184379490e+03, 1.046780985422919e+03, 1.047276258699946e+03, 1.047770014721098e+03, - 1.048262263885085e+03, 1.048753016480419e+03, 1.049242282686996e+03, 1.049730072577648e+03, 1.050216396119671e+03, - 1.050701263176326e+03, 1.051184683508307e+03, 1.051666666775190e+03, 1.052147222536853e+03, 1.052626360254866e+03, - 1.053104089293869e+03, 1.053580418922910e+03, 1.054055358316774e+03, 1.054528916557277e+03, 1.055001102634547e+03, - 1.055471925448275e+03, 1.055941393808947e+03, 1.056409516439063e+03, 1.056876301974317e+03, 1.057341758964776e+03, - 1.057805895876025e+03, 1.058268721090303e+03, 1.058730242907608e+03, 1.059190469546797e+03, 1.059649409146657e+03, - 1.060107069766959e+03, 1.060563459389507e+03, 1.061018585919145e+03, 1.061472457184778e+03, 1.061925080940348e+03, - 1.062376464865811e+03, 1.062826616568093e+03, 1.063275543582030e+03, 1.063723253371294e+03, 1.064169753329302e+03, - 1.064615050780116e+03, 1.065059152979313e+03, 1.065502067114867e+03, 1.065943800307990e+03, 1.066384359613976e+03, - 1.066823752023031e+03, 1.067261984461078e+03, 1.067699063790565e+03, 1.068134996811247e+03, 1.068569790260965e+03, - 1.069003450816408e+03, 1.069435985093864e+03, 1.069867399649961e+03, 1.070297700982392e+03, 1.070726895530638e+03, - 1.071154989676667e+03, 1.071581989745634e+03, 1.072007902006566e+03, 1.072432732673032e+03, 1.072856487903811e+03, - 1.073279173803544e+03, 1.073700796423377e+03, 1.074121361761601e+03, 1.074540875764267e+03, 1.074959344325813e+03, - 1.075376773289662e+03, 1.075793168448820e+03, 1.076208535546474e+03, 1.076622880276557e+03, 1.077036208284332e+03, - 1.077448525166948e+03, 1.077859836473999e+03, 1.078270147708066e+03, 1.078679464325262e+03, 1.079087791735757e+03, - 1.079495135304305e+03, 1.079901500350758e+03, 1.080306892150577e+03, 1.080711315935330e+03, 1.081114776893189e+03, - 1.081517280169412e+03, 1.081918830866830e+03, 1.082319434046317e+03, 1.082719094727254e+03, 1.083117817887993e+03, - 1.083515608466311e+03, 1.083912471359853e+03, 1.084308411426577e+03, 1.084703433485190e+03, 1.085097542315570e+03, - 1.085490742659200e+03, 1.085883039219575e+03, 1.086274436662619e+03, 1.086664939617090e+03, 1.087054552674979e+03, - 1.087443280391907e+03, 1.087831127287514e+03, 1.088218097845843e+03, 1.088604196515718e+03, 1.088989427711119e+03, - 1.089373795811552e+03, 1.089757305162413e+03, 1.090139960075345e+03, 1.090521764828594e+03, 1.090902723667361e+03, - 1.091282840804143e+03, 1.091662120419076e+03, 1.092040566660270e+03, 1.092418183644144e+03, 1.092794975455747e+03, - 1.093170946149090e+03, 1.093546099747456e+03, 1.093920440243720e+03, 1.094293971600657e+03, 1.094666697751255e+03, - 1.095038622599006e+03, 1.095409750018220e+03, 1.095780083854305e+03, 1.096149627924070e+03, 1.096518386016003e+03, - 1.096886361890567e+03, 1.097253559280467e+03, 1.097619981890937e+03, 1.097985633400008e+03, 1.098350517458779e+03, - 1.098714637691686e+03, 1.099077997696761e+03, 1.099440601045895e+03, 1.099802451285096e+03, 1.100163551934738e+03, - 1.100523906489813e+03, 1.100883518420183e+03, 1.101242391170818e+03, 1.101600528162040e+03, 1.101957932789761e+03, - 1.102314608425719e+03, 1.102670558417710e+03, 1.103025786089820e+03, 1.103380294742647e+03, 1.103734087653529e+03, - 1.104087168076765e+03, 1.104439539243832e+03, 1.104791204363608e+03, 1.105142166622572e+03, 1.105492429185034e+03, - 1.105841995193324e+03, 1.106190867768011e+03, 1.106539050008105e+03, 1.106886544991253e+03, 1.107233355773944e+03, - 1.107579485391700e+03, 1.107924936859278e+03, 1.108269713170852e+03, 1.108613817300210e+03, 1.108957252200941e+03, - 1.109300020806618e+03, 1.109642126030981e+03, 1.109983570768121e+03, 1.110324357892655e+03, 1.110664490259911e+03, - 1.111003970706092e+03, 1.111342802048455e+03, 1.111680987085484e+03, 1.112018528597054e+03, 1.112355429344604e+03, - 1.112691692071294e+03, 1.113027319502177e+03, 1.113362314344354e+03, 1.113696679287140e+03, 1.114030417002214e+03, - 1.114363530143784e+03, 1.114696021348733e+03, 1.115027893236779e+03, 1.115359148410621e+03, 1.115689789456089e+03, - 1.116019818942296e+03, 1.116349239421776e+03, 1.116678053430638e+03, 1.117006263488702e+03, 1.117333872099640e+03, - 1.117660881751122e+03, 1.117987294914949e+03, 1.118313114047190e+03, 1.118638341588318e+03, 1.118962979963346e+03, - 1.119287031581954e+03, 1.119610498838628e+03, 1.119933384112781e+03, 1.120255689768887e+03, 1.120577418156602e+03, - 1.120898571610897e+03, 1.121219152452176e+03, 1.121539162986400e+03, 1.121858605505211e+03, 1.122177482286048e+03, - 1.122495795592270e+03, 1.122813547673270e+03, 1.123130740764595e+03, 1.123447377088057e+03, 1.123763458851849e+03, - 1.124078988250660e+03, 1.124393967465783e+03, 1.124708398665227e+03, 1.125022284003825e+03, 1.125335625623345e+03, - 1.125648425652594e+03, 1.125960686207525e+03, 1.126272409391344e+03, 1.126583597294608e+03, 1.126894251995334e+03 - }, - { - 1.759646158211660e+00, 5.370565770002817e+00, 9.054638626498587e+00, 1.281569733967865e+01, 1.665790581740634e+01, - 2.058579940182043e+01, 2.460433138741275e+01, 2.871892720476968e+01, 3.293554785254310e+01, 3.726076457835308e+01, - 4.170184732924816e+01, 4.626687018872866e+01, 5.096483794068550e+01, 5.580583914322148e+01, 6.080123278735140e+01, - 6.596387794984686e+01, 7.130841911586724e+01, 7.685164448919579e+01, 8.261294131869165e+01, 8.861488215460238e+01, - 9.488399081522013e+01, 1.014517597285052e+02, 1.083560264678084e+02, 1.156428761296669e+02, 1.233693352196309e+02, - 1.316072958010345e+02, 1.404494259939426e+02, 1.500184349630939e+02, 1.604823233088471e+02, 1.720810686740695e+02, - 1.851771671167039e+02, 2.003621789601490e+02, 2.187189666985901e+02, 2.426508419360667e+02, 2.803010943326496e+02, - 6.521432030130227e+02, 6.773955906748673e+02, 6.942281826309576e+02, 7.072395941741053e+02, 7.179964778999516e+02, - 7.272449221464342e+02, 7.354038623248191e+02, 7.427338327295237e+02, 7.494087450072469e+02, 7.555509362957072e+02, - 7.612500250349448e+02, 7.665738197891652e+02, 7.715749997715916e+02, 7.762953984136125e+02, 7.807688565518455e+02, - 7.850231848983857e+02, 7.890815515171732e+02, 7.929634864662104e+02, 7.966856246034820e+02, 8.002622650324795e+02, - 8.037057994263012e+02, 8.070270448166268e+02, 8.102355055958851e+02, 8.133395822671257e+02, 8.163467395763330e+02, - 8.192636432722026e+02, 8.220962723538220e+02, 8.248500119632056e+02, 8.275297308455099e+02, 8.301398463938243e+02, - 8.326843796224881e+02, 8.351670019072745e+02, 8.375910749469544e+02, 8.399596851065272e+02, 8.422756730748409e+02, - 8.445416595916769e+02, 8.467600678598029e+02, 8.489331431467650e+02, 8.510629699929400e+02, 8.531514873714069e+02, - 8.552005020878375e+02, 8.572117006619923e+02, 8.591866598942639e+02, 8.611268562893375e+02, 8.630336744831631e+02, - 8.649084147978710e+02, 8.667523000313754e+02, 8.685664815733354e+02, 8.703520449265328e+02, 8.721100147020211e+02, - 8.738413591473761e+02, 8.755469942596723e+02, 8.772277875282222e+02, 8.788845613465312e+02, 8.805180961280278e+02, - 8.821291331560270e+02, 8.837183771947377e+02, 8.852864988850330e+02, 8.868341369459806e+02, 8.883619002007856e+02, - 8.898703694437141e+02, 8.913600991627886e+02, 8.928316191314481e+02, 8.942854358809769e+02, 8.957220340642893e+02, - 8.971418777205638e+02, 8.985454114492746e+02, 8.999330615013115e+02, 9.013052367941365e+02, 9.026623298572396e+02, - 9.040047177135785e+02, 9.053327627021454e+02, 9.066468132463145e+02, 9.079472045722283e+02, 9.092342593810729e+02, - 9.105082884787515e+02, 9.117695913661706e+02, 9.130184567930663e+02, 9.142551632780351e+02, 9.154799795972381e+02, - 9.166931652440088e+02, 9.178949708614282e+02, 9.190856386497608e+02, 9.202654027504898e+02, 9.214344896085451e+02, - 9.225931183142071e+02, 9.237415009260393e+02, 9.248798427857232e+02, 9.260083428457867e+02, 9.271271939069900e+02, - 9.282365821330408e+02, 9.293366895111005e+02, 9.304276914712948e+02, 9.315097585395249e+02, 9.325830562427560e+02, - 9.336477453075646e+02, 9.347039816933990e+02, 9.357519174120829e+02, 9.367916997110556e+02, 9.378234719137031e+02, - 9.388473733992719e+02, 9.398635397502477e+02, 9.408721028928101e+02, 9.418731912307652e+02, 9.428669297733190e+02, - 9.438534402570187e+02, 9.448328412622016e+02, 9.458052483242184e+02, 9.467707740397436e+02, 9.477295281684092e+02, - 9.486816177300161e+02, 9.496271470975585e+02, 9.505662180862711e+02, 9.514989300388995e+02, 9.524253799074057e+02, - 9.533456623312541e+02, 9.542598697124838e+02, 9.551680922876994e+02, 9.560704181971550e+02, 9.569669335645297e+02, - 9.578577225053638e+02, 9.587428672730945e+02, 9.596224482597302e+02, 9.604965440672154e+02, 9.613652315617187e+02, - 9.622285859258320e+02, 9.630866806859478e+02, 9.639395878536747e+02, 9.647873778300585e+02, 9.656301195471383e+02, - 9.664678804864158e+02, 9.673007267204332e+02, 9.681287229528490e+02, 9.689519325570748e+02, 9.697704176135335e+02, - 9.705842389455950e+02, 9.713934561542610e+02, 9.721981276516268e+02, 9.729983106931969e+02, 9.737940614090808e+02, - 9.745854348341367e+02, 9.753724849370809e+02, 9.761552646486322e+02, 9.769338258887051e+02, 9.777082195927159e+02, - 9.784784957370053e+02, 9.792447033634509e+02, 9.800068906032614e+02, 9.807651047000217e+02, 9.815193920319878e+02, - 9.822697981336784e+02, 9.830163677167866e+02, 9.837591446904313e+02, 9.844981721807825e+02, 9.852334925500778e+02, - 9.859651474150523e+02, 9.866931776648082e+02, 9.874176234781436e+02, 9.881385243403543e+02, 9.888559190595411e+02, - 9.895698458049823e+02, 9.902803420311240e+02, 9.909874446312518e+02, 9.916911898582445e+02, 9.923916133623536e+02, - 9.930887502048440e+02, 9.937826348712426e+02, 9.944733012842100e+02, 9.951607828160458e+02, 9.958451123008458e+02, - 9.965263220463163e+02, 9.972044438452614e+02, 9.978795089867530e+02, 9.985515482669938e+02, 9.992205919998831e+02, - 9.998866700272974e+02, 1.000549811729091e+03, 1.001210046032833e+03, 1.001867401423278e+03, 1.002521905951592e+03, - 1.003173587244331e+03, 1.003822472512187e+03, 1.004468588558502e+03, 1.005111961787565e+03, 1.005752618212693e+03, - 1.006390583464110e+03, 1.007025882796613e+03, 1.007658541097059e+03, 1.008288582891650e+03, 1.008916032353042e+03, - 1.009540913307279e+03, 1.010163248746308e+03, 1.010783062793383e+03, 1.011400377798094e+03, 1.012015216265965e+03, - 1.012627600388076e+03, 1.013237552047042e+03, 1.013845092822834e+03, 1.014450243998473e+03, 1.015053026565585e+03, - 1.015653461229820e+03, 1.016251568416150e+03, 1.016847368274035e+03, 1.017440880682481e+03, 1.018032125254966e+03, - 1.018621121344263e+03, 1.019207888047146e+03, 1.019792444208994e+03, 1.020374808428283e+03, 1.020954999060983e+03, - 1.021533034224857e+03, 1.022108931803652e+03, 1.022682709451210e+03, 1.023254384595482e+03, 1.023823974442452e+03, - 1.024391495979979e+03, 1.024956965981550e+03, 1.025520401009952e+03, 1.026081817420870e+03, 1.026641231366401e+03, - 1.027198658798495e+03, 1.027754115472322e+03, 1.028307616949568e+03, 1.028859178601660e+03, 1.029408815612924e+03, - 1.029956542983678e+03, 1.030502375533256e+03, 1.031046327902974e+03, 1.031588414559030e+03, 1.032128649795349e+03, - 1.032667047736366e+03, 1.033203622339754e+03, 1.033738387399096e+03, 1.034271356546497e+03, 1.034802543255161e+03, - 1.035331960841891e+03, 1.035859622469561e+03, 1.036385541149525e+03, 1.036909729743988e+03, 1.037432200968318e+03, - 1.037952967393328e+03, 1.038472041447499e+03, 1.038989435419170e+03, 1.039505161458676e+03, 1.040019231580459e+03, - 1.040531657665118e+03, 1.041042451461438e+03, 1.041551624588375e+03, 1.042059188536994e+03, 1.042565154672386e+03, - 1.043069534235533e+03, 1.043572338345153e+03, 1.044073577999494e+03, 1.044573264078114e+03, 1.045071407343609e+03, - 1.045568018443322e+03, 1.046063107911014e+03, 1.046556686168508e+03, 1.047048763527302e+03, 1.047539350190146e+03, - 1.048028456252607e+03, 1.048516091704585e+03, 1.049002266431817e+03, 1.049486990217349e+03, 1.049970272742979e+03, - 1.050452123590679e+03, 1.050932552243991e+03, 1.051411568089392e+03, 1.051889180417645e+03, 1.052365398425121e+03, - 1.052840231215094e+03, 1.053313687799024e+03, 1.053785777097807e+03, 1.054256507943009e+03, 1.054725889078079e+03, - 1.055193929159539e+03, 1.055660636758157e+03, 1.056126020360091e+03, 1.056590088368028e+03, 1.057052849102293e+03, - 1.057514310801942e+03, 1.057974481625836e+03, 1.058433369653702e+03, 1.058890982887167e+03, 1.059347329250789e+03, - 1.059802416593049e+03, 1.060256252687354e+03, 1.060708845233000e+03, 1.061160201856131e+03, 1.061610330110684e+03, - 1.062059237479308e+03, 1.062506931374281e+03, 1.062953419138403e+03, 1.063398708045876e+03, 1.063842805303175e+03, - 1.064285718049902e+03, 1.064727453359622e+03, 1.065168018240692e+03, 1.065607419637079e+03, 1.066045664429151e+03, - 1.066482759434476e+03, 1.066918711408590e+03, 1.067353527045765e+03, 1.067787212979760e+03, 1.068219775784563e+03, - 1.068651221975115e+03, 1.069081558008032e+03, 1.069510790282313e+03, 1.069938925140029e+03, 1.070365968867016e+03, - 1.070791927693547e+03, 1.071216807794993e+03, 1.071640615292483e+03, 1.072063356253546e+03, 1.072485036692747e+03, - 1.072905662572310e+03, 1.073325239802738e+03, 1.073743774243420e+03, 1.074161271703223e+03, 1.074577737941090e+03, - 1.074993178666615e+03, 1.075407599540614e+03, 1.075821006175694e+03, 1.076233404136806e+03, 1.076644798941787e+03, - 1.077055196061911e+03, 1.077464600922410e+03, 1.077873018903002e+03, 1.078280455338409e+03, 1.078686915518864e+03, - 1.079092404690613e+03, 1.079496928056411e+03, 1.079900490776007e+03, 1.080303097966628e+03, 1.080704754703452e+03, - 1.081105466020072e+03, 1.081505236908963e+03, 1.081904072321930e+03, 1.082301977170561e+03, 1.082698956326665e+03, - 1.083095014622709e+03, 1.083490156852249e+03, 1.083884387770352e+03, 1.084277712094014e+03, 1.084670134502574e+03, - 1.085061659638117e+03, 1.085452292105878e+03, 1.085842036474636e+03, 1.086230897277108e+03, 1.086618879010324e+03, - 1.087005986136021e+03, 1.087392223081004e+03, 1.087777594237526e+03, 1.088162103963646e+03, 1.088545756583591e+03, - 1.088928556388114e+03, 1.089310507634837e+03, 1.089691614548607e+03, 1.090071881321828e+03, 1.090451312114800e+03, - 1.090829911056058e+03, 1.091207682242688e+03, 1.091584629740662e+03, 1.091960757585150e+03, 1.092336069780840e+03, - 1.092710570302246e+03, 1.093084263094017e+03, 1.093457152071240e+03, 1.093829241119741e+03, 1.094200534096374e+03, - 1.094571034829324e+03, 1.094940747118387e+03, 1.095309674735252e+03, 1.095677821423793e+03, 1.096045190900337e+03, - 1.096411786853939e+03, 1.096777612946656e+03, 1.097142672813812e+03, 1.097506970064262e+03, 1.097870508280650e+03, - 1.098233291019672e+03, 1.098595321812324e+03, 1.098956604164155e+03, 1.099317141555519e+03, 1.099676937441811e+03, - 1.100035995253718e+03, 1.100394318397450e+03, 1.100751910254982e+03, 1.101108774184284e+03, 1.101464913519551e+03, - 1.101820331571432e+03, 1.102175031627253e+03, 1.102529016951240e+03, 1.102882290784740e+03, 1.103234856346432e+03, - 1.103586716832549e+03, 1.103937875417083e+03, 1.104288335251999e+03, 1.104638099467435e+03, 1.104987171171915e+03, - 1.105335553452542e+03, 1.105683249375205e+03, 1.106030261984769e+03, 1.106376594305275e+03, 1.106722249340130e+03, - 1.107067230072298e+03, 1.107411539464488e+03, 1.107755180459337e+03, 1.108098155979600e+03, 1.108440468928325e+03, - 1.108782122189035e+03, 1.109123118625908e+03, 1.109463461083946e+03, 1.109803152389156e+03, 1.110142195348716e+03, - 1.110480592751145e+03, 1.110818347366473e+03, 1.111155461946404e+03, 1.111491939224482e+03, 1.111827781916253e+03, - 1.112162992719419e+03, 1.112497574314006e+03, 1.112831529362514e+03, 1.113164860510074e+03, 1.113497570384599e+03, - 1.113829661596938e+03, 1.114161136741025e+03, 1.114491998394025e+03, 1.114822249116483e+03, 1.115151891452468e+03, - 1.115480927929715e+03, 1.115809361059768e+03, 1.116137193338120e+03, 1.116464427244349e+03, 1.116791065242261e+03, - 1.117117109780018e+03, 1.117442563290278e+03, 1.117767428190324e+03, 1.118091706882198e+03, 1.118415401752829e+03, - 1.118738515174161e+03, 1.119061049503283e+03, 1.119383007082549e+03, 1.119704390239710e+03, 1.120025201288030e+03, - 1.120345442526411e+03, 1.120665116239516e+03, 1.120984224697879e+03, 1.121302770158035e+03, 1.121620754862628e+03, - 1.121938181040530e+03, 1.122255050906953e+03, 1.122571366663565e+03, 1.122887130498598e+03, 1.123202344586965e+03, - 1.123517011090360e+03, 1.123831132157377e+03, 1.124144709923608e+03, 1.124457746511756e+03, 1.124770244031736e+03 - }, - { - 1.753632059027257e+00, 5.351611249853827e+00, 9.021616572172205e+00, 1.276736626236109e+01, 1.659289479091158e+01, - 2.050259048929611e+01, 2.450123904184888e+01, 2.859407400092714e+01, 3.278683574434611e+01, 3.708584066130366e+01, - 4.149806280600863e+01, 4.603123086199034e+01, 5.069394405535617e+01, 5.549581171820162e+01, 6.044762263993844e+01, - 6.556155231000896e+01, 7.085141888160165e+01, 7.633300252250081e+01, 8.202444830548500e+01, 8.794678077534249e+01, - 9.412457017812932e+01, 1.005868083036480e+02, 1.073680797959698e+02, 1.145101593176195e+02, 1.220642382367975e+02, - 1.300941094622738e+02, 1.386808606837394e+02, 1.479300398863622e+02, 1.579830709310434e+02, 1.690364189581546e+02, - 1.813759695763958e+02, 1.954442865028346e+02, 2.119888768230097e+02, 2.324524257796423e+02, 2.603609700682213e+02, - 3.116771334582932e+02, 6.386030708148930e+02, 6.665563778439038e+02, 6.847257296140039e+02, 6.985860417609099e+02, - 7.099473628294924e+02, 7.196567259417725e+02, 7.281838190360186e+02, 7.358178700043339e+02, 7.427503751731374e+02, - 7.491151117352788e+02, 7.550094956065492e+02, 7.605068542592787e+02, 7.656638975064167e+02, 7.705254818183772e+02, - 7.751277679663959e+02, 7.795003829431066e+02, 7.836679419482515e+02, 7.876511460754599e+02, 7.914675909164964e+02, - 7.951323735037114e+02, 7.986585555167862e+02, 8.020575221271434e+02, 8.053392637507428e+02, 8.085125999770248e+02, - 8.115853595155569e+02, 8.145645262595193e+02, 8.174563589398913e+02, 8.202664899737809e+02, 8.230000077588272e+02, - 8.256615256760184e+02, 8.282552403299479e+02, 8.307849810058602e+02, 8.332542519064704e+02, 8.356662684131053e+02, - 8.380239883698166e+02, 8.403301391977044e+02, 8.425872414963723e+02, 8.447976296705856e+02, 8.469634700254746e+02, - 8.490867766976762e+02, 8.511694257284902e+02, 8.532131675352989e+02, 8.552196379968784e+02, 8.571903683347796e+02, - 8.591267939454285e+02, 8.610302623147174e+02, 8.629020401277968e+02, 8.647433196708668e+02, 8.665552246083355e+02, - 8.683388152074178e+02, 8.700950930726908e+02, 8.718250054449436e+02, 8.735294491117633e+02, 8.752092739713160e+02, - 8.768652862857123e+02, 8.784982516559255e+02, 8.801088977464705e+02, 8.816979167847256e+02, 8.832659678569759e+02, - 8.848136790207039e+02, 8.863416492505769e+02, 8.878504502335792e+02, 8.893406280271724e+02, 8.908127045928305e+02, - 8.922671792160527e+02, 8.937045298227987e+02, 8.951252142013041e+02, 8.965296711373209e+02, 8.979183214700641e+02, - 8.992915690754153e+02, 9.006498017823341e+02, 9.019933922278510e+02, 9.033226986555213e+02, 9.046380656617835e+02, - 9.059398248942426e+02, 9.072282957055584e+02, 9.085037857662970e+02, 9.097665916397833e+02, 9.110169993217721e+02, - 9.122552847474846e+02, 9.134817142683553e+02, 9.146965451006433e+02, 9.159000257478770e+02, 9.170923963989522e+02, - 9.182738893035482e+02, 9.194447291263971e+02, 9.206051332822632e+02, 9.217553122788474e+02, 9.228954700299744e+02, - 9.240258040974796e+02, 9.251465049820799e+02, 9.262577594469818e+02, 9.273597470304893e+02, 9.284526423554121e+02, - 9.295366148982515e+02, 9.306118290247582e+02, 9.316784448830105e+02, 9.327366175121228e+02, 9.337864977591189e+02, - 9.348282322542124e+02, 9.358619635718649e+02, 9.368878303827341e+02, 9.379059675987268e+02, 9.389165065112981e+02, - 9.399195749233554e+02, 9.409152972751333e+02, 9.419037947643586e+02, 9.428851854610300e+02, 9.438595844170812e+02, - 9.448271037712186e+02, 9.457878528491826e+02, 9.467419382596580e+02, 9.476894639860843e+02, 9.486305314745557e+02, - 9.495652397180191e+02, 9.504936853369553e+02, 9.514159626567191e+02, 9.523321637817081e+02, 9.532423786665071e+02, - 9.541466951971628e+02, 9.550451992034878e+02, 9.559379746038603e+02, 9.568251034096951e+02, 9.577066657979311e+02, - 9.585827401443596e+02, 9.594534031691488e+02, 9.603187298481192e+02, 9.611787935579329e+02, 9.620336660995737e+02, - 9.628834177444229e+02, 9.637281172786235e+02, 9.645678320458335e+02, 9.654026279884105e+02, 9.662325696871295e+02, - 9.670577203994600e+02, 9.678781420965014e+02, 9.686938954986042e+02, 9.695050401097511e+02, 9.703116342507434e+02, - 9.711137350912416e+02, 9.719113986807114e+02, 9.727046799783175e+02, 9.734936328818109e+02, 9.742783102554459e+02, - 9.750587639569708e+02, 9.758350448637287e+02, 9.766072028979000e+02, 9.773752870509237e+02, 9.781393454071313e+02, - 9.788994251666194e+02, 9.796555726673946e+02, 9.804078334068175e+02, 9.811562520623668e+02, 9.819008725117627e+02, - 9.826417378523621e+02, 9.833788904423287e+02, 9.841123718297326e+02, 9.848422229053390e+02, 9.855684838287985e+02, - 9.862911940683814e+02, 9.870103924171941e+02, 9.877261170088946e+02, 9.884384053329567e+02, 9.891472942494853e+02, - 9.898528200035945e+02, 9.905550182393827e+02, 9.912539240134882e+02, 9.919495718082746e+02, 9.926419955446316e+02, - 9.933312285944187e+02, 9.940173037925571e+02, 9.947002534487890e+02, 9.953801093591056e+02, 9.960569028168641e+02, - 9.967306646236001e+02, 9.974014250995418e+02, 9.980692140938463e+02, 9.987340609945511e+02, 9.993959947382724e+02, - 1.000055043819631e+03, 1.000711236300439e+03, 1.001364599818641e+03, 1.002015161597022e+03, 1.002662948451693e+03, - 1.003307986800343e+03, 1.003950302670301e+03, 1.004589921706371e+03, 1.005226869178483e+03, 1.005861169989137e+03, - 1.006492848680676e+03, 1.007121928950236e+03, 1.007748435606874e+03, 1.008372391679970e+03, 1.008993820340296e+03, - 1.009612744432160e+03, 1.010229186479661e+03, 1.010843168692785e+03, 1.011454712973359e+03, 1.012063840920867e+03, - 1.012670573838113e+03, 1.013274932736767e+03, 1.013876938342763e+03, 1.014476611101586e+03, 1.015073971183421e+03, - 1.015669038488196e+03, 1.016261832650493e+03, 1.016852373044363e+03, 1.017440678788015e+03, 1.018026768748407e+03, - 1.018610661545733e+03, 1.019192375557802e+03, 1.019771928924326e+03, 1.020349339551111e+03, 1.020924625114144e+03, - 1.021497803063608e+03, 1.022068890627795e+03, 1.022637904816936e+03, 1.023204862426947e+03, 1.023769780043096e+03, - 1.024332674043592e+03, 1.024893560603091e+03, 1.025452455696129e+03, 1.026009375100485e+03, 1.026564334400469e+03, - 1.027117348990143e+03, 1.027668434076471e+03, 1.028217604682404e+03, 1.028764875649907e+03, 1.029310261642910e+03, - 1.029853777150212e+03, 1.030395436488316e+03, 1.030935253804208e+03, 1.031473243078081e+03, 1.032009418126004e+03, - 1.032543792602533e+03, 1.033076380003277e+03, 1.033607193667400e+03, 1.034136246780087e+03, 1.034663552374956e+03, - 1.035189123336412e+03, 1.035712972401975e+03, 1.036235112164542e+03, 1.036755555074618e+03, 1.037274313442498e+03, - 1.037791399440410e+03, 1.038306825104610e+03, 1.038820602337447e+03, 1.039332742909376e+03, 1.039843258460950e+03, - 1.040352160504749e+03, 1.040859460427299e+03, 1.041365169490941e+03, 1.041869298835661e+03, 1.042371859480896e+03, - 1.042872862327304e+03, 1.043372318158495e+03, 1.043870237642736e+03, 1.044366631334623e+03, 1.044861509676724e+03, - 1.045354883001187e+03, 1.045846761531325e+03, 1.046337155383168e+03, 1.046826074566989e+03, 1.047313528988799e+03, - 1.047799528451826e+03, 1.048284082657950e+03, 1.048767201209131e+03, 1.049248893608798e+03, 1.049729169263219e+03, - 1.050208037482848e+03, 1.050685507483649e+03, 1.051161588388389e+03, 1.051636289227921e+03, 1.052109618942435e+03, - 1.052581586382688e+03, 1.053052200311223e+03, 1.053521469403553e+03, 1.053989402249334e+03, 1.054456007353518e+03, - 1.054921293137477e+03, 1.055385267940125e+03, 1.055847940019002e+03, 1.056309317551357e+03, 1.056769408635199e+03, - 1.057228221290339e+03, 1.057685763459414e+03, 1.058142043008888e+03, 1.058597067730047e+03, 1.059050845339965e+03, - 1.059503383482467e+03, 1.059954689729066e+03, 1.060404771579892e+03, 1.060853636464597e+03, 1.061301291743262e+03, - 1.061747744707268e+03, 1.062193002580169e+03, 1.062637072518547e+03, 1.063079961612850e+03, 1.063521676888219e+03, - 1.063962225305304e+03, 1.064401613761064e+03, 1.064839849089555e+03, 1.065276938062706e+03, 1.065712887391088e+03, - 1.066147703724660e+03, 1.066581393653511e+03, 1.067013963708593e+03, 1.067445420362435e+03, 1.067875770029855e+03, - 1.068305019068647e+03, 1.068733173780279e+03, 1.069160240410558e+03, 1.069586225150301e+03, 1.070011134135987e+03, - 1.070434973450403e+03, 1.070857749123280e+03, 1.071279467131918e+03, 1.071700133401804e+03, 1.072119753807221e+03, - 1.072538334171840e+03, 1.072955880269318e+03, 1.073372397823873e+03, 1.073787892510859e+03, 1.074202369957330e+03, - 1.074615835742597e+03, 1.075028295398773e+03, 1.075439754411317e+03, 1.075850218219560e+03, 1.076259692217236e+03, - 1.076668181752997e+03, 1.077075692130918e+03, 1.077482228611007e+03, 1.077887796409695e+03, 1.078292400700325e+03, - 1.078696046613633e+03, 1.079098739238223e+03, 1.079500483621037e+03, 1.079901284767813e+03, 1.080301147643541e+03, - 1.080700077172909e+03, 1.081098078240752e+03, 1.081495155692479e+03, 1.081891314334514e+03, 1.082286558934707e+03, - 1.082680894222765e+03, 1.083074324890655e+03, 1.083466855593020e+03, 1.083858490947570e+03, 1.084249235535485e+03, - 1.084639093901809e+03, 1.085028070555825e+03, 1.085416169971442e+03, 1.085803396587572e+03, 1.086189754808492e+03, - 1.086575249004219e+03, 1.086959883510863e+03, 1.087343662630987e+03, 1.087726590633953e+03, 1.088108671756273e+03, - 1.088489910201951e+03, 1.088870310142812e+03, 1.089249875718847e+03, 1.089628611038532e+03, 1.090006520179154e+03, - 1.090383607187136e+03, 1.090759876078346e+03, 1.091135330838414e+03, 1.091509975423035e+03, 1.091883813758277e+03, - 1.092256849740879e+03, 1.092629087238547e+03, 1.093000530090247e+03, 1.093371182106492e+03, 1.093741047069628e+03, - 1.094110128734119e+03, 1.094478430826816e+03, 1.094845957047239e+03, 1.095212711067846e+03, 1.095578696534298e+03, - 1.095943917065727e+03, 1.096308376254993e+03, 1.096672077668944e+03, 1.097035024848671e+03, 1.097397221309757e+03, - 1.097758670542528e+03, 1.098119376012294e+03, 1.098479341159596e+03, 1.098838569400443e+03, 1.099197064126546e+03, - 1.099554828705558e+03, 1.099911866481296e+03, 1.100268180773975e+03, 1.100623774880433e+03, 1.100978652074349e+03, - 1.101332815606467e+03, 1.101686268704810e+03, 1.102039014574898e+03, 1.102391056399957e+03, 1.102742397341128e+03, - 1.103093040537676e+03, 1.103442989107197e+03, 1.103792246145811e+03, 1.104140814728373e+03, 1.104488697908661e+03, - 1.104835898719577e+03, 1.105182420173338e+03, 1.105528265261666e+03, 1.105873436955976e+03, 1.106217938207564e+03, - 1.106561771947788e+03, 1.106904941088254e+03, 1.107247448520993e+03, 1.107589297118637e+03, 1.107930489734602e+03, - 1.108271029203252e+03, 1.108610918340075e+03, 1.108950159941858e+03, 1.109288756786845e+03, 1.109626711634912e+03, - 1.109964027227723e+03, 1.110300706288900e+03, 1.110636751524177e+03, 1.110972165621562e+03, 1.111306951251493e+03, - 1.111641111066993e+03, 1.111974647703826e+03, 1.112307563780643e+03, 1.112639861899135e+03, 1.112971544644184e+03, - 1.113302614584007e+03, 1.113633074270297e+03, 1.113962926238377e+03, 1.114292173007331e+03, 1.114620817080152e+03, - 1.114948860943875e+03, 1.115276307069720e+03, 1.115603157913223e+03, 1.115929415914373e+03, 1.116255083497746e+03, - 1.116580163072632e+03, 1.116904657033169e+03, 1.117228567758473e+03, 1.117551897612758e+03, 1.117874648945472e+03, - 1.118196824091413e+03, 1.118518425370856e+03, 1.118839455089676e+03, 1.119159915539468e+03, 1.119479808997663e+03, - 1.119799137727651e+03, 1.120117903978895e+03, 1.120436109987049e+03, 1.120753757974069e+03, 1.121070850148330e+03, - 1.121387388704735e+03, 1.121703375824828e+03, 1.122018813676902e+03, 1.122333704416111e+03, 1.122648050184574e+03 - }, - { - 1.747659611828432e+00, 5.332796710757316e+00, 8.988854365426702e+00, 1.271944018022531e+01, 1.652846365830920e+01, - 2.042017147962093e+01, 2.439918817160943e+01, 2.847056321609146e+01, 3.263982586484059e+01, 3.691304925915928e+01, - 4.129692584347427e+01, 4.579885658673009e+01, 5.042705721077700e+01, 5.519068553491932e+01, 6.009999526667289e+01, - 6.516652322615323e+01, 7.040331927021967e+01, 7.582523135901660e+01, 8.144926270278546e+01, 8.729502439391121e+01, - 9.338531640325664e+01, 9.974688397997900e+01, 1.064114181348679e+02, 1.134169027960040e+02, 1.208094658721784e+02, - 1.286459824127509e+02, 1.369978348839282e+02, 1.459565187114674e+02, 1.556423164104066e+02, 1.662183418837789e+02, - 1.779145902065660e+02, 1.910721712494387e+02, 2.062327457882489e+02, 2.243449823849654e+02, 2.473478699672924e+02, - 2.805378733710326e+02, 3.634431299908570e+02, 6.254813035599956e+02, 6.558679856765530e+02, 6.753104092363635e+02, - 6.899943310095643e+02, 7.019476466818353e+02, 7.121108106526021e+02, 7.210014384109655e+02, 7.289362466235776e+02, - 7.361237580825117e+02, 7.427089142383425e+02, 7.487967838920495e+02, 7.544661326581772e+02, 7.597776524296729e+02, - 7.647791910872882e+02, 7.695092069231373e+02, 7.739991260895454e+02, 7.782749970528438e+02, 7.823586802266300e+02, - 7.862687217988788e+02, 7.900210078085244e+02, 7.936292620355629e+02, 7.971054307583348e+02, 8.004599841533063e+02, - 8.037021553197851e+02, 8.068401319696053e+02, 8.098812117310740e+02, 8.128319291524118e+02, 8.156981604537586e+02, - 8.184852106082401e+02, 8.211978862596457e+02, 8.238405571905341e+02, 8.264172084609129e+02, 8.289314848886924e+02, - 8.313867292004430e+02, 8.337860149168040e+02, 8.361321748316263e+02, 8.384278257829619e+02, 8.406753902869854e+02, - 8.428771155047946e+02, 8.450350899311030e+02, 8.471512581285355e+02, 8.492274337783032e+02, 8.512653112748696e+02, - 8.532664760567646e+02, 8.552324138365216e+02, 8.571645188684962e+02, 8.590641013732004e+02, 8.609323942199201e+02, - 8.627705589552579e+02, 8.645796912533052e+02, 8.663608258530688e+02, 8.681149410401933e+02, 8.698429627227040e+02, - 8.715457681442740e+02, 8.732241892731309e+02, 8.748790159000977e+02, 8.765109984753029e+02, 8.781208507096248e+02, - 8.797092519639431e+02, 8.812768494466768e+02, 8.828242602377982e+02, 8.843520731555307e+02, 8.858608504802064e+02, - 8.873511295482033e+02, 8.888234242275646e+02, 8.902782262856737e+02, 8.917160066583574e+02, 8.931372166288119e+02, - 8.945422889239351e+02, 8.959316387349368e+02, 8.973056646684030e+02, 8.986647496334409e+02, 9.000092616699892e+02, - 9.013395547229183e+02, 9.026559693661341e+02, 9.039588334805021e+02, 9.052484628890929e+02, 9.065251619529363e+02, - 9.077892241301959e+02, 9.090409325014242e+02, 9.102805602633513e+02, 9.115083711934362e+02, 9.127246200872452e+02, - 9.139295531705343e+02, 9.151234084877879e+02, 9.163064162688016e+02, 9.174787992800113e+02, 9.186407731912891e+02, - 9.197925468609363e+02, 9.209343226041448e+02, 9.220662951928475e+02, 9.231886562624145e+02, 9.243015894078225e+02, - 9.254052733423142e+02, 9.264998814856765e+02, 9.275855820127574e+02, 9.286625387274997e+02, 9.297309102172569e+02, - 9.307908507470315e+02, 9.318425102480171e+02, 9.328860344864579e+02, 9.339215652153523e+02, 9.349492403273919e+02, - 9.359691939968451e+02, 9.369815568155962e+02, 9.379864559229345e+02, 9.389840151294509e+02, 9.399743550353364e+02, - 9.409575931434247e+02, 9.419338439672164e+02, 9.429032191341721e+02, 9.438658274845296e+02, 9.448217751658639e+02, - 9.457711657236084e+02, 9.467141001877502e+02, 9.476506771559013e+02, 9.485809928729084e+02, 9.495051413071852e+02, - 9.504232142376935e+02, 9.513353012678147e+02, 9.522414899794773e+02, 9.531418659385832e+02, 9.540365127503031e+02, - 9.549255122090501e+02, 9.558089442179278e+02, 9.566868869378121e+02, 9.575594168164913e+02, 9.584266086397703e+02, - 9.592885355806404e+02, 9.601452692466164e+02, 9.609968797253258e+02, 9.618434356284154e+02, 9.626850041338678e+02, - 9.635216510267758e+02, 9.643534407386575e+02, 9.651804363853771e+02, 9.660026998037097e+02, 9.668202915866395e+02, - 9.676332711174156e+02, 9.684416966024349e+02, 9.692456251029969e+02, 9.700451125659748e+02, 9.708402138534479e+02, - 9.716309827713388e+02, 9.724174720970976e+02, 9.731997336064671e+02, 9.739778180993665e+02, 9.747517754249311e+02, - 9.755216545057431e+02, 9.762875033834615e+02, 9.770493691516285e+02, 9.778072981142626e+02, 9.785613357148328e+02, - 9.793115265802675e+02, 9.800579145409317e+02, 9.808005426499802e+02, 9.815394532021168e+02, 9.822746877517856e+02, - 9.830062871308031e+02, 9.837342914654657e+02, 9.844587401931408e+02, 9.851796720783643e+02, 9.858971252284682e+02, - 9.866111371087369e+02, 9.873217445571381e+02, 9.880289837986073e+02, 9.887328904589375e+02, 9.894334995782599e+02, - 9.901308456241450e+02, 9.908249625043327e+02, 9.915158835791032e+02, 9.922036416733027e+02, 9.928882690880357e+02, - 9.935697976120324e+02, 9.942482585327026e+02, 9.949236826468950e+02, 9.955961002713553e+02, 9.962655412529051e+02, - 9.969320349783549e+02, 9.975956103841360e+02, 9.982562959656997e+02, 9.989141197866451e+02, 9.995691094876255e+02, - 1.000221292295012e+03, 1.000870695029337e+03, 1.001517344113522e+03, 1.002161265580885e+03, 1.002802485082955e+03, - 1.003441027897081e+03, 1.004076918444280e+03, 1.004710182236384e+03, 1.005340843000363e+03, 1.005968924589208e+03, - 1.006594450517019e+03, 1.007217443965552e+03, 1.007837927790598e+03, 1.008455924528217e+03, 1.009071456400806e+03, - 1.009684545323041e+03, 1.010295212907659e+03, 1.010903480471109e+03, 1.011509369039075e+03, 1.012112899351861e+03, - 1.012714091869649e+03, 1.013312966777644e+03, 1.013909543991088e+03, 1.014503843160166e+03, 1.015095883674795e+03, - 1.015685684669307e+03, 1.016273265027023e+03, 1.016858643384723e+03, 1.017441838137019e+03, 1.018022867440622e+03, - 1.018601749218526e+03, 1.019178501164087e+03, 1.019753140745019e+03, 1.020325685207299e+03, 1.020896151578988e+03, - 1.021464556673968e+03, 1.022030917095601e+03, 1.022595249240300e+03, 1.023157569301035e+03, 1.023717893270757e+03, - 1.024276236945749e+03, 1.024832615928908e+03, 1.025387045632961e+03, 1.025939541283600e+03, 1.026490117922575e+03, - 1.027038790410696e+03, 1.027585573430793e+03, 1.028130481490604e+03, 1.028673528925609e+03, 1.029214729901804e+03, - 1.029754098418416e+03, 1.030291648310568e+03, 1.030827393251892e+03, 1.031361346757073e+03, 1.031893522184370e+03, - 1.032423932738057e+03, 1.032952591470840e+03, 1.033479511286210e+03, 1.034004704940759e+03, 1.034528185046445e+03, - 1.035049964072816e+03, 1.035570054349190e+03, 1.036088468066793e+03, 1.036605217280855e+03, 1.037120313912667e+03, - 1.037633769751596e+03, 1.038145596457066e+03, 1.038655805560498e+03, 1.039164408467214e+03, 1.039671416458309e+03, - 1.040176840692478e+03, 1.040680692207821e+03, 1.041182981923609e+03, 1.041683720642014e+03, 1.042182919049811e+03, - 1.042680587720051e+03, 1.043176737113700e+03, 1.043671377581246e+03, 1.044164519364280e+03, 1.044656172597053e+03, - 1.045146347307991e+03, 1.045635053421203e+03, 1.046122300757940e+03, 1.046608099038045e+03, 1.047092457881370e+03, - 1.047575386809171e+03, 1.048056895245471e+03, 1.048536992518409e+03, 1.049015687861563e+03, 1.049492990415244e+03, - 1.049968909227770e+03, 1.050443453256728e+03, 1.050916631370197e+03, 1.051388452347965e+03, 1.051858924882712e+03, - 1.052328057581192e+03, 1.052795858965370e+03, 1.053262337473561e+03, 1.053727501461539e+03, 1.054191359203629e+03, - 1.054653918893783e+03, 1.055115188646638e+03, 1.055575176498552e+03, 1.056033890408628e+03, 1.056491338259721e+03, - 1.056947527859422e+03, 1.057402466941035e+03, 1.057856163164531e+03, 1.058308624117491e+03, 1.058759857316028e+03, - 1.059209870205704e+03, 1.059658670162422e+03, 1.060106264493307e+03, 1.060552660437576e+03, 1.060997865167394e+03, - 1.061441885788709e+03, 1.061884729342082e+03, 1.062326402803503e+03, 1.062766913085188e+03, 1.063206267036371e+03, - 1.063644471444081e+03, 1.064081533033901e+03, 1.064517458470727e+03, 1.064952254359505e+03, 1.065385927245962e+03, - 1.065818483617323e+03, 1.066249929903019e+03, 1.066680272475383e+03, 1.067109517650337e+03, 1.067537671688066e+03, - 1.067964740793685e+03, 1.068390731117890e+03, 1.068815648757612e+03, 1.069239499756640e+03, 1.069662290106263e+03, - 1.070084025745870e+03, 1.070504712563573e+03, 1.070924356396794e+03, 1.071342963032864e+03, 1.071760538209597e+03, - 1.072177087615869e+03, 1.072592616892178e+03, 1.073007131631203e+03, 1.073420637378350e+03, 1.073833139632294e+03, - 1.074244643845510e+03, 1.074655155424799e+03, 1.075064679731805e+03, 1.075473222083526e+03, 1.075880787752812e+03, - 1.076287381968866e+03, 1.076693009917733e+03, 1.077097676742774e+03, 1.077501387545147e+03, 1.077904147384277e+03, - 1.078305961278312e+03, 1.078706834204580e+03, 1.079106771100040e+03, 1.079505776861723e+03, 1.079903856347168e+03, - 1.080301014374853e+03, 1.080697255724619e+03, 1.081092585138091e+03, 1.081487007319088e+03, 1.081880526934031e+03, - 1.082273148612348e+03, 1.082664876946866e+03, 1.083055716494205e+03, 1.083445671775160e+03, 1.083834747275089e+03, - 1.084222947444279e+03, 1.084610276698325e+03, 1.084996739418489e+03, 1.085382339952067e+03, 1.085767082612738e+03, - 1.086150971680919e+03, 1.086534011404113e+03, 1.086916205997249e+03, 1.087297559643018e+03, 1.087678076492209e+03, - 1.088057760664037e+03, 1.088436616246467e+03, 1.088814647296535e+03, 1.089191857840661e+03, 1.089568251874967e+03, - 1.089943833365582e+03, 1.090318606248944e+03, 1.090692574432102e+03, 1.091065741793015e+03, 1.091438112180840e+03, - 1.091809689416227e+03, 1.092180477291597e+03, 1.092550479571428e+03, 1.092919699992533e+03, 1.093288142264335e+03, - 1.093655810069135e+03, 1.094022707062386e+03, 1.094388836872949e+03, 1.094754203103362e+03, 1.095118809330094e+03, - 1.095482659103801e+03, 1.095845755949578e+03, 1.096208103367205e+03, 1.096569704831395e+03, 1.096930563792039e+03, - 1.097290683674438e+03, 1.097650067879546e+03, 1.098008719784203e+03, 1.098366642741364e+03, 1.098723840080329e+03, - 1.099080315106964e+03, 1.099436071103932e+03, 1.099791111330906e+03, 1.100145439024789e+03, 1.100499057399926e+03, - 1.100851969648323e+03, 1.101204178939849e+03, 1.101555688422449e+03, 1.101906501222346e+03, 1.102256620444243e+03, - 1.102606049171524e+03, 1.102954790466453e+03, 1.103302847370368e+03, 1.103650222903874e+03, 1.103996920067033e+03, - 1.104342941839554e+03, 1.104688291180981e+03, 1.105032971030872e+03, 1.105376984308989e+03, 1.105720333915469e+03, - 1.106063022731012e+03, 1.106405053617048e+03, 1.106746429415915e+03, 1.107087152951033e+03, 1.107427227027069e+03, - 1.107766654430111e+03, 1.108105437927829e+03, 1.108443580269642e+03, 1.108781084186880e+03, 1.109117952392945e+03, - 1.109454187583471e+03, 1.109789792436477e+03, 1.110124769612528e+03, 1.110459121754883e+03, 1.110792851489652e+03, - 1.111125961425942e+03, 1.111458454156009e+03, 1.111790332255404e+03, 1.112121598283115e+03, 1.112452254781717e+03, - 1.112782304277510e+03, 1.113111749280658e+03, 1.113440592285333e+03, 1.113768835769849e+03, 1.114096482196800e+03, - 1.114423534013193e+03, 1.114749993650584e+03, 1.115075863525204e+03, 1.115401146038096e+03, 1.115725843575240e+03, - 1.116049958507683e+03, 1.116373493191661e+03, 1.116696449968729e+03, 1.117018831165881e+03, 1.117340639095673e+03, - 1.117661876056345e+03, 1.117982544331941e+03, 1.118302646192424e+03, 1.118622183893796e+03, 1.118941159678214e+03, - 1.119259575774104e+03, 1.119577434396275e+03, 1.119894737746028e+03, 1.120211488011274e+03, 1.120527687366639e+03 - }, - { - 1.741728375053458e+00, 5.314120505442629e+00, 8.956348641374943e+00, 1.267191336013246e+01, 1.646460349081462e+01, - 2.033852919503409e+01, 2.429816000673557e+01, 2.834836877129105e+01, 3.249448262535235e+01, 3.674234244260142e+01, - 4.109837251465464e+01, 4.556966269090073e+01, 5.016406579211682e+01, 5.489031389229089e+01, 5.975815810161417e+01, - 6.477853788260066e+01, 6.996378783864957e+01, 7.532789254890626e+01, 8.088680371411394e+01, 8.665883912927421e+01, - 9.266519059747959e+01, 9.893057910144233e+01, 1.054841124082500e+02, 1.123604262449665e+02, 1.196012312063083e+02, - 1.272574543105828e+02, 1.353922762488972e+02, 1.440855617316300e+02, 1.534405381457939e+02, 1.635942678381166e+02, - 1.747348740534539e+02, 1.871316179325121e+02, 2.011915983867612e+02, 2.175781987103068e+02, 2.374973861173002e+02, - 2.635667035564218e+02, 3.038625501683057e+02, 4.806304025070923e+02, 6.131723778719374e+02, 6.454701148335959e+02, - 6.660547262802207e+02, 6.815089489761624e+02, 6.940276068532737e+02, 7.046293961685642e+02, 7.138739965734985e+02, - 7.221030065846167e+02, 7.295407056919635e+02, 7.363425377636316e+02, 7.426208595427353e+02, 7.484596629644274e+02, - 7.539234927497058e+02, 7.590631052379453e+02, 7.639192002267218e+02, 7.685249632733555e+02, 7.729078465586872e+02, - 7.770908469404263e+02, 7.810934428761366e+02, 7.849322943381262e+02, 7.886217745492073e+02, 7.921743801041504e+02, - 7.956010516391838e+02, 7.989114276830152e+02, 8.021140478894411e+02, 8.052165174275424e+02, 8.082256412118306e+02, - 8.111475344578669e+02, 8.139877144666757e+02, 8.167511773867494e+02, 8.194424628496680e+02, 8.220657087382966e+02, - 8.246246978656754e+02, 8.271228979759559e+02, 8.295634961966523e+02, 8.319494288523848e+02, 8.342834073789102e+02, - 8.365679409410235e+02, 8.388053562504845e+02, 8.409978149942418e+02, 8.431473292140034e+02, 8.452557749221926e+02, - 8.473249041936463e+02, 8.493563559349898e+02, 8.513516655028074e+02, 8.533122733162317e+02, 8.552395325883064e+02, - 8.571347162828195e+02, 8.589990233883600e+02, 8.608335845888713e+02, 8.626394673993490e+02, 8.644176808263342e+02, - 8.661691796052137e+02, 8.678948680597363e+02, 8.695956036235987e+02, 8.712722000590633e+02, 8.729254304034292e+02, - 8.745560296705727e+02, 8.761646973316132e+02, 8.777520995960749e+02, 8.793188715124946e+02, 8.808656189054011e+02, - 8.823929201637125e+02, 8.839013278940520e+02, 8.853913704510389e+02, 8.868635533553864e+02, 8.883183606095422e+02, - 8.897562559196253e+02, 8.911776838315599e+02, 8.925830707885331e+02, 8.939728261162403e+02, 8.953473429417327e+02, - 8.967069990511936e+02, 8.980521576914280e+02, 8.993831683194544e+02, 9.007003673041785e+02, 9.020040785837764e+02, - 9.032946142821023e+02, 9.045722752871517e+02, 9.058373517943470e+02, 9.070901238171846e+02, 9.083308616675691e+02, - 9.095598264079747e+02, 9.107772702773855e+02, 9.119834370928327e+02, 9.131785626282600e+02, 9.143628749923389e+02, - 9.155365949915390e+02, 9.166999364072961e+02, 9.178531054145200e+02, 9.189963036028357e+02, 9.201297249554855e+02, - 9.212535579329505e+02, 9.223679853250901e+02, 9.234731843063030e+02, 9.245693273755169e+02, 9.256565814516307e+02, - 9.267351088350003e+02, 9.278050671981740e+02, 9.288666097645535e+02, 9.299198854784083e+02, 9.309650391644586e+02, - 9.320022116905931e+02, 9.330315401030213e+02, 9.340531577737681e+02, 9.350671945326457e+02, 9.360737767948482e+02, - 9.370730276827787e+02, 9.380650671424290e+02, 9.390500120545896e+02, 9.400279763411705e+02, 9.409990710669023e+02, - 9.419634045366276e+02, 9.429210823884479e+02, 9.438722076829066e+02, 9.448168809884298e+02, 9.457552004632045e+02, - 9.466872619336696e+02, 9.476131589828589e+02, 9.485329829691095e+02, 9.494468231559957e+02, 9.503547668108941e+02, - 9.512568991482393e+02, 9.521533034828481e+02, 9.530440612654538e+02, 9.539292521394221e+02, 9.548089539953043e+02, - 9.556832430233076e+02, 9.565521937637889e+02, 9.574158791558600e+02, 9.582743705841818e+02, 9.591277379240380e+02, - 9.599760495847627e+02, 9.608193725515824e+02, 9.616577724259658e+02, 9.624913134645150e+02, 9.633200586164890e+02, - 9.641440695600016e+02, 9.649634067369532e+02, 9.657781293867525e+02, 9.665882955788774e+02, 9.673939622443171e+02, - 9.681951852059568e+02, 9.689920192079277e+02, 9.697845179654694e+02, 9.705727341052842e+02, 9.713567193244319e+02, - 9.721365243265187e+02, 9.729121988692063e+02, 9.736837917882301e+02, 9.744513510206435e+02, 9.752149236273314e+02, - 9.759745558148001e+02, 9.767302929562892e+02, 9.774821796122226e+02, 9.782302595500222e+02, 9.789745757633123e+02, - 9.797151704905398e+02, 9.804520852330219e+02, 9.811853607724502e+02, 9.819150371878738e+02, 9.826411538721660e+02, - 9.833637495480133e+02, 9.840828622834288e+02, 9.847985295068046e+02, 9.855107880215390e+02, 9.862196740202365e+02, - 9.869252230984887e+02, 9.876274702682779e+02, 9.883264499709927e+02, 9.890221960900720e+02, 9.897147419633058e+02, - 9.904041203947791e+02, 9.910903636664981e+02, 9.917735035496863e+02, 9.924535713157782e+02, 9.931305977471071e+02, - 9.938046131473103e+02, 9.944756473514484e+02, 9.951437297358600e+02, 9.958088892277484e+02, 9.964711543145172e+02, - 9.971305530528612e+02, 9.977871130776194e+02, 9.984408616103930e+02, 9.990918254679525e+02, 9.997400310704139e+02, - 1.000385504449214e+03, 1.001028270768264e+03, 1.001668356259532e+03, 1.002305785365685e+03, 1.002940582639218e+03, - 1.003572772280899e+03, 1.004202378146612e+03, 1.004829423754034e+03, 1.005453932289148e+03, 1.006075926612605e+03, - 1.006695429265915e+03, 1.007312462477507e+03, 1.007927048168629e+03, 1.008539207959121e+03, 1.009148963173035e+03, - 1.009756334844137e+03, 1.010361343721271e+03, 1.010964010273598e+03, 1.011564354695719e+03, 1.012162396912674e+03, - 1.012758156584824e+03, 1.013351653112629e+03, 1.013942905641308e+03, 1.014531933065403e+03, 1.015118754033228e+03, - 1.015703386951228e+03, 1.016285849988238e+03, 1.016866161079643e+03, 1.017444337931450e+03, 1.018020398024269e+03, - 1.018594358617210e+03, 1.019166236751682e+03, 1.019736049255131e+03, 1.020303812744677e+03, 1.020869543630685e+03, - 1.021433258120248e+03, 1.021994972220614e+03, 1.022554701742518e+03, 1.023112462303462e+03, 1.023668269330912e+03, - 1.024222138065443e+03, 1.024774083563798e+03, 1.025324120701907e+03, 1.025872264177823e+03, 1.026418528514611e+03, - 1.026962928063174e+03, 1.027505477005013e+03, 1.028046189354948e+03, 1.028585078963766e+03, 1.029122159520832e+03, - 1.029657444556629e+03, 1.030190947445270e+03, 1.030722681406938e+03, 1.031252659510292e+03, 1.031780894674819e+03, - 1.032307399673146e+03, 1.032832187133298e+03, 1.033355269540918e+03, 1.033876659241445e+03, 1.034396368442244e+03, - 1.034914409214702e+03, 1.035430793496276e+03, 1.035945533092514e+03, 1.036458639679021e+03, 1.036970124803404e+03, - 1.037479999887169e+03, 1.037988276227589e+03, 1.038494964999534e+03, 1.039000077257265e+03, 1.039503623936201e+03, - 1.040005615854651e+03, 1.040506063715504e+03, 1.041004978107911e+03, 1.041502369508906e+03, 1.041998248285028e+03, - 1.042492624693890e+03, 1.042985508885734e+03, 1.043476910904948e+03, 1.043966840691568e+03, 1.044455308082740e+03, - 1.044942322814165e+03, 1.045427894521512e+03, 1.045912032741818e+03, 1.046394746914845e+03, 1.046876046384427e+03, - 1.047355940399794e+03, 1.047834438116863e+03, 1.048311548599515e+03, 1.048787280820845e+03, 1.049261643664399e+03, - 1.049734645925376e+03, 1.050206296311824e+03, 1.050676603445800e+03, 1.051145575864533e+03, 1.051613222021539e+03, - 1.052079550287742e+03, 1.052544568952562e+03, 1.053008286224988e+03, 1.053470710234637e+03, 1.053931849032793e+03, - 1.054391710593423e+03, 1.054850302814187e+03, 1.055307633517424e+03, 1.055763710451126e+03, 1.056218541289889e+03, - 1.056672133635860e+03, 1.057124495019657e+03, 1.057575632901285e+03, 1.058025554671027e+03, 1.058474267650325e+03, - 1.058921779092654e+03, 1.059368096184368e+03, 1.059813226045545e+03, 1.060257175730812e+03, 1.060699952230158e+03, - 1.061141562469739e+03, 1.061582013312661e+03, 1.062021311559758e+03, 1.062459463950361e+03, 1.062896477163044e+03, - 1.063332357816365e+03, 1.063767112469602e+03, 1.064200747623464e+03, 1.064633269720801e+03, 1.065064685147300e+03, - 1.065495000232172e+03, 1.065924221248826e+03, 1.066352354415535e+03, 1.066779405896089e+03, 1.067205381800444e+03, - 1.067630288185358e+03, 1.068054131055012e+03, 1.068476916361633e+03, 1.068898650006097e+03, 1.069319337838532e+03, - 1.069738985658905e+03, 1.070157599217608e+03, 1.070575184216022e+03, 1.070991746307093e+03, 1.071407291095879e+03, - 1.071821824140102e+03, 1.072235350950690e+03, 1.072647876992308e+03, 1.073059407683880e+03, 1.073469948399113e+03, - 1.073879504467001e+03, 1.074288081172331e+03, 1.074695683756178e+03, 1.075102317416393e+03, 1.075507987308087e+03, - 1.075912698544102e+03, 1.076316456195482e+03, 1.076719265291938e+03, 1.077121130822294e+03, 1.077522057734948e+03, - 1.077922050938306e+03, 1.078321115301219e+03, 1.078719255653420e+03, 1.079116476785945e+03, 1.079512783451548e+03, - 1.079908180365124e+03, 1.080302672204105e+03, 1.080696263608872e+03, 1.081088959183145e+03, 1.081480763494379e+03, - 1.081871681074147e+03, 1.082261716418521e+03, 1.082650873988450e+03, 1.083039158210128e+03, 1.083426573475361e+03, - 1.083813124141929e+03, 1.084198814533941e+03, 1.084583648942186e+03, 1.084967631624481e+03, 1.085350766806012e+03, - 1.085733058679675e+03, 1.086114511406403e+03, 1.086495129115504e+03, 1.086874915904976e+03, 1.087253875841836e+03, - 1.087632012962432e+03, 1.088009331272756e+03, 1.088385834748754e+03, 1.088761527336627e+03, 1.089136412953134e+03, - 1.089510495485892e+03, 1.089883778793660e+03, 1.090256266706638e+03, 1.090627963026745e+03, 1.090998871527907e+03, - 1.091368995956330e+03, 1.091738340030778e+03, 1.092106907442846e+03, 1.092474701857224e+03, 1.092841726911966e+03, - 1.093207986218746e+03, 1.093573483363123e+03, 1.093938221904792e+03, 1.094302205377836e+03, 1.094665437290975e+03, - 1.095027921127815e+03, 1.095389660347085e+03, 1.095750658382883e+03, 1.096110918644908e+03, 1.096470444518696e+03, - 1.096829239365852e+03, 1.097187306524278e+03, 1.097544649308396e+03, 1.097901271009378e+03, 1.098257174895356e+03, - 1.098612364211650e+03, 1.098966842180976e+03, 1.099320612003661e+03, 1.099673676857855e+03, 1.100026039899735e+03, - 1.100377704263711e+03, 1.100728673062631e+03, 1.101078949387977e+03, 1.101428536310069e+03, 1.101777436878256e+03, - 1.102125654121109e+03, 1.102473191046615e+03, 1.102820050642365e+03, 1.103166235875740e+03, 1.103511749694095e+03, - 1.103856595024944e+03, 1.104200774776138e+03, 1.104544291836043e+03, 1.104887149073719e+03, 1.105229349339090e+03, - 1.105570895463123e+03, 1.105911790257989e+03, 1.106252036517241e+03, 1.106591637015973e+03, 1.106930594510988e+03, - 1.107268911740961e+03, 1.107606591426598e+03, 1.107943636270799e+03, 1.108280048958810e+03, 1.108615832158383e+03, - 1.108950988519927e+03, 1.109285520676661e+03, 1.109619431244767e+03, 1.109952722823535e+03, 1.110285397995512e+03, - 1.110617459326649e+03, 1.110948909366440e+03, 1.111279750648072e+03, 1.111609985688559e+03, 1.111939616988886e+03, - 1.112268647034142e+03, 1.112597078293662e+03, 1.112924913221158e+03, 1.113252154254852e+03, 1.113578803817613e+03, - 1.113904864317081e+03, 1.114230338145799e+03, 1.114555227681343e+03, 1.114879535286443e+03, 1.115203263309116e+03, - 1.115526414082779e+03, 1.115848989926385e+03, 1.116170993144529e+03, 1.116492426027580e+03, 1.116813290851795e+03, - 1.117133589879434e+03, 1.117453325358881e+03, 1.117772499524756e+03, 1.118091114598027e+03, 1.118409172786127e+03 - }, - { - 1.735837913559893e+00, 5.295581014340208e+00, 8.924096098888631e+00, 1.262478018938092e+01, 1.640130556540408e+01, - 2.025765078852565e+01, 2.419813628783695e+01, 2.822746535368524e+01, 3.235077156361812e+01, 3.657367391405241e+01, - 4.090234123116258e+01, 4.534356782910446e+01, 4.990486289364432e+01, 5.459455673758011e+01, 5.942192795850151e+01, - 6.439735671155678e+01, 6.953251090847398e+01, 7.484057434255196e+01, 8.033652877552350e+01, 8.603750629589238e+01, - 9.196323436981072e+01, 9.813660489791276e+01, 1.045844117797398e+02, 1.113383214654397e+02, 1.184361719611295e+02, - 1.259237451073973e+02, 1.338572379802315e+02, 1.423067966738733e+02, 1.513617192838598e+02, 1.611383841755784e+02, - 1.717928398483338e+02, 1.835418296940128e+02, 1.967001891142653e+02, 2.117530193151645e+02, 2.295111982984277e+02, - 2.515038588019423e+02, 2.812505498218775e+02, 3.309214294202027e+02, 5.100142118739390e+02, 6.020082486345009e+02, - 6.355017484186912e+02, 6.570334868721310e+02, 6.731765246809979e+02, 6.862190992384614e+02, 6.972357686759511e+02, - 7.068194539833491e+02, 7.153326151035200e+02, 7.230132781254056e+02, 7.300263148682412e+02, 7.364907643227039e+02, - 7.424954872795790e+02, 7.481086612208386e+02, 7.533838098374637e+02, 7.583637802524823e+02, 7.630834520335953e+02, - 7.675716338960540e+02, 7.718524238553307e+02, 7.759462053729383e+02, 7.798703906784768e+02, 7.836399847869445e+02, - 7.872680199519266e+02, 7.907658949046414e+02, 7.941436430428625e+02, 7.974101468557177e+02, 8.005733111409419e+02, - 8.036402042647568e+02, 8.066171743675550e+02, 8.095099457291507e+02, 8.123236992754389e+02, 8.150631402990271e+02, - 8.177325557877964e+02, 8.203358632435270e+02, 8.228766524828380e+02, 8.253582216130106e+02, 8.277836081428915e+02, - 8.301556160073644e+02, 8.324768391407692e+02, 8.347496821210597e+02, 8.369763783156757e+02, 8.391590058871892e+02, - 8.412995019576051e+02, 8.433996751821597e+02, 8.454612169440793e+02, 8.474857113493312e+02, 8.494746441736520e+02, - 8.514294108918184e+02, 8.533513239005702e+02, 8.552416190309926e+02, 8.571014614330519e+02, 8.589319509038697e+02, - 8.607341267219387e+02, 8.625089720414350e+02, 8.642574178939892e+02, 8.659803468393386e+02, 8.676785963013074e+02, - 8.693529616211820e+02, 8.710041988567580e+02, 8.726330273521309e+02, 8.742401321003996e+02, 8.758261659190346e+02, - 8.773917514554531e+02, 8.789374830384695e+02, 8.804639283896364e+02, 8.819716302069999e+02, 8.834611076325217e+02, - 8.849328576132688e+02, 8.863873561654751e+02, 8.878250595496645e+02, 8.892464053642402e+02, 8.906518135642360e+02, - 8.920416874112860e+02, 8.934164143603108e+02, 8.947763668879142e+02, 8.961219032670190e+02, 8.974533682918814e+02, - 8.987710939572432e+02, 9.000754000950585e+02, 9.013665949719456e+02, 9.026449758502187e+02, 9.039108295151425e+02, - 9.051644327708202e+02, 9.064060529069206e+02, 9.076359481382912e+02, 9.088543680193105e+02, 9.100615538379757e+02, - 9.112577390224913e+02, 9.124431494748175e+02, 9.136180038712724e+02, 9.147825127921666e+02, 9.159368828249632e+02, - 9.170813121346795e+02, 9.182159933893699e+02, 9.193411134339563e+02, 9.204568533616368e+02, 9.215633894226800e+02, - 9.226608921844527e+02, 9.237495274588575e+02, 9.248294563089856e+02, 9.259008352330949e+02, 9.269638163396667e+02, - 9.280185475140697e+02, 9.290651725772965e+02, 9.301038314328325e+02, 9.311346602273072e+02, 9.321577914649645e+02, - 9.331733541534124e+02, 9.341814739255290e+02, 9.351822731591581e+02, 9.361758710914785e+02, 9.371623839283320e+02, - 9.381419249487801e+02, 9.391146046051258e+02, 9.400805306186502e+02, 9.410398080712745e+02, 9.419925394933560e+02, - 9.429388249478163e+02, 9.438787621244096e+02, 9.448124463400762e+02, 9.457399707851794e+02, 9.466614264040561e+02, - 9.475769020681855e+02, 9.484864846188768e+02, 9.493902589303054e+02, 9.502883079700738e+02, 9.511807128574313e+02, - 9.520675529192539e+02, 9.529489057438869e+02, 9.538248472329501e+02, 9.546954516512000e+02, 9.555607916745333e+02, - 9.564209384362135e+02, 9.572759615714075e+02, 9.581259292600938e+02, 9.589709082684271e+02, 9.598109639886212e+02, - 9.606461604773988e+02, 9.614765604931064e+02, 9.623022255315057e+02, 9.631232158811730e+02, 9.639395905723921e+02, - 9.647514075378135e+02, 9.655587235567416e+02, 9.663615943072250e+02, 9.671600743951209e+02, 9.679542173821836e+02, - 9.687440758132281e+02, 9.695297012423988e+02, 9.703111442585837e+02, 9.710884545099998e+02, 9.718616807279972e+02, - 9.726308707500885e+02, 9.733960715422606e+02, 9.741573292205712e+02, 9.749146890720803e+02, 9.756681955751193e+02, - 9.764178924189415e+02, 9.771638225227659e+02, 9.779060280542383e+02, 9.786445504473381e+02, 9.793794304197394e+02, - 9.801107079896592e+02, 9.808384224921977e+02, 9.815626125952022e+02, 9.822833163146593e+02, 9.830005710296455e+02, - 9.837144134968345e+02, 9.844248798645972e+02, 9.851320056866873e+02, 9.858358259355476e+02, 9.865363750152289e+02, - 9.872336867739593e+02, 9.879277945163450e+02, 9.886187310152491e+02, 9.893065285233321e+02, 9.899912187842764e+02, - 9.906728330437061e+02, 9.913514020598141e+02, 9.920269561136940e+02, 9.926995250194029e+02, 9.933691381337501e+02, - 9.940358243658309e+02, 9.946996121863040e+02, 9.953605296364301e+02, 9.960186043368725e+02, 9.966738634962704e+02, - 9.973263339195898e+02, 9.979760415329843e+02, 9.986230133062957e+02, 9.992672744162968e+02, 9.999088501325956e+02, - 1.000547765359803e+03, 1.001184044644693e+03, 1.001817712183193e+03, 1.002448791827186e+03, 1.003077307091166e+03, - 1.003703281158710e+03, 1.004326736888804e+03, 1.004947696822024e+03, 1.005566183186544e+03, 1.006182217904030e+03, - 1.006795822595366e+03, 1.007407018586267e+03, 1.008015826912743e+03, 1.008622268326447e+03, 1.009226363299890e+03, - 1.009828132031539e+03, 1.010427594450798e+03, 1.011024770222868e+03, 1.011619678753507e+03, 1.012212339193671e+03, - 1.012802770444055e+03, 1.013390991159534e+03, 1.013977019753496e+03, 1.014560874402090e+03, 1.015142573048368e+03, - 1.015722133406342e+03, 1.016299572964955e+03, 1.016874908991953e+03, 1.017448158537686e+03, 1.018019338438818e+03, - 1.018588465321960e+03, 1.019155555607226e+03, 1.019720625511709e+03, 1.020283691052888e+03, 1.020844768051955e+03, - 1.021403872137085e+03, 1.021961018746621e+03, 1.022516223132208e+03, 1.023069500361847e+03, 1.023620865322900e+03, - 1.024170332725021e+03, 1.024717917103034e+03, 1.025263632819749e+03, 1.025807494068725e+03, 1.026349514876966e+03, - 1.026889709107579e+03, 1.027428090462364e+03, 1.027964672484360e+03, 1.028499468560335e+03, 1.029032491923236e+03, - 1.029563755654579e+03, 1.030093272686799e+03, 1.030621055805550e+03, 1.031147117651967e+03, 1.031671470724877e+03, - 1.032194127382965e+03, 1.032715099846912e+03, 1.033234400201475e+03, 1.033752040397540e+03, 1.034268032254126e+03, - 1.034782387460360e+03, 1.035295117577413e+03, 1.035806234040387e+03, 1.036315748160189e+03, 1.036823671125349e+03, - 1.037330014003820e+03, 1.037834787744733e+03, 1.038338003180125e+03, 1.038839671026638e+03, 1.039339801887178e+03, - 1.039838406252557e+03, 1.040335494503091e+03, 1.040831076910179e+03, 1.041325163637850e+03, 1.041817764744282e+03, - 1.042308890183292e+03, 1.042798549805809e+03, 1.043286753361306e+03, 1.043773510499218e+03, 1.044258830770332e+03, - 1.044742723628151e+03, 1.045225198430236e+03, 1.045706264439521e+03, 1.046185930825613e+03, 1.046664206666061e+03, - 1.047141100947607e+03, 1.047616622567420e+03, 1.048090780334295e+03, 1.048563582969851e+03, 1.049035039109690e+03, - 1.049505157304552e+03, 1.049973946021437e+03, 1.050441413644720e+03, 1.050907568477237e+03, 1.051372418741365e+03, - 1.051835972580068e+03, 1.052298238057940e+03, 1.052759223162226e+03, 1.053218935803823e+03, 1.053677383818267e+03, - 1.054134574966707e+03, 1.054590516936859e+03, 1.055045217343945e+03, 1.055498683731616e+03, 1.055950923572867e+03, - 1.056401944270928e+03, 1.056851753160145e+03, 1.057300357506849e+03, 1.057747764510206e+03, 1.058193981303061e+03, - 1.058639014952760e+03, 1.059082872461965e+03, 1.059525560769454e+03, 1.059967086750912e+03, 1.060407457219703e+03, - 1.060846678927633e+03, 1.061284758565709e+03, 1.061721702764871e+03, 1.062157518096725e+03, 1.062592211074262e+03, - 1.063025788152562e+03, 1.063458255729493e+03, 1.063889620146392e+03, 1.064319887688746e+03, 1.064749064586854e+03, - 1.065177157016481e+03, 1.065604171099506e+03, 1.066030112904555e+03, 1.066454988447630e+03, 1.066878803692722e+03, - 1.067301564552422e+03, 1.067723276888521e+03, 1.068143946512593e+03, 1.068563579186586e+03, 1.068982180623386e+03, - 1.069399756487388e+03, 1.069816312395050e+03, 1.070231853915440e+03, 1.070646386570776e+03, 1.071059915836964e+03, - 1.071472447144116e+03, 1.071883985877072e+03, 1.072294537375908e+03, 1.072704106936438e+03, 1.073112699810715e+03, - 1.073520321207513e+03, 1.073926976292812e+03, 1.074332670190274e+03, 1.074737407981708e+03, 1.075141194707537e+03, - 1.075544035367250e+03, 1.075945934919850e+03, 1.076346898284299e+03, 1.076746930339957e+03, 1.077146035927007e+03, - 1.077544219846886e+03, 1.077941486862699e+03, 1.078337841699637e+03, 1.078733289045380e+03, 1.079127833550503e+03, - 1.079521479828871e+03, 1.079914232458032e+03, 1.080306095979601e+03, 1.080697074899643e+03, 1.081087173689047e+03, - 1.081476396783897e+03, 1.081864748585842e+03, 1.082252233462451e+03, 1.082638855747574e+03, 1.083024619741692e+03, - 1.083409529712262e+03, 1.083793589894065e+03, 1.084176804489538e+03, 1.084559177669110e+03, 1.084940713571533e+03, - 1.085321416304204e+03, 1.085701289943489e+03, 1.086080338535034e+03, 1.086458566094086e+03, 1.086835976605794e+03, - 1.087212574025517e+03, 1.087588362279127e+03, 1.087963345263298e+03, 1.088337526845809e+03, 1.088710910865828e+03, - 1.089083501134197e+03, 1.089455301433717e+03, 1.089826315519426e+03, 1.090196547118871e+03, 1.090565999932386e+03, - 1.090934677633354e+03, 1.091302583868476e+03, 1.091669722258031e+03, 1.092036096396133e+03, 1.092401709850993e+03, - 1.092766566165162e+03, 1.093130668855785e+03, 1.093494021414847e+03, 1.093856627309417e+03, 1.094218489981885e+03, - 1.094579612850199e+03, 1.094939999308105e+03, 1.095299652725370e+03, 1.095658576448017e+03, 1.096016773798552e+03, - 1.096374248076177e+03, 1.096731002557025e+03, 1.097087040494367e+03, 1.097442365118829e+03, 1.097796979638612e+03, - 1.098150887239692e+03, 1.098504091086035e+03, 1.098856594319800e+03, 1.099208400061540e+03, 1.099559511410407e+03, - 1.099909931444346e+03, 1.100259663220292e+03, 1.100608709774366e+03, 1.100957074122061e+03, 1.101304759258439e+03, - 1.101651768158310e+03, 1.101998103776420e+03, 1.102343769047636e+03, 1.102688766887124e+03, 1.103033100190526e+03, - 1.103376771834139e+03, 1.103719784675092e+03, 1.104062141551511e+03, 1.104403845282695e+03, 1.104744898669286e+03, - 1.105085304493430e+03, 1.105425065518947e+03, 1.105764184491489e+03, 1.106102664138708e+03, 1.106440507170407e+03, - 1.106777716278707e+03, 1.107114294138193e+03, 1.107450243406075e+03, 1.107785566722338e+03, 1.108120266709894e+03, - 1.108454345974728e+03, 1.108787807106047e+03, 1.109120652676429e+03, 1.109452885241960e+03, 1.109784507342385e+03, - 1.110115521501244e+03, 1.110445930226010e+03, 1.110775736008231e+03, 1.111104941323667e+03, 1.111433548632419e+03, - 1.111761560379071e+03, 1.112088978992814e+03, 1.112415806887583e+03, 1.112742046462181e+03, 1.113067700100414e+03, - 1.113392770171211e+03, 1.113717259028751e+03, 1.114041169012587e+03, 1.114364502447773e+03, 1.114687261644978e+03, - 1.115009448900610e+03, 1.115331066496936e+03, 1.115652116702196e+03, 1.115972601770723e+03, 1.116292523943053e+03 - }, - { - 1.729987798503735e+00, 5.277176644957937e+00, 8.892093498963909e+00, 1.257803517227251e+01, 1.633856135837603e+01, - 2.017752373256750e+01, 2.409909924725054e+01, 2.810782838605187e+01, 3.220865929548985e+01, 3.640699893248600e+01, - 4.070877262753024e+01, 4.512049380604636e+01, 4.964934605066946e+01, 5.430328026041363e+01, 5.909113041600263e+01, - 6.402275246044820e+01, 6.910919214531842e+01, 7.436288951368294e+01, 7.979793019277135e+01, 8.543035715503558e+01, - 9.127856153448559e+01, 9.736377816618179e+01, 1.037107218728110e+02, 1.103484159667842e+02, 1.173112879739240e+02, - 1.246406443345001e+02, 1.323866948189132e+02, 1.406113948172294e+02, 1.493925412037841e+02, 1.588298554555800e+02, - 1.690543470897725e+02, 1.802433578359926e+02, 1.926460376153335e+02, 2.066294323280396e+02, 2.227693243337327e+02, - 2.420513223806203e+02, 2.663967261038890e+02, 3.004476502118789e+02, 3.612309549606103e+02, 5.162696131556235e+02, - 5.921725351639860e+02, 6.260848581913968e+02, 6.483185367389125e+02, 6.650437401642084e+02, 6.785546980380566e+02, - 6.899539398096650e+02, 6.998563350682621e+02, 7.086399265549450e+02, 7.165537811293974e+02, 7.237707183754324e+02, - 7.304156081528985e+02, 7.365816694719249e+02, 7.423403946816956e+02, 7.477478699062126e+02, 7.528489529788644e+02, - 7.576801233401310e+02, 7.622714792349831e+02, 7.666481706239285e+02, 7.708314487370909e+02, 7.748394491065400e+02, - 7.786877854653192e+02, 7.823900069416261e+02, 7.859579547901691e+02, 7.894020441731222e+02, 7.927314892487836e+02, - 7.959544848328245e+02, 7.990783544035663e+02, 8.021096717418175e+02, 8.050543617094013e+02, 8.079177843677430e+02, - 8.107048056764739e+02, 8.134198572946201e+02, 8.160669874660477e+02, 8.186499045590722e+02, 8.211720145137850e+02, - 8.236364532055111e+02, 8.260461145412792e+02, 8.284036749554347e+02, 8.307116148509739e+02, 8.329722374377254e+02, - 8.351876853417804e+02, 8.373599552985770e+02, 8.394909111915425e+02, 8.415822956569857e+02, 8.436357404419522e+02, - 8.456527756737316e+02, 8.476348381764261e+02, 8.495832789505403e+02, 8.514993699152963e+02, 8.533843099996720e+02, - 8.552392306565937e+02, 8.570652008649099e+02, 8.588632316754167e+02, 8.606342803500913e+02, 8.623792541375768e+02, - 8.640990137226939e+02, 8.657943763832820e+02, 8.674661188836877e+02, 8.691149801308950e+02, 8.707416636163031e+02, - 8.723468396635835e+02, 8.739311475008485e+02, 8.754951971733232e+02, 8.770395713110673e+02, 8.785648267646992e+02, - 8.800714961207979e+02, 8.815600891074301e+02, 8.830310938992222e+02, 8.844849783304775e+02, 8.859221910239813e+02, - 8.873431624424367e+02, 8.887483058688059e+02, 8.901380183212249e+02, 8.915126814076832e+02, 8.928726621251351e+02, - 8.942183136073414e+02, 8.955499758253191e+02, 8.968679762439594e+02, 8.981726304380697e+02, 8.994642426707915e+02, - 9.007431064371407e+02, 9.020095049751377e+02, 9.032637117468370e+02, 9.045059908913431e+02, 9.057365976517779e+02, - 9.069557787946167e+02, 9.081637730196155e+02, 9.093608112776520e+02, 9.105471162808049e+02, 9.117229053658149e+02, - 9.128883877536636e+02, 9.140437665207562e+02, 9.151892385115142e+02, 9.163249944207338e+02, 9.174512197596982e+02, - 9.185680939748288e+02, 9.196757914329157e+02, 9.207744814330799e+02, 9.218643284057571e+02, 9.229454921019188e+02, - 9.240181277731066e+02, 9.250823863428059e+02, 9.261384145696577e+02, 9.271863552029715e+02, 9.282263471309723e+02, - 9.292585255144724e+02, 9.302830219508370e+02, 9.312999645615596e+02, 9.323094781412798e+02, 9.333116842690903e+02, - 9.343067014208377e+02, 9.352946450765091e+02, 9.362756278229543e+02, 9.372497594521883e+02, 9.382171470555043e+02, - 9.391778951136087e+02, 9.401321055624318e+02, 9.410798779724076e+02, 9.420213094474316e+02, 9.429564948685339e+02, - 9.438855268896654e+02, 9.448084960219194e+02, 9.457254907008424e+02, 9.466365973510838e+02, 9.475419004485043e+02, - 9.484414825798843e+02, 9.493354245003172e+02, 9.502238051884161e+02, 9.511067018994206e+02, 9.519841902163067e+02, - 9.528563440989864e+02, 9.537232359316856e+02, 9.545849365685738e+02, 9.554415153777362e+02, 9.562930403037972e+02, - 9.571395778266740e+02, 9.579811931258456e+02, 9.588179500339024e+02, 9.596499110946406e+02, 9.604771375984412e+02, - 9.612996896164336e+02, 9.621176260334804e+02, 9.629310045800337e+02, 9.637398818629138e+02, 9.645443133950563e+02, - 9.653443536242587e+02, 9.661400559609735e+02, 9.669314728051951e+02, 9.677186555724530e+02, 9.685016547189689e+02, - 9.692805197660039e+02, 9.700552993234161e+02, 9.708260411124787e+02, 9.715927919879688e+02, 9.723555979595656e+02, - 9.731145042125839e+02, 9.738695551280575e+02, 9.746207943022090e+02, 9.753682645653272e+02, 9.761120080000634e+02, - 9.768520659591791e+02, 9.775884790827620e+02, 9.783212873149287e+02, 9.790505299200282e+02, 9.797762454983759e+02, - 9.804984720015181e+02, 9.812172467470630e+02, 9.819326064330751e+02, 9.826445871520592e+02, 9.833532244045465e+02, - 9.840585531122922e+02, 9.847606076311060e+02, 9.854594217633158e+02, 9.861550287698922e+02, 9.868474613822298e+02, - 9.875367518136103e+02, 9.882229317703485e+02, 9.889060324626345e+02, 9.895860846150863e+02, 9.902631184770133e+02, - 9.909371638324116e+02, 9.916082500096861e+02, 9.922764058911229e+02, 9.929416599221087e+02, 9.936040401201109e+02, - 9.942635740834181e+02, 9.949202885200956e+02, 9.955742111559719e+02, 9.962253679206392e+02, 9.968737848187271e+02, - 9.975194874761673e+02, 9.981625011476799e+02, 9.988028507240801e+02, 9.994405607393959e+02, 1.000075655377819e+03, - 1.000708158480468e+03, 1.001338093552008e+03, 1.001965483767091e+03, 1.002590351976648e+03, 1.003212720714026e+03, - 1.003832612200987e+03, 1.004450048353548e+03, 1.005065050787696e+03, 1.005677640824963e+03, 1.006287839497871e+03, - 1.006895667555242e+03, 1.007501145467402e+03, 1.008104293431246e+03, 1.008705131375198e+03, 1.009303678964049e+03, - 1.009899955603696e+03, 1.010493980445760e+03, 1.011085772392110e+03, 1.011675350099280e+03, 1.012262731982790e+03, - 1.012847936221368e+03, 1.013430980761083e+03, 1.014011883319378e+03, 1.014590661389030e+03, 1.015167332242000e+03, - 1.015741912933229e+03, 1.016314420304323e+03, 1.016884870987178e+03, 1.017453281407520e+03, 1.018019667788370e+03, - 1.018584046153435e+03, 1.019146432330428e+03, 1.019706841954321e+03, 1.020265290470521e+03, 1.020821793137992e+03, - 1.021376365032301e+03, 1.021929021048609e+03, 1.022479775904595e+03, 1.023028644143322e+03, 1.023575640136048e+03, - 1.024120778084973e+03, 1.024664072025936e+03, 1.025205535831053e+03, 1.025745183211310e+03, 1.026283027719094e+03, - 1.026819082750682e+03, 1.027353361548673e+03, 1.027885877204382e+03, 1.028416642660178e+03, 1.028945670711780e+03, - 1.029472974010509e+03, 1.029998565065496e+03, 1.030522456245841e+03, 1.031044659782745e+03, 1.031565187771585e+03, - 1.032084052173961e+03, 1.032601264819699e+03, 1.033116837408813e+03, 1.033630781513440e+03, 1.034143108579730e+03, - 1.034653829929702e+03, 1.035162956763068e+03, 1.035670500159023e+03, 1.036176471077996e+03, 1.036680880363383e+03, - 1.037183738743229e+03, 1.037685056831894e+03, 1.038184845131685e+03, 1.038683114034453e+03, 1.039179873823169e+03, - 1.039675134673468e+03, 1.040168906655163e+03, 1.040661199733738e+03, 1.041152023771807e+03, 1.041641388530554e+03, - 1.042129303671145e+03, 1.042615778756112e+03, 1.043100823250718e+03, 1.043584446524297e+03, 1.044066657851565e+03, - 1.044547466413917e+03, 1.045026881300698e+03, 1.045504911510448e+03, 1.045981565952133e+03, 1.046456853446347e+03, - 1.046930782726503e+03, 1.047403362439996e+03, 1.047874601149348e+03, 1.048344507333339e+03, 1.048813089388111e+03, - 1.049280355628256e+03, 1.049746314287894e+03, 1.050210973521722e+03, 1.050674341406049e+03, 1.051136425939817e+03, - 1.051597235045605e+03, 1.052056776570611e+03, 1.052515058287626e+03, 1.052972087895985e+03, 1.053427873022508e+03, - 1.053882421222423e+03, 1.054335739980272e+03, 1.054787836710811e+03, 1.055238718759883e+03, 1.055688393405289e+03, - 1.056136867857640e+03, 1.056584149261193e+03, 1.057030244694678e+03, 1.057475161172111e+03, 1.057918905643591e+03, - 1.058361484996094e+03, 1.058802906054240e+03, 1.059243175581061e+03, 1.059682300278753e+03, 1.060120286789413e+03, - 1.060557141695768e+03, 1.060992871521894e+03, 1.061427482733920e+03, 1.061860981740727e+03, 1.062293374894628e+03, - 1.062724668492051e+03, 1.063154868774192e+03, 1.063583981927680e+03, 1.064012014085218e+03, 1.064438971326218e+03, - 1.064864859677425e+03, 1.065289685113539e+03, 1.065713453557817e+03, 1.066136170882673e+03, 1.066557842910270e+03, - 1.066978475413099e+03, 1.067398074114552e+03, 1.067816644689485e+03, 1.068234192764777e+03, 1.068650723919877e+03, - 1.069066243687342e+03, 1.069480757553372e+03, 1.069894270958335e+03, 1.070306789297283e+03, 1.070718317920461e+03, - 1.071128862133811e+03, 1.071538427199471e+03, 1.071947018336256e+03, 1.072354640720148e+03, 1.072761299484763e+03, - 1.073166999721826e+03, 1.073571746481630e+03, 1.073975544773492e+03, 1.074378399566200e+03, 1.074780315788459e+03, - 1.075181298329326e+03, 1.075581352038644e+03, 1.075980481727458e+03, 1.076378692168447e+03, 1.076775988096327e+03, - 1.077172374208261e+03, 1.077567855164267e+03, 1.077962435587609e+03, 1.078356120065188e+03, 1.078748913147930e+03, - 1.079140819351172e+03, 1.079531843155028e+03, 1.079921989004767e+03, 1.080311261311179e+03, 1.080699664450932e+03, - 1.081087202766931e+03, 1.081473880568672e+03, 1.081859702132583e+03, 1.082244671702374e+03, 1.082628793489369e+03, - 1.083012071672843e+03, 1.083394510400350e+03, 1.083776113788047e+03, 1.084156885921022e+03, 1.084536830853599e+03, - 1.084915952609658e+03, 1.085294255182946e+03, 1.085671742537374e+03, 1.086048418607325e+03, 1.086424287297948e+03, - 1.086799352485451e+03, 1.087173618017390e+03, 1.087547087712958e+03, 1.087919765363263e+03, 1.088291654731611e+03, - 1.088662759553780e+03, 1.089033083538289e+03, 1.089402630366668e+03, 1.089771403693729e+03, 1.090139407147816e+03, - 1.090506644331076e+03, 1.090873118819706e+03, 1.091238834164209e+03, 1.091603793889640e+03, 1.091968001495859e+03, - 1.092331460457767e+03, 1.092694174225547e+03, 1.093056146224907e+03, 1.093417379857309e+03, 1.093777878500203e+03, - 1.094137645507253e+03, 1.094496684208567e+03, 1.094854997910918e+03, 1.095212589897967e+03, 1.095569463430474e+03, - 1.095925621746526e+03, 1.096281068061738e+03, 1.096635805569468e+03, 1.096989837441028e+03, 1.097343166825883e+03, - 1.097695796851861e+03, 1.098047730625347e+03, 1.098398971231488e+03, 1.098749521734382e+03, 1.099099385177278e+03, - 1.099448564582765e+03, 1.099797062952959e+03, 1.100144883269694e+03, 1.100492028494705e+03, 1.100838501569811e+03, - 1.101184305417096e+03, 1.101529442939087e+03, 1.101873917018932e+03, 1.102217730520571e+03, 1.102560886288916e+03, - 1.102903387150015e+03, 1.103245235911220e+03, 1.103586435361361e+03, 1.103926988270905e+03, 1.104266897392118e+03, - 1.104606165459235e+03, 1.104944795188609e+03, 1.105282789278875e+03, 1.105620150411105e+03, 1.105956881248958e+03, - 1.106292984438842e+03, 1.106628462610054e+03, 1.106963318374937e+03, 1.107297554329023e+03, 1.107631173051182e+03, - 1.107964177103764e+03, 1.108296569032744e+03, 1.108628351367862e+03, 1.108959526622761e+03, 1.109290097295127e+03, - 1.109620065866830e+03, 1.109949434804048e+03, 1.110278206557414e+03, 1.110606383562136e+03, 1.110933968238138e+03, - 1.111260962990184e+03, 1.111587370208006e+03, 1.111913192266436e+03, 1.112238431525521e+03, 1.112563090330661e+03, - 1.112887171012720e+03, 1.113210675888151e+03, 1.113533607259121e+03, 1.113855967413623e+03, 1.114177758625597e+03 - }, - { - 1.724177607221449e+00, 5.258905831275927e+00, 8.860337663142060e+00, 1.253167292680827e+01, 1.627636253917708e+01, - 2.009813580834798e+01, 2.400103159110743e+01, 2.798943399785579e+01, 3.206811346932145e+01, 3.624227424270572e+01, - 4.051760945287175e+01, 4.490036541196314e+01, 4.939741699090426e+01, 5.401635651821972e+01, 5.876559925383609e+01, - 6.365450934186509e+01, 6.869355127308582e+01, 7.389447340430785e+01, 7.927053214699430e+01, 8.483676828602360e+01, - 9.061035087293615e+01, 9.661100979294302e+01, 1.028615862655192e+02, 1.093887425288526e+02, 1.162238899299942e+02, - 1.234044221798127e+02, 1.309753837965445e+02, 1.389917734912682e+02, 1.475217988763447e+02, 1.566515994762434e+02, - 1.664923173697331e+02, 1.771910790955370e+02, 1.889488241183972e+02, 2.020508626887966e+02, 2.169229498084117e+02, - 2.342436868767631e+02, 2.551982372448252e+02, 2.821549324703853e+02, 3.209675047633074e+02, 3.919221786670004e+02, - 5.184272067239912e+02, 5.836658560802897e+02, 6.173091909882341e+02, 6.399735114456919e+02, 6.571550568790155e+02, - 6.710666529292480e+02, 6.828081805101423e+02, 6.930035376700025e+02, 7.020401216729900e+02, 7.101747576190517e+02, - 7.175863713563465e+02, 7.244045807229529e+02, 7.307263013153953e+02, 7.366259224560539e+02, 7.421618206241862e+02, - 7.473806820419481e+02, 7.523204603713392e+02, 7.570124543686647e+02, 7.614828011413581e+02, 7.657535712626618e+02, - 7.698435864576226e+02, 7.737690400660512e+02, 7.775439747617047e+02, 7.811806552692163e+02, 7.846898626938856e+02, - 7.880811295383260e+02, 7.913629292786241e+02, 7.945428307271575e+02, 7.976276248166075e+02, 8.006234295707101e+02, - 8.035357776630965e+02, 8.063696899581158e+02, 8.091297376755082e+02, 8.118200952535929e+02, 8.144445855538760e+02, - 8.170067187182026e+02, 8.195097257326148e+02, 8.219565875513210e+02, 8.243500604762708e+02, 8.266926983625890e+02, - 8.289868721202847e+02, 8.312347869023604e+02, 8.334384973046190e+02, 8.355999208497817e+02, 8.377208499853966e+02, - 8.398029627896574e+02, 8.418478325499909e+02, 8.438569363549906e+02, 8.458316628200873e+02, 8.477733190503367e+02, - 8.496831369295379e+02, 8.515622788128086e+02, 8.534118426895717e+02, 8.552328668752580e+02, 8.570263342825923e+02, - 8.587931763170346e+02, 8.605342764354701e+02, 8.622504734025682e+02, 8.639425642751854e+02, 8.656113071416445e+02, - 8.672574236396879e+02, 8.688816012742527e+02, 8.704844955538578e+02, 8.720667319623858e+02, 8.736289077812486e+02, - 8.751715937753507e+02, 8.766953357548773e+02, 8.782006560237181e+02, 8.796880547242600e+02, 8.811580110872936e+02, - 8.826109845949660e+02, 8.840474160639189e+02, 8.854677286550893e+02, 8.868723288160541e+02, 8.882616071612294e+02, - 8.896359392947901e+02, 8.909956865807030e+02, 8.923411968639108e+02, 8.936728051463143e+02, 8.949908342209253e+02, - 8.962955952672421e+02, 8.975873884106571e+02, 8.988665032484708e+02, 9.001332193448752e+02, 9.013878066970701e+02, - 9.026305261771399e+02, 9.038616299823610e+02, 9.050813620151689e+02, 9.062899582222592e+02, 9.074876458097262e+02, - 9.086746472148859e+02, 9.098511759256014e+02, 9.110174393107435e+02, 9.121736381670224e+02, 9.133199677407387e+02, - 9.144566168112475e+02, 9.155837687319673e+02, 9.167016014496818e+02, 9.178102877196520e+02, 9.189099953100404e+02, - 9.200008871962954e+02, 9.210831217460756e+02, 9.221568528952577e+02, 9.232222303155525e+02, 9.242793995741872e+02, - 9.253285022861224e+02, 9.263696762591992e+02, 9.274030556326250e+02, 9.284287709964906e+02, 9.294469495660329e+02, - 9.304577152336431e+02, 9.314611887276992e+02, 9.324574877123223e+02, 9.334467268927605e+02, 9.344290181162299e+02, - 9.354044704485505e+02, 9.363731903477366e+02, 9.373352816414369e+02, 9.382908456426690e+02, 9.392399812922021e+02, - 9.401827851800224e+02, 9.411193516347457e+02, 9.420497727954605e+02, 9.429741386807171e+02, 9.438925372547682e+02, - 9.448050544912268e+02, 9.457117744342272e+02, 9.466127792572285e+02, 9.475081493195665e+02, 9.483979632208486e+02, - 9.492822978730152e+02, 9.501612284707600e+02, 9.510348286617098e+02, 9.519031705108405e+02, 9.527663245663803e+02, - 9.536243599031882e+02, 9.544773441645783e+02, 9.553253436026272e+02, 9.561684231170760e+02, 9.570066462928437e+02, - 9.578400754362324e+02, 9.586687716098837e+02, 9.594927946665150e+02, 9.603122032815165e+02, 9.611270549844294e+02, - 9.619374061893682e+02, 9.627433122244217e+02, 9.635448273600771e+02, 9.643420048367042e+02, 9.651348968911395e+02, - 9.659235547823995e+02, 9.667080288165719e+02, 9.674883683708958e+02, 9.682646219170832e+02, 9.690368370438912e+02, - 9.698050604789933e+02, 9.705693381101605e+02, 9.713297150057866e+02, 9.720862354347767e+02, 9.728389428858333e+02, - 9.735878800861434e+02, 9.743330890195092e+02, 9.750746109439337e+02, 9.758124864086719e+02, 9.765467552707837e+02, - 9.772774567111965e+02, 9.780046292502950e+02, 9.787283107630587e+02, 9.794485384937562e+02, 9.801653490702272e+02, - 9.808787785177429e+02, 9.815888622724799e+02, 9.822956351946131e+02, 9.829991315810388e+02, 9.836993851777419e+02, - 9.843964291918219e+02, 9.850902963031853e+02, 9.857810186759200e+02, 9.864686279693533e+02, 9.871531553488197e+02, - 9.878346314961286e+02, 9.885130866197565e+02, 9.891885504647679e+02, 9.898610523224714e+02, 9.905306210398235e+02, - 9.911972850285814e+02, 9.918610717986995e+02, 9.925220098504748e+02, 9.931801258853162e+02, 9.938354466610925e+02, - 9.944879985428198e+02, 9.951378075104983e+02, 9.957848991667454e+02, 9.964292987442375e+02, 9.970710311129698e+02, - 9.977101207873319e+02, 9.983465919330096e+02, 9.989804683737216e+02, 9.996117735977843e+02, 1.000240530764525e+03, - 1.000866762710533e+03, 1.001490491955765e+03, 1.002111740709504e+03, 1.002730530876176e+03, 1.003346884061024e+03, - 1.003960821575660e+03, 1.004572364443475e+03, 1.005181533404929e+03, 1.005788348922717e+03, 1.006392831186818e+03, - 1.006995000119420e+03, 1.007594875379746e+03, 1.008192476368753e+03, 1.008787822233744e+03, 1.009380931872860e+03, - 1.009971823939477e+03, 1.010560516846510e+03, 1.011147028770611e+03, 1.011731377656284e+03, 1.012313581219905e+03, - 1.012893656953653e+03, 1.013471622129358e+03, 1.014047493802263e+03, 1.014621288814708e+03, 1.015193023799732e+03, - 1.015762715184597e+03, 1.016330379194244e+03, 1.016896031854665e+03, 1.017459688996213e+03, 1.018021366256837e+03, - 1.018581079085253e+03, 1.019138842744046e+03, 1.019694672312710e+03, 1.020248582690624e+03, 1.020800588599966e+03, - 1.021350704588570e+03, 1.021898945032725e+03, 1.022445324139910e+03, 1.022989855951485e+03, 1.023532554345321e+03, - 1.024073433038378e+03, 1.024612505589231e+03, 1.025149785400549e+03, 1.025685285721524e+03, 1.026219019650251e+03, - 1.026751000136059e+03, 1.027281239981802e+03, 1.027809751846104e+03, 1.028336548245557e+03, 1.028861641556877e+03, - 1.029385044019027e+03, 1.029906767735287e+03, 1.030426824675294e+03, 1.030945226677040e+03, 1.031461985448828e+03, - 1.031977112571203e+03, 1.032490619498831e+03, 1.033002517562357e+03, 1.033512817970222e+03, 1.034021531810445e+03, - 1.034528670052375e+03, 1.035034243548411e+03, 1.035538263035687e+03, 1.036040739137734e+03, 1.036541682366103e+03, - 1.037041103121961e+03, 1.037539011697663e+03, 1.038035418278290e+03, 1.038530332943166e+03, 1.039023765667337e+03, - 1.039515726323036e+03, 1.040006224681118e+03, 1.040495270412463e+03, 1.040982873089366e+03, 1.041469042186889e+03, - 1.041953787084207e+03, 1.042437117065912e+03, 1.042919041323309e+03, 1.043399568955680e+03, 1.043878708971534e+03, - 1.044356470289827e+03, 1.044832861741173e+03, 1.045307892069019e+03, 1.045781569930818e+03, 1.046253903899164e+03, - 1.046724902462922e+03, 1.047194574028337e+03, 1.047662926920110e+03, 1.048129969382483e+03, 1.048595709580277e+03, - 1.049060155599936e+03, 1.049523315450537e+03, 1.049985197064798e+03, 1.050445808300057e+03, 1.050905156939244e+03, - 1.051363250691829e+03, 1.051820097194765e+03, 1.052275704013408e+03, 1.052730078642422e+03, 1.053183228506675e+03, - 1.053635160962118e+03, 1.054085883296646e+03, 1.054535402730954e+03, 1.054983726419372e+03, 1.055430861450688e+03, - 1.055876814848962e+03, 1.056321593574326e+03, 1.056765204523766e+03, 1.057207654531901e+03, 1.057648950371741e+03, - 1.058089098755441e+03, 1.058528106335040e+03, 1.058965979703185e+03, 1.059402725393850e+03, 1.059838349883043e+03, - 1.060272859589498e+03, 1.060706260875362e+03, 1.061138560046870e+03, 1.061569763355000e+03, 1.061999876996143e+03, - 1.062428907112733e+03, 1.062856859793888e+03, 1.063283741076036e+03, 1.063709556943528e+03, 1.064134313329248e+03, - 1.064558016115208e+03, 1.064980671133139e+03, 1.065402284165072e+03, 1.065822860943910e+03, 1.066242407153991e+03, - 1.066660928431646e+03, 1.067078430365742e+03, 1.067494918498227e+03, 1.067910398324660e+03, 1.068324875294737e+03, - 1.068738354812805e+03, 1.069150842238371e+03, 1.069562342886613e+03, 1.069972862028864e+03, 1.070382404893107e+03, - 1.070790976664457e+03, 1.071198582485631e+03, 1.071605227457420e+03, 1.072010916639152e+03, 1.072415655049142e+03, - 1.072819447665145e+03, 1.073222299424799e+03, 1.073624215226058e+03, 1.074025199927627e+03, 1.074425258349384e+03, - 1.074824395272798e+03, 1.075222615441349e+03, 1.075619923560924e+03, 1.076016324300231e+03, 1.076411822291189e+03, - 1.076806422129322e+03, 1.077200128374141e+03, 1.077592945549533e+03, 1.077984878144128e+03, 1.078375930611676e+03, - 1.078766107371411e+03, 1.079155412808413e+03, 1.079543851273960e+03, 1.079931427085887e+03, 1.080318144528930e+03, - 1.080704007855064e+03, 1.081089021283850e+03, 1.081473189002759e+03, 1.081856515167509e+03, 1.082239003902387e+03, - 1.082620659300570e+03, 1.083001485424443e+03, 1.083381486305908e+03, 1.083760665946698e+03, 1.084139028318678e+03, - 1.084516577364148e+03, 1.084893316996139e+03, 1.085269251098705e+03, 1.085644383527218e+03, 1.086018718108645e+03, - 1.086392258641840e+03, 1.086765008897817e+03, 1.087136972620025e+03, 1.087508153524625e+03, 1.087878555300752e+03, - 1.088248181610785e+03, 1.088617036090608e+03, 1.088985122349867e+03, 1.089352443972228e+03, 1.089719004515626e+03, - 1.090084807512518e+03, 1.090449856470128e+03, 1.090814154870689e+03, 1.091177706171684e+03, 1.091540513806086e+03, - 1.091902581182585e+03, 1.092263911685830e+03, 1.092624508676652e+03, 1.092984375492289e+03, 1.093343515446612e+03, - 1.093701931830346e+03, 1.094059627911288e+03, 1.094416606934521e+03, 1.094772872122629e+03, 1.095128426675905e+03, - 1.095483273772561e+03, 1.095837416568937e+03, 1.096190858199694e+03, 1.096543601778027e+03, 1.096895650395853e+03, - 1.097247007124016e+03, 1.097597675012475e+03, 1.097947657090496e+03, 1.098296956366845e+03, 1.098645575829973e+03, - 1.098993518448198e+03, 1.099340787169895e+03, 1.099687384923671e+03, 1.100033314618545e+03, 1.100378579144127e+03, - 1.100723181370791e+03, 1.101067124149846e+03, 1.101410410313713e+03, 1.101753042676085e+03, 1.102095024032103e+03, - 1.102436357158513e+03, 1.102777044813835e+03, 1.103117089738523e+03, 1.103456494655122e+03, 1.103795262268432e+03, - 1.104133395265655e+03, 1.104470896316559e+03, 1.104807768073623e+03, 1.105144013172193e+03, 1.105479634230630e+03, - 1.105814633850455e+03, 1.106149014616499e+03, 1.106482779097044e+03, 1.106815929843972e+03, 1.107148469392896e+03, - 1.107480400263312e+03, 1.107811724958724e+03, 1.108142445966796e+03, 1.108472565759473e+03, 1.108802086793123e+03, - 1.109131011508671e+03, 1.109459342331721e+03, 1.109787081672695e+03, 1.110114231926957e+03, 1.110440795474940e+03, - 1.110766774682273e+03, 1.111092171899902e+03, 1.111416989464216e+03, 1.111741229697170e+03, 1.112064894906400e+03 - }, - { - 1.718406923114809e+00, 5.240767033159015e+00, 8.828825471983114e+00, 1.248568818150631e+01, 1.621470096447989e+01, - 2.001947509547979e+01, 2.390391648225298e+01, 2.787225899779568e+01, 3.192910272285310e+01, 3.607945800876551e+01, - 4.032879646932415e+01, 4.468311026904425e+01, 4.914898140355030e+01, 5.373366309017691e+01, 5.844517593474124e+01, - 6.329242225740104e+01, 6.828532290783726e+01, 7.343498216466951e+01, 7.875388802112305e+01, 8.425615749093714e+01, - 8.995783979536608e+01, 9.587729482010461e+01, 1.020356706820475e+02, 1.084575135907632e+02, 1.151715569759070e+02, - 1.222117576042095e+02, 1.296186783544368e+02, 1.374413677639701e+02, 1.457399681374091e+02, 1.545894215994743e+02, - 1.640848812172308e+02, 1.743498671237687e+02, 1.855490304211856e+02, 1.979090495992078e+02, 2.117547819581072e+02, - 2.275762716213535e+02, 2.461644006818375e+02, 2.689190114261615e+02, 2.986624001146608e+02, 3.421980287380287e+02, - 4.186777734027267e+02, 5.192134842987455e+02, 5.763565617925024e+02, 6.092222884746629e+02, 6.320492607895654e+02, - 6.495505020552895e+02, 6.637857442096046e+02, 6.758224351786511e+02, 6.862800495921764e+02, 6.955485847092559e+02, - 7.038889461518424e+02, 7.114840431826537e+02, 7.184669616425634e+02, 7.249375146936663e+02, 7.309724749288646e+02, - 7.366321700669014e+02, 7.419648852427513e+02, 7.470098893016935e+02, 7.517995686737640e+02, 7.563609656772105e+02, - 7.607169093561110e+02, 7.648868613858691e+02, 7.688875588242120e+02, 7.727335094695972e+02, 7.764373785863763e+02, - 7.800102944077117e+02, 7.834620921082176e+02, 7.868015105972935e+02, 7.900363527304963e+02, 7.931736168602163e+02, - 7.962196057139950e+02, 7.991800171753340e+02, 8.020600204966447e+02, 8.048643206927186e+02, 8.075972132734560e+02, - 8.102626310252716e+02, 8.128641842053075e+02, 8.154051952449413e+02, 8.178887288500393e+02, 8.203176182208819e+02, - 8.226944879843317e+02, 8.250217743267884e+02, 8.273017427329352e+02, 8.295365036678136e+02, 8.317280264849423e+02, - 8.338781517983768e+02, 8.359886025198126e+02, 8.380609937314889e+02, 8.400968415403897e+02, 8.420975710383215e+02, - 8.440645234747960e+02, 8.459989627349313e+02, 8.479020812021121e+02, 8.497750050745487e+02, 8.516187991959774e+02, - 8.534344714530104e+02, 8.552229767851366e+02, 8.569852208477251e+02, 8.587220633635452e+02, 8.604343211941149e+02, - 8.621227711585591e+02, 8.637881526245330e+02, 8.654311698929700e+02, 8.670524943960550e+02, 8.686527667257141e+02, - 8.702325985080503e+02, 8.717925741375593e+02, 8.733332523835138e+02, 8.748551678796484e+02, 8.763588325071744e+02, - 8.778447366801300e+02, 8.793133505412345e+02, 8.807651250755957e+02, 8.822004931489518e+02, 8.836198704764809e+02, - 8.850236565276763e+02, 8.864122353722657e+02, 8.877859764717284e+02, 8.891452354205337e+02, 8.904903546408869e+02, - 8.918216640344341e+02, 8.931394815940719e+02, 8.944441139787563e+02, 8.957358570539652e+02, 8.970149964002333e+02, - 8.982818077920128e+02, 8.995365576649733e+02, 9.007795035712406e+02, 9.020108945408000e+02, 9.032309706500641e+02, - 9.044399658630562e+02, 9.056381053993970e+02, 9.068256076974752e+02, 9.080026841753119e+02, 9.091695403057676e+02, - 9.103263746719786e+02, 9.114733800615838e+02, 9.126107434956288e+02, 9.137386464609658e+02, 9.148572651309939e+02, - 9.159667705754155e+02, 9.170673289596691e+02, 9.181591017346472e+02, 9.192422458172404e+02, 9.203169137622697e+02, - 9.213832539262610e+02, 9.224414106235482e+02, 9.234915242751167e+02, 9.245337315505997e+02, 9.255681655037984e+02, - 9.265949557020715e+02, 9.276142283499431e+02, 9.286261063839487e+02, 9.296307096745774e+02, 9.306281549870963e+02, - 9.316185562451434e+02, 9.326020244899806e+02, 9.335786680702919e+02, 9.345485926571274e+02, 9.355119014153091e+02, - 9.364686950289400e+02, 9.374190717961898e+02, 9.383631277059671e+02, 9.393009565114967e+02, 9.402326498009472e+02, - 9.411582970652634e+02, 9.420779857825684e+02, 9.429918014026908e+02, 9.438998275262078e+02, 9.448021458818893e+02, - 9.456988364027837e+02, 9.465899772797897e+02, 9.474756450132043e+02, 9.483559144623600e+02, 9.492308588934238e+02, - 9.501005500254456e+02, 9.509650580747282e+02, 9.518244517975965e+02, 9.526787985316355e+02, 9.535281642354561e+02, - 9.543726135270612e+02, 9.552122097208660e+02, 9.560470148634237e+02, 9.568770897679279e+02, 9.577024940475225e+02, - 9.585232861474816e+02, 9.593395233762975e+02, 9.601512619357308e+02, 9.609585569498543e+02, 9.617614624931321e+02, - 9.625600316175868e+02, 9.633543163790670e+02, 9.641443678626716e+02, 9.649302362073503e+02, 9.657119706297218e+02, - 9.664896194471281e+02, 9.672632300999705e+02, 9.680328491733388e+02, 9.687985224179652e+02, 9.695602947705386e+02, - 9.703182103733859e+02, 9.710723125935554e+02, 9.718226440413216e+02, 9.725692465881324e+02, 9.733121613840173e+02, - 9.740514288744760e+02, 9.747870888168753e+02, 9.755191802963519e+02, 9.762477417412591e+02, 9.769728109381642e+02, - 9.776944250464115e+02, 9.784126206122677e+02, 9.791274335826631e+02, 9.798388993185488e+02, 9.805470526078697e+02, - 9.812519276781815e+02, 9.819535582089133e+02, 9.826519773432908e+02, 9.833472176999337e+02, 9.840393113841307e+02, - 9.847282899988186e+02, 9.854141846552534e+02, 9.860970259834019e+02, 9.867768441420511e+02, 9.874536688286535e+02, - 9.881275292889098e+02, 9.887984538549454e+02, 9.894664718203564e+02, 9.901316106776505e+02, 9.907938979564340e+02, - 9.914533607788575e+02, 9.921100258678019e+02, 9.927639195548612e+02, 9.934150677881162e+02, 9.940634961397175e+02, - 9.947092298132806e+02, 9.953522936510910e+02, 9.959927121411376e+02, 9.966305094239693e+02, 9.972657092993850e+02, - 9.978983352329592e+02, 9.985284103624138e+02, 9.991559575038298e+02, 9.997809991577180e+02, 1.000403557514937e+03, - 1.001023654462475e+03, 1.001641311589099e+03, 1.002256550190862e+03, 1.002869391276488e+03, 1.003479855572632e+03, - 1.004087963529015e+03, 1.004693735323443e+03, 1.005297190866709e+03, 1.005898349807391e+03, 1.006497231536523e+03, - 1.007093855192186e+03, 1.007688239663971e+03, 1.008280403597362e+03, 1.008870365398008e+03, 1.009458143235906e+03, - 1.010043755049494e+03, 1.010627218549649e+03, 1.011208551223598e+03, 1.011787770338753e+03, 1.012364892946449e+03, - 1.012939935885614e+03, 1.013512915786350e+03, 1.014083849073446e+03, 1.014652751969814e+03, 1.015219640499848e+03, - 1.015784530492720e+03, 1.016347437585596e+03, 1.016908377226798e+03, 1.017467364678891e+03, 1.018024415021711e+03, - 1.018579543155325e+03, 1.019132763802938e+03, 1.019684091513733e+03, 1.020233540665662e+03, 1.020781125468173e+03, - 1.021326859964880e+03, 1.021870758036196e+03, 1.022412833401887e+03, 1.022953099623602e+03, 1.023491570107335e+03, - 1.024028258105845e+03, 1.024563176721026e+03, 1.025096338906237e+03, 1.025627757468580e+03, 1.026157445071130e+03, - 1.026685414235138e+03, 1.027211677342175e+03, 1.027736246636241e+03, 1.028259134225837e+03, 1.028780352085995e+03, - 1.029299912060266e+03, 1.029817825862676e+03, 1.030334105079645e+03, 1.030848761171865e+03, 1.031361805476149e+03, - 1.031873249207243e+03, 1.032383103459600e+03, 1.032891379209134e+03, 1.033398087314928e+03, 1.033903238520918e+03, - 1.034406843457547e+03, 1.034908912643384e+03, 1.035409456486719e+03, 1.035908485287129e+03, 1.036406009237007e+03, - 1.036902038423081e+03, 1.037396582827888e+03, 1.037889652331234e+03, 1.038381256711622e+03, 1.038871405647659e+03, - 1.039360108719433e+03, 1.039847375409873e+03, 1.040333215106082e+03, 1.040817637100642e+03, 1.041300650592905e+03, - 1.041782264690258e+03, 1.042262488409365e+03, 1.042741330677388e+03, 1.043218800333192e+03, 1.043694906128524e+03, - 1.044169656729171e+03, 1.044643060716108e+03, 1.045115126586613e+03, 1.045585862755378e+03, 1.046055277555589e+03, - 1.046523379239995e+03, 1.046990175981959e+03, 1.047455675876487e+03, 1.047919886941249e+03, 1.048382817117571e+03, - 1.048844474271423e+03, 1.049304866194383e+03, 1.049764000604589e+03, 1.050221885147674e+03, 1.050678527397687e+03, - 1.051133934858000e+03, 1.051588114962196e+03, 1.052041075074950e+03, 1.052492822492892e+03, 1.052943364445452e+03, - 1.053392708095702e+03, 1.053840860541176e+03, 1.054287828814685e+03, 1.054733619885104e+03, 1.055178240658170e+03, - 1.055621697977247e+03, 1.056063998624089e+03, 1.056505149319591e+03, 1.056945156724525e+03, 1.057384027440269e+03, - 1.057821768009519e+03, 1.058258384916997e+03, 1.058693884590144e+03, 1.059128273399803e+03, 1.059561557660893e+03, - 1.059993743633072e+03, 1.060424837521390e+03, 1.060854845476932e+03, 1.061283773597456e+03, 1.061711627928011e+03, - 1.062138414461555e+03, 1.062564139139566e+03, 1.062988807852633e+03, 1.063412426441046e+03, 1.063835000695380e+03, - 1.064256536357061e+03, 1.064677039118935e+03, 1.065096514625817e+03, 1.065514968475047e+03, 1.065932406217018e+03, - 1.066348833355717e+03, 1.066764255349247e+03, 1.067178677610339e+03, 1.067592105506868e+03, 1.068004544362348e+03, - 1.068415999456435e+03, 1.068826476025407e+03, 1.069235979262650e+03, 1.069644514319134e+03, 1.070052086303874e+03, - 1.070458700284398e+03, 1.070864361287199e+03, 1.071269074298184e+03, 1.071672844263116e+03, 1.072075676088054e+03, - 1.072477574639776e+03, 1.072878544746210e+03, 1.073278591196852e+03, 1.073677718743174e+03, 1.074075932099041e+03, - 1.074473235941101e+03, 1.074869634909194e+03, 1.075265133606730e+03, 1.075659736601088e+03, 1.076053448423987e+03, - 1.076446273571869e+03, 1.076838216506263e+03, 1.077229281654156e+03, 1.077619473408353e+03, 1.078008796127830e+03, - 1.078397254138092e+03, 1.078784851731512e+03, 1.079171593167680e+03, 1.079557482673740e+03, 1.079942524444719e+03, - 1.080326722643862e+03, 1.080710081402954e+03, 1.081092604822640e+03, 1.081474296972747e+03, 1.081855161892588e+03, - 1.082235203591280e+03, 1.082614426048041e+03, 1.082992833212498e+03, 1.083370429004975e+03, 1.083747217316796e+03, - 1.084123202010569e+03, 1.084498386920473e+03, 1.084872775852538e+03, 1.085246372584932e+03, 1.085619180868226e+03, - 1.085991204425672e+03, 1.086362446953471e+03, 1.086732912121036e+03, 1.087102603571256e+03, 1.087471524920756e+03, - 1.087839679760148e+03, 1.088207071654287e+03, 1.088573704142520e+03, 1.088939580738932e+03, 1.089304704932588e+03, - 1.089669080187775e+03, 1.090032709944240e+03, 1.090395597617421e+03, 1.090757746598684e+03, 1.091119160255546e+03, - 1.091479841931908e+03, 1.091839794948272e+03, 1.092199022601967e+03, 1.092557528167362e+03, 1.092915314896089e+03, - 1.093272386017248e+03, 1.093628744737624e+03, 1.093984394241891e+03, 1.094339337692820e+03, 1.094693578231480e+03, - 1.095047118977443e+03, 1.095399963028976e+03, 1.095752113463244e+03, 1.096103573336501e+03, 1.096454345684280e+03, - 1.096804433521585e+03, 1.097153839843079e+03, 1.097502567623266e+03, 1.097850619816676e+03, 1.098197999358044e+03, - 1.098544709162495e+03, 1.098890752125713e+03, 1.099236131124120e+03, 1.099580849015048e+03, 1.099924908636910e+03, - 1.100268312809370e+03, 1.100611064333508e+03, 1.100953165991986e+03, 1.101294620549213e+03, 1.101635430751504e+03, - 1.101975599327242e+03, 1.102315128987034e+03, 1.102654022423869e+03, 1.102992282313270e+03, 1.103329911313450e+03, - 1.103666912065460e+03, 1.104003287193341e+03, 1.104339039304270e+03, 1.104674170988708e+03, 1.105008684820542e+03, - 1.105342583357230e+03, 1.105675869139941e+03, 1.106008544693698e+03, 1.106340612527513e+03, 1.106672075134523e+03, - 1.107002934992131e+03, 1.107333194562136e+03, 1.107662856290864e+03, 1.107991922609303e+03, 1.108320395933230e+03, - 1.108648278663341e+03, 1.108975573185377e+03, 1.109302281870251e+03, 1.109628407074169e+03, 1.109953951138758e+03 - }, - { - 1.712675335538445e+00, 5.222758735786230e+00, 8.797553863589767e+00, 1.244007577233650e+01, 1.615356867249690e+01, - 1.994152996215746e+01, 2.380773752396502e+01, 2.775628084773391e+01, 3.179159664242141e+01, 3.591850975123064e+01, - 4.014228035674451e+01, 4.446865868794910e+01, 4.890394872458076e+01, 5.345508275705683e+01, 5.812970912782430e+01, - 6.293629608771477e+01, 6.788425549805939e+01, 7.298409116511574e+01, 7.824757800632342e+01, 8.368798016009754e+01, - 8.932031876998963e+01, 9.516170380836566e+01, 1.012317494193090e+02, 1.075530995693270e+02, 1.141521014154579e+02, - 1.210596795208874e+02, 1.283124877935041e+02, 1.359544527275868e+02, 1.440388795114474e+02, 1.526313876065373e+02, - 1.618141012194774e+02, 1.716917986133276e+02, 1.824012299994901e+02, 1.941257808817179e+02, 2.071196142014119e+02, - 2.217496577111946e+02, 2.385737133999050e+02, 2.584983711241987e+02, 2.831320115323077e+02, 3.156613539521880e+02, - 3.630997947696408e+02, 4.387201470067590e+02, 5.193997927095683e+02, 5.700674942917902e+02, 6.018293272836941e+02, - 6.245805890730010e+02, 6.422636824229876e+02, 6.567401056986423e+02, 6.690196329287630e+02, 6.797045608102532e+02, - 6.891806976958900e+02, 6.977091813482980e+02, 7.054746088152863e+02, 7.126121099819999e+02, 7.192234846177296e+02, - 7.253872905920645e+02, 7.311654052676587e+02, 7.366074372433183e+02, 7.417537777641725e+02, 7.466377633090615e+02, - 7.512872412110819e+02, 7.557257246007633e+02, 7.599732588038790e+02, 7.640470811684424e+02, 7.679621304996114e+02, - 7.717314453258698e+02, 7.753664788443277e+02, 7.788773506194008e+02, 7.822730497076756e+02, 7.855616000714081e+02, - 7.887501964175663e+02, 7.918453166247580e+02, 7.948528154727840e+02, 7.977780033167251e+02, 8.006257125439880e+02, - 8.034003540453530e+02, 8.061059654676167e+02, 8.087462526588188e+02, 8.113246254404582e+02, 8.138442286248874e+02, - 8.163079690258187e+02, 8.187185390749378e+02, 8.210784375499093e+02, 8.233899878325590e+02, 8.256553540461488e+02, - 8.278765553638865e+02, 8.300554787344498e+02, 8.321938902321788e+02, 8.342934452082037e+02, 8.363556973926898e+02, - 8.383821070766481e+02, 8.403740484836482e+02, 8.423328164264431e+02, 8.442596323306939e+02, 8.461556496970516e+02, - 8.480219590635993e+02, 8.498595925227540e+02, 8.516695278399659e+02, 8.534526922157512e+02, 8.552099657275926e+02, - 8.569421844839227e+02, 8.586501435186699e+02, 8.603345994515994e+02, 8.619962729368405e+02, 8.636358509195394e+02, - 8.652539887184092e+02, 8.668513119500343e+02, 8.684284183091568e+02, 8.699858792176612e+02, 8.715242413537122e+02, - 8.730440280713271e+02, 8.745457407196646e+02, 8.760298598703952e+02, 8.774968464607156e+02, 8.789471428588715e+02, - 8.803811738583802e+02, 8.817993476066031e+02, 8.832020564727824e+02, 8.845896778602109e+02, 8.859625749667878e+02, - 8.873210974978335e+02, 8.886655823347053e+02, 8.899963541624625e+02, 8.913137260595406e+02, 8.926180000521576e+02, - 8.939094676359464e+02, 8.951884102700761e+02, 8.964550998760453e+02, 8.977097992609447e+02, 8.989527625011211e+02, - 9.001842341993906e+02, 9.014044534939202e+02, 9.026136499068726e+02, 9.038120460155968e+02, 9.049998580281922e+02, - 9.061772948189647e+02, 9.073445590728072e+02, 9.085018473261725e+02, 9.096493502180132e+02, 9.107872527279699e+02, - 9.119157344025870e+02, 9.130349695702655e+02, 9.141451275456224e+02, 9.152463728238687e+02, 9.163388652657990e+02, - 9.174227602739202e+02, 9.184982089602306e+02, 9.195653583061151e+02, 9.206243513148017e+02, 9.216753271567909e+02, - 9.227184213086423e+02, 9.237537656854752e+02, 9.247814887675341e+02, 9.258017157026450e+02, 9.268145684972330e+02, - 9.278201659773041e+02, 9.288186241039492e+02, 9.298100558652801e+02, 9.307945715071588e+02, 9.317722785465197e+02, - 9.327432819375863e+02, 9.337076841042539e+02, 9.346655850543116e+02, 9.356170823814016e+02, 9.365622714567338e+02, - 9.375012454225092e+02, 9.384340952813180e+02, 9.393609099627874e+02, 9.402817763876185e+02, 9.411967795291333e+02, - 9.421060024724591e+02, 9.430095264714533e+02, 9.439074310034625e+02, 9.447997938220271e+02, 9.456866910076274e+02, - 9.465681970165350e+02, 9.474443847278808e+02, 9.483153254890052e+02, 9.491810891591648e+02, 9.500417441516666e+02, - 9.508973574745092e+02, 9.517479947695753e+02, 9.525937203504535e+02, 9.534345972389403e+02, 9.542706872002765e+02, - 9.551020507771748e+02, 9.559287473226848e+02, 9.567508350319436e+02, 9.575683709728590e+02, 9.583814111157720e+02, - 9.591900103621242e+02, 9.599942225721925e+02, 9.607941005919104e+02, 9.615896962788179e+02, 9.623810605271743e+02, - 9.631682432922674e+02, 9.639512936139485e+02, 9.647302596394202e+02, 9.655051886453098e+02, 9.662761270590582e+02, - 9.670431204796354e+02, 9.678062136976312e+02, 9.685654507147171e+02, 9.693208747625278e+02, 9.700725283209664e+02, - 9.708204531359596e+02, 9.715646902366883e+02, 9.723052799523023e+02, 9.730422619281425e+02, 9.737756751414947e+02, - 9.745055579168771e+02, 9.752319479408895e+02, 9.759548822766388e+02, 9.766743973777446e+02, 9.773905291019540e+02, - 9.781033127243716e+02, 9.788127829503142e+02, 9.795189739278103e+02, 9.802219192597557e+02, 9.809216520157245e+02, - 9.816182047434692e+02, 9.823116094800976e+02, 9.830018977629552e+02, 9.836891006402027e+02, 9.843732486811276e+02, - 9.850543719861636e+02, 9.857324997301691e+02, 9.864076620192152e+02, 9.870798871564469e+02, 9.877492034619880e+02, - 9.884156388334329e+02, 9.890792207544056e+02, 9.897399763028955e+02, 9.903979321593806e+02, 9.910531146147526e+02, - 9.917055495780313e+02, 9.923552625838938e+02, 9.930022788000127e+02, 9.936466230342138e+02, 9.942883197414577e+02, - 9.949273930306473e+02, 9.955638666712741e+02, 9.961977640998971e+02, 9.968291084264720e+02, 9.974579224405243e+02, - 9.980842286171717e+02, 9.987080491230149e+02, 9.993294058218755e+02, 9.999483202804053e+02, 1.000564813773567e+03, - 1.001178907289983e+03, 1.001790621537157e+03, 1.002399976946587e+03, 1.003006993678746e+03, 1.003611691627963e+03, - 1.004214090427181e+03, 1.004814209452614e+03, 1.005412067828300e+03, 1.006007684430549e+03, 1.006601077892290e+03, - 1.007192266607331e+03, 1.007781268734510e+03, 1.008368102201768e+03, 1.008952784710129e+03, 1.009535333737585e+03, - 1.010115766542914e+03, 1.010694100169399e+03, 1.011270351448472e+03, 1.011844537003293e+03, 1.012416673252227e+03, - 1.012986776412273e+03, 1.013554862502403e+03, 1.014120947346844e+03, 1.014685046578279e+03, 1.015247175640991e+03, - 1.015807349793940e+03, 1.016365584113770e+03, 1.016921893497761e+03, 1.017476292666722e+03, 1.018028796167818e+03, - 1.018579418377346e+03, 1.019128173503453e+03, 1.019675075588796e+03, 1.020220138513155e+03, 1.020763375995990e+03, - 1.021304801598949e+03, 1.021844428728322e+03, 1.022382270637454e+03, 1.022918340429106e+03, 1.023452651057772e+03, - 1.023985215331948e+03, 1.024516045916358e+03, 1.025045155334144e+03, 1.025572555969002e+03, 1.026098260067288e+03, - 1.026622279740074e+03, 1.027144626965177e+03, 1.027665313589140e+03, 1.028184351329176e+03, 1.028701751775082e+03, - 1.029217526391114e+03, 1.029731686517826e+03, 1.030244243373875e+03, 1.030755208057793e+03, 1.031264591549733e+03, - 1.031772404713167e+03, 1.032278658296573e+03, 1.032783362935077e+03, 1.033286529152070e+03, 1.033788167360795e+03, - 1.034288287865912e+03, 1.034786900865022e+03, 1.035284016450175e+03, 1.035779644609348e+03, 1.036273795227896e+03, - 1.036766478089976e+03, 1.037257702879952e+03, 1.037747479183767e+03, 1.038235816490297e+03, 1.038722724192684e+03, - 1.039208211589634e+03, 1.039692287886709e+03, 1.040174962197581e+03, 1.040656243545280e+03, 1.041136140863407e+03, - 1.041614662997331e+03, 1.042091818705376e+03, 1.042567616659966e+03, 1.043042065448778e+03, 1.043515173575847e+03, - 1.043986949462681e+03, 1.044457401449333e+03, 1.044926537795470e+03, 1.045394366681425e+03, 1.045860896209214e+03, - 1.046326134403564e+03, 1.046790089212900e+03, 1.047252768510330e+03, 1.047714180094606e+03, 1.048174331691075e+03, - 1.048633230952615e+03, 1.049090885460548e+03, 1.049547302725549e+03, 1.050002490188534e+03, 1.050456455221534e+03, - 1.050909205128560e+03, 1.051360747146445e+03, 1.051811088445688e+03, 1.052260236131266e+03, 1.052708197243449e+03, - 1.053154978758595e+03, 1.053600587589930e+03, 1.054045030588326e+03, 1.054488314543058e+03, 1.054930446182548e+03, - 1.055371432175109e+03, 1.055811279129667e+03, 1.056249993596473e+03, 1.056687582067810e+03, 1.057124050978687e+03, - 1.057559406707517e+03, 1.057993655576793e+03, 1.058426803853748e+03, 1.058858857751009e+03, 1.059289823427238e+03, - 1.059719706987767e+03, 1.060148514485220e+03, 1.060576251920127e+03, 1.061002925241532e+03, 1.061428540347589e+03, - 1.061853103086146e+03, 1.062276619255330e+03, 1.062699094604114e+03, 1.063120534832882e+03, 1.063540945593982e+03, - 1.063960332492272e+03, 1.064378701085663e+03, 1.064796056885643e+03, 1.065212405357807e+03, 1.065627751922368e+03, - 1.066042101954670e+03, 1.066455460785689e+03, 1.066867833702521e+03, 1.067279225948879e+03, 1.067689642725569e+03, - 1.068099089190961e+03, 1.068507570461461e+03, 1.068915091611974e+03, 1.069321657676349e+03, 1.069727273647838e+03, - 1.070131944479532e+03, 1.070535675084797e+03, 1.070938470337707e+03, 1.071340335073464e+03, 1.071741274088823e+03, - 1.072141292142498e+03, 1.072540393955573e+03, 1.072938584211901e+03, 1.073335867558503e+03, 1.073732248605957e+03, - 1.074127731928787e+03, 1.074522322065838e+03, 1.074916023520655e+03, 1.075308840761855e+03, 1.075700778223489e+03, - 1.076091840305406e+03, 1.076482031373605e+03, 1.076871355760593e+03, 1.077259817765725e+03, 1.077647421655550e+03, - 1.078034171664147e+03, 1.078420071993462e+03, 1.078805126813632e+03, 1.079189340263314e+03, 1.079572716450004e+03, - 1.079955259450353e+03, 1.080336973310481e+03, 1.080717862046285e+03, 1.081097929643742e+03, 1.081477180059215e+03, - 1.081855617219742e+03, 1.082233245023336e+03, 1.082610067339270e+03, 1.082986088008369e+03, 1.083361310843283e+03, - 1.083735739628774e+03, 1.084109378121988e+03, 1.084482230052726e+03, 1.084854299123712e+03, 1.085225589010865e+03, - 1.085596103363551e+03, 1.085965845804849e+03, 1.086334819931802e+03, 1.086703029315672e+03, 1.087070477502188e+03, - 1.087437168011795e+03, 1.087803104339893e+03, 1.088168289957079e+03, 1.088532728309386e+03, 1.088896422818519e+03, - 1.089259376882078e+03, 1.089621593873799e+03, 1.089983077143772e+03, 1.090343830018666e+03, 1.090703855801952e+03, - 1.091063157774121e+03, 1.091421739192896e+03, 1.091779603293450e+03, 1.092136753288614e+03, 1.092493192369085e+03, - 1.092848923703632e+03, 1.093203950439301e+03, 1.093558275701612e+03, 1.093911902594761e+03, 1.094264834201818e+03, - 1.094617073584913e+03, 1.094968623785438e+03, 1.095319487824226e+03, 1.095669668701750e+03, 1.096019169398296e+03, - 1.096367992874157e+03, 1.096716142069808e+03, 1.097063619906082e+03, 1.097410429284356e+03, 1.097756573086719e+03, - 1.098102054176146e+03, 1.098446875396671e+03, 1.098791039573552e+03, 1.099134549513445e+03, 1.099477408004561e+03, - 1.099819617816838e+03, 1.100161181702092e+03, 1.100502102394190e+03, 1.100842382609194e+03, 1.101182025045530e+03, - 1.101521032384133e+03, 1.101859407288606e+03, 1.102197152405367e+03, 1.102534270363800e+03, 1.102870763776404e+03, - 1.103206635238940e+03, 1.103541887330570e+03, 1.103876522614008e+03, 1.104210543635654e+03, 1.104543952925741e+03, - 1.104876752998468e+03, 1.105208946352140e+03, 1.105540535469301e+03, 1.105871522816871e+03, 1.106201910846278e+03, - 1.106531701993585e+03, 1.106860898679629e+03, 1.107189503310138e+03, 1.107517518275866e+03, 1.107844945952718e+03 - }, - { - 1.706982439690026e+00, 5.204879449096566e+00, 8.766519832179346e+00, 1.239483063976562e+01, 1.609295787751917e+01, - 1.986428905573338e+01, 2.371247874442809e+01, 2.764147763791471e+01, 3.165556572433693e+01, 3.575939028800079e+01, - 3.995800962318453e+01, 4.425694353360376e+01, 4.866223193683066e+01, 5.318050320461273e+01, 5.781905426929794e+01, - 6.258594504203600e+01, 6.749011035972119e+01, 7.254149355988751e+01, 7.775120695363478e+01, 8.313172603690775e+01, - 8.869712641006537e+01, 9.446337529902878e+01, 1.004486936369112e+02, 1.066740103996810e+02, 1.131635391035187e+02, - 1.199455183361314e+02, 1.270531759454070e+02, 1.345260034016678e+02, 1.424114683610503e+02, 1.507673598036600e+02, - 1.596650675874954e+02, 1.691942804521954e+02, 1.794699039020866e+02, 1.906425774264511e+02, 2.029152725545038e+02, - 2.165706694921852e+02, 2.320187413920738e+02, 2.498847408293602e+02, 2.711837125474593e+02, 2.976905494763279e+02, - 3.327336737839258e+02, 3.825490824225566e+02, 4.527336942181644e+02, 5.192832595818398e+02, 5.646313621552536e+02, - 5.951031618208031e+02, 6.175851052568865e+02, 6.353202051936323e+02, 6.499540835627256e+02, 6.624209247312421e+02, - 6.732949751300063e+02, 6.829515411152710e+02, 6.916482191071054e+02, 6.995689527055550e+02, 7.068494157229791e+02, - 7.135924078570960e+02, 7.198776089530932e+02, 7.257679914953125e+02, 7.313141705612921e+02, 7.365574349852416e+02, - 7.415319092093157e+02, 7.462661267898687e+02, 7.507841964414731e+02, 7.551066801110832e+02, 7.592512638330609e+02, - 7.632332770441791e+02, 7.670660994468998e+02, 7.707614833092550e+02, 7.743298113926828e+02, 7.777803053233439e+02, - 7.811211954123314e+02, 7.843598601932335e+02, 7.875029419550948e+02, 7.905564430846578e+02, 7.935258069432332e+02, - 7.964159861862997e+02, 7.992315008144877e+02, 8.019764877711466e+02, 8.046547435367000e+02, 8.072697608864146e+02, - 8.098247607563333e+02, 8.123227199872172e+02, 8.147663955775240e+02, 8.171583459657004e+02, 8.195009497729275e+02, - 8.217964223655861e+02, 8.240468305381578e+02, 8.262541055695501e+02, 8.284200548665399e+02, 8.305463723756865e+02, - 8.326346479181877e+02, 8.346863755798056e+02, 8.367029612692426e+02, 8.386857295426870e+02, 8.406359297789393e+02, - 8.425547417783506e+02, 8.444432808492462e+02, 8.463026024373886e+02, 8.481337063470924e+02, 8.499375405966072e+02, - 8.517150049452766e+02, 8.534669541255241e+02, 8.551942008088823e+02, 8.568975183319500e+02, 8.585776432052448e+02, - 8.602352774253964e+02, 8.618710906088929e+02, 8.634857219636693e+02, 8.650797821130784e+02, 8.666538547853268e+02, - 8.682084983800847e+02, 8.697442474228184e+02, 8.712616139163629e+02, 8.727610885982999e+02, 8.742431421119039e+02, - 8.757082260976700e+02, 8.771567742117907e+02, 8.785892030773540e+02, 8.800059131735208e+02, 8.814072896674488e+02, - 8.827937031933297e+02, 8.841655105825072e+02, 8.855230555483071e+02, 8.868666693289067e+02, 8.881966712912699e+02, - 8.895133694989522e+02, 8.908170612463805e+02, 8.921080335803023e+02, 8.933865637986997e+02, 8.946529198581728e+02, - 8.959073599673829e+02, 8.971501355426025e+02, 8.983814885101035e+02, 8.996016531627201e+02, 9.008108569691789e+02, - 9.020093195983928e+02, 9.031972541105308e+02, 9.043748670127230e+02, 9.055423585298234e+02, 9.066999228612643e+02, - 9.078477484248564e+02, 9.089860180883130e+02, 9.101149093892451e+02, 9.112345947442931e+02, 9.123452416480455e+02, - 9.134470128623316e+02, 9.145400665964378e+02, 9.156245566787727e+02, 9.167006327204609e+02, 9.177684402713088e+02, - 9.188281209685779e+02, 9.198798126596431e+02, 9.209236496163513e+02, 9.219597625437120e+02, 9.229882787858735e+02, - 9.240093224233061e+02, 9.250230143858660e+02, 9.260294725609529e+02, 9.270288118795812e+02, 9.280211444761034e+02, - 9.290065797055061e+02, 9.299852242775123e+02, 9.309571823350673e+02, 9.319225555379239e+02, 9.328814431428191e+02, - 9.338339420804016e+02, 9.347801470290685e+02, 9.357201504858704e+02, 9.366540428346059e+02, 9.375819124112560e+02, - 9.385038455668653e+02, 9.394199267280120e+02, 9.403302384549519e+02, 9.412348614975612e+02, 9.421338748491696e+02, - 9.430273557983868e+02, 9.439153799790002e+02, 9.447980214180383e+02, 9.456753525820820e+02, 9.465474444218916e+02, - 9.474143664154307e+02, 9.482761866093555e+02, 9.491329716590262e+02, 9.499847868671227e+02, 9.508316962208958e+02, - 9.516737624281376e+02, 9.525110469519125e+02, 9.533436100440917e+02, 9.541715107777630e+02, 9.549948070785333e+02, - 9.558135557547994e+02, 9.566278125269963e+02, 9.574376320558924e+02, 9.582430679699542e+02, 9.590441728918111e+02, - 9.598409984638831e+02, 9.606335953731647e+02, 9.614220133752316e+02, 9.622063013174841e+02, 9.629865071616542e+02, - 9.637626780056170e+02, 9.645348601045131e+02, 9.653030988912325e+02, 9.660674389962587e+02, 9.668279242669157e+02, - 9.675845977860297e+02, 9.683375018900271e+02, 9.690866781864975e+02, 9.698321675712286e+02, 9.705740102447439e+02, - 9.713122457283520e+02, 9.720469128797278e+02, 9.727780499080446e+02, 9.735056943886680e+02, 9.742298832774327e+02, - 9.749506529245079e+02, 9.756680390878787e+02, 9.763820769464386e+02, 9.770928011127232e+02, 9.778002456452909e+02, - 9.785044440607552e+02, 9.792054293454939e+02, 9.799032339670341e+02, 9.805978898851318e+02, 9.812894285625475e+02, - 9.819778809755398e+02, 9.826632771625274e+02, 9.833456480615515e+02, 9.840250228061794e+02, 9.847014305260876e+02, - 9.853748999128763e+02, 9.860454592290093e+02, 9.867131363165253e+02, 9.873779586055219e+02, 9.880399531224249e+02, - 9.886991464980497e+02, 9.893555649754571e+02, 9.900092344176110e+02, 9.906601803148484e+02, 9.913084277921610e+02, - 9.919540016162982e+02, 9.925969262026956e+02, 9.932372256222337e+02, 9.938749236078313e+02, 9.945100435608836e+02, - 9.951426085575382e+02, 9.957726413548297e+02, 9.964001643966610e+02, 9.970251998196441e+02, 9.976477694588075e+02, - 9.982678948531662e+02, 9.988855972511591e+02, 9.995008976159669e+02, 1.000113816630704e+03, 1.000724374703486e+03, - 1.001332591972389e+03, 1.001938488310294e+03, 1.002542083329615e+03, 1.003143396386932e+03, 1.003742446587508e+03, - 1.004339252789716e+03, 1.004933833609359e+03, 1.005526207423897e+03, 1.006116392376585e+03, 1.006704406380514e+03, - 1.007290267122572e+03, 1.007873992067305e+03, 1.008455598460713e+03, 1.009035103333946e+03, 1.009612523506939e+03, - 1.010187875591949e+03, 1.010761175997042e+03, 1.011332440929477e+03, 1.011901686399046e+03, 1.012468928221326e+03, - 1.013034182020875e+03, 1.013597463234348e+03, 1.014158787113568e+03, 1.014718168728510e+03, 1.015275622970246e+03, - 1.015831164553820e+03, 1.016384808021057e+03, 1.016936567743336e+03, 1.017486457924282e+03, 1.018034492602426e+03, - 1.018580685653798e+03, 1.019125050794473e+03, 1.019667601583069e+03, 1.020208351423194e+03, 1.020747313565839e+03, - 1.021284501111738e+03, 1.021819927013665e+03, 1.022353604078702e+03, 1.022885544970454e+03, 1.023415762211224e+03, - 1.023944268184148e+03, 1.024471075135282e+03, 1.024996195175665e+03, 1.025519640283322e+03, 1.026041422305249e+03, - 1.026561552959349e+03, 1.027080043836331e+03, 1.027596906401586e+03, 1.028112151997010e+03, 1.028625791842814e+03, - 1.029137837039279e+03, 1.029648298568498e+03, 1.030157187296074e+03, 1.030664513972790e+03, 1.031170289236258e+03, - 1.031674523612515e+03, 1.032177227517622e+03, 1.032678411259207e+03, 1.033178085037995e+03, 1.033676258949307e+03, - 1.034172942984533e+03, 1.034668147032576e+03, 1.035161880881278e+03, 1.035654154218813e+03, 1.036144976635058e+03, - 1.036634357622947e+03, 1.037122306579787e+03, 1.037608832808569e+03, 1.038093945519241e+03, 1.038577653829971e+03, - 1.039059966768379e+03, 1.039540893272755e+03, 1.040020442193252e+03, 1.040498622293062e+03, 1.040975442249571e+03, - 1.041450910655492e+03, 1.041925036019986e+03, 1.042397826769755e+03, 1.042869291250125e+03, 1.043339437726109e+03, - 1.043808274383445e+03, 1.044275809329632e+03, 1.044742050594935e+03, 1.045207006133381e+03, 1.045670683823736e+03, - 1.046133091470467e+03, 1.046594236804689e+03, 1.047054127485100e+03, 1.047512771098892e+03, 1.047970175162653e+03, - 1.048426347123258e+03, 1.048881294358743e+03, 1.049335024179161e+03, 1.049787543827430e+03, 1.050238860480164e+03, - 1.050688981248499e+03, 1.051137913178890e+03, 1.051585663253916e+03, 1.052032238393054e+03, 1.052477645453453e+03, - 1.052921891230693e+03, 1.053364982459529e+03, 1.053806925814628e+03, 1.054247727911293e+03, 1.054687395306176e+03, - 1.055125934497977e+03, 1.055563351928143e+03, 1.055999653981541e+03, 1.056434846987135e+03, 1.056868937218642e+03, - 1.057301930895191e+03, 1.057733834181952e+03, 1.058164653190784e+03, 1.058594393980841e+03, 1.059023062559199e+03, - 1.059450664881452e+03, 1.059877206852310e+03, 1.060302694326190e+03, 1.060727133107789e+03, 1.061150528952654e+03, - 1.061572887567748e+03, 1.061994214612001e+03, 1.062414515696856e+03, 1.062833796386807e+03, 1.063252062199930e+03, - 1.063669318608405e+03, 1.064085571039030e+03, 1.064500824873734e+03, 1.064915085450069e+03, 1.065328358061712e+03, - 1.065740647958950e+03, 1.066151960349158e+03, 1.066562300397274e+03, 1.066971673226261e+03, 1.067380083917578e+03, - 1.067787537511623e+03, 1.068194039008187e+03, 1.068599593366892e+03, 1.069004205507632e+03, 1.069407880310994e+03, - 1.069810622618690e+03, 1.070212437233971e+03, 1.070613328922038e+03, 1.071013302410453e+03, 1.071412362389535e+03, - 1.071810513512763e+03, 1.072207760397157e+03, 1.072604107623671e+03, 1.072999559737573e+03, 1.073394121248815e+03, - 1.073787796632406e+03, 1.074180590328780e+03, 1.074572506744153e+03, 1.074963550250877e+03, 1.075353725187798e+03, - 1.075743035860598e+03, 1.076131486542134e+03, 1.076519081472782e+03, 1.076905824860766e+03, 1.077291720882491e+03, - 1.077676773682859e+03, 1.078060987375600e+03, 1.078444366043583e+03, 1.078826913739127e+03, 1.079208634484314e+03, - 1.079589532271288e+03, 1.079969611062561e+03, 1.080348874791304e+03, 1.080727327361647e+03, 1.081104972648962e+03, - 1.081481814500151e+03, 1.081857856733929e+03, 1.082233103141103e+03, 1.082607557484846e+03, 1.082981223500967e+03, - 1.083354104898183e+03, 1.083726205358381e+03, 1.084097528536883e+03, 1.084468078062701e+03, 1.084837857538796e+03, - 1.085206870542326e+03, 1.085575120624899e+03, 1.085942611312818e+03, 1.086309346107324e+03, 1.086675328484834e+03, - 1.087040561897186e+03, 1.087405049771861e+03, 1.087768795512228e+03, 1.088131802497762e+03, 1.088494074084279e+03, - 1.088855613604152e+03, 1.089216424366537e+03, 1.089576509657588e+03, 1.089935872740675e+03, 1.090294516856597e+03, - 1.090652445223789e+03, 1.091009661038535e+03, 1.091366167475169e+03, 1.091721967686284e+03, 1.092077064802926e+03, - 1.092431461934798e+03, 1.092785162170454e+03, 1.093138168577493e+03, 1.093490484202752e+03, 1.093842112072491e+03, - 1.094193055192589e+03, 1.094543316548719e+03, 1.094892899106541e+03, 1.095241805811874e+03, 1.095590039590880e+03, - 1.095937603350243e+03, 1.096284499977336e+03, 1.096630732340402e+03, 1.096976303288721e+03, 1.097321215652780e+03, - 1.097665472244440e+03, 1.098009075857100e+03, 1.098352029265862e+03, 1.098694335227694e+03, 1.099035996481586e+03, - 1.099377015748711e+03, 1.099717395732581e+03, 1.100057139119199e+03, 1.100396248577216e+03, 1.100734726758080e+03, - 1.101072576296184e+03, 1.101409799809015e+03, 1.101746399897304e+03, 1.102082379145165e+03, 1.102417740120240e+03, - 1.102752485373843e+03, 1.103086617441097e+03, 1.103420138841074e+03, 1.103753052076931e+03, 1.104085359636047e+03, - 1.104417063990157e+03, 1.104748167595481e+03, 1.105078672892863e+03, 1.105408582307893e+03, 1.105737898251039e+03 - }, - { - 1.701327836502977e+00, 5.187127707250382e+00, 8.735720426701583e+00, 1.234994782590756e+01, 1.603286096466714e+01, - 1.978774129369198e+01, 2.361812458190755e+01, 2.752782806339939e+01, 3.152098133827312e+01, 3.560206167844039e+01, - 3.977593452070744e+01, 4.404790009953199e+01, 4.842374738364011e+01, 5.290981674840159e+01, 5.751307315705955e+01, - 6.224119206111897e+01, 6.710266079595324e+01, 7.210689898546795e+01, 7.726440244090649e+01, 8.258691632997444e+01, - 8.808764512678607e+01, 9.378150920915934e+01, 9.968546120920612e+01, 1.058188797355665e+02, 1.122040644603731e+02, - 1.188668657084663e+02, 1.258374950243349e+02, 1.331515830049667e+02, 1.408515807410208e+02, 1.489886475694715e+02, - 1.576252421656347e+02, 1.668387539244906e+02, 1.767267151062088e+02, 1.874144872361744e+02, 1.990669545897159e+02, - 2.119069636425941e+02, 2.262456271356261e+02, 2.425345158662039e+02, 2.614601708477834e+02, 2.841228511001287e+02, - 3.123746038530018e+02, 3.493576202596086e+02, 3.997084275440957e+02, 4.626191634283791e+02, 5.190024315484657e+02, - 5.599075654482891e+02, 5.889986693742287e+02, 6.110646418198917e+02, 6.287367696935403e+02, 6.434472352531000e+02, - 6.560448981495030e+02, 6.670678455246683e+02, 6.768755073299975e+02, 6.857184821750345e+02, 6.937778073465753e+02, - 7.011882010870085e+02, 7.080524450950211e+02, 7.144506382039817e+02, 7.204463550842873e+02, 7.260908667529653e+02, - 7.314261069723473e+02, 7.364868035972308e+02, 7.413020397950220e+02, 7.458964173631274e+02, 7.502909369023287e+02, - 7.545036730020707e+02, 7.585502987081253e+02, 7.624444976159841e+02, 7.661982911057671e+02, 7.698223007448239e+02, - 7.733259606217954e+02, 7.767176906254692e+02, 7.800050389739955e+02, 7.831948003216836e+02, 7.862931143091749e+02, - 7.893055483321292e+02, 7.922371674818974e+02, 7.950925939869804e+02, 7.978760580052717e+02, 8.005914412470909e+02, - 8.032423146209715e+02, 8.058319708683612e+02, 8.083634529750733e+02, 8.108395790057026e+02, 8.132629638939771e+02, - 8.156360386309052e+02, 8.179610672189534e+02, 8.202401617005615e+02, 8.224752955203562e+02, 8.246683154401624e+02, - 8.268209521927222e+02, 8.289348300325100e+02, 8.310114753190240e+02, 8.330523242488189e+02, 8.350587298363627e+02, - 8.370319682302461e+02, 8.389732444397332e+02, 8.408836975368953e+02, 8.427644053912055e+02, 8.446163889863672e+02, - 8.464406163630313e+02, 8.482380062257537e+02, 8.500094312480638e+02, 8.517557211055109e+02, 8.534776652631912e+02, - 8.551760155412460e+02, 8.568514884792471e+02, 8.585047675181091e+02, 8.601365050161681e+02, 8.617473241143273e+02, - 8.633378204636166e+02, 8.649085638271683e+02, 8.664600995673795e+02, 8.679929500279947e+02, 8.695076158198748e+02, - 8.710045770183787e+02, 8.724842942795411e+02, 8.739472098815423e+02, 8.753937486973883e+02, 8.768243191041540e+02, - 8.782393138336980e+02, 8.796391107692721e+02, 8.810240736921211e+02, 8.823945529817590e+02, 8.837508862733328e+02, - 8.850933990751721e+02, 8.864224053493855e+02, 8.877382080626762e+02, 8.890410997373772e+02, 8.903313629150749e+02, - 8.916092705908313e+02, 8.928750854663742e+02, 8.941290641725873e+02, 8.953714527081162e+02, 8.966024903439828e+02, - 8.978224080627094e+02, 8.990314297922922e+02, 9.002297724794651e+02, 9.014176463816445e+02, 9.025952553437096e+02, - 9.037627970605681e+02, 9.049204633263552e+02, 9.060684402710929e+02, 9.072069085855439e+02, 9.083360437349637e+02, - 9.094560161623995e+02, 9.105669914821467e+02, 9.116691306639239e+02, 9.127625902082999e+02, 9.138475223138629e+02, - 9.149240750181168e+02, 9.159923924249415e+02, 9.170526147340364e+02, 9.181048784581939e+02, 9.191493165536472e+02, - 9.201860584722825e+02, 9.212152303953943e+02, 9.222369552726326e+02, 9.232513529643164e+02, 9.242585402964522e+02, - 9.252586312400136e+02, 9.262517368879238e+02, 9.272379658190715e+02, 9.282174238134052e+02, 9.291902141789587e+02, - 9.301564377750888e+02, 9.311161930910263e+02, 9.320695763212575e+02, 9.330166814379140e+02, 9.339576002602892e+02, - 9.348924225216299e+02, 9.358212359333323e+02, 9.367441262466511e+02, 9.376611773120527e+02, 9.385724711363046e+02, - 9.394780879374191e+02, 9.403781061975334e+02, 9.412726027138319e+02, 9.421616526475857e+02, 9.430453295714024e+02, - 9.439237055147578e+02, 9.447968510078904e+02, 9.456648351241183e+02, 9.465277255206655e+02, 9.473855884780347e+02, - 9.482384889380161e+02, 9.490864905403654e+02, 9.499296556582216e+02, 9.507680454323153e+02, 9.516017198040034e+02, - 9.524307375472010e+02, 9.532551562992309e+02, 9.540750325906574e+02, 9.548904218741235e+02, 9.557013785522491e+02, - 9.565079560046145e+02, 9.573102066138733e+02, 9.581081817910198e+02, 9.589019319998558e+02, 9.596915067806773e+02, - 9.604769547732135e+02, 9.612583237388484e+02, 9.620356605821514e+02, 9.628090113717418e+02, 9.635784213605098e+02, - 9.643439350052274e+02, 9.651055959855547e+02, 9.658634472224833e+02, 9.666175308962196e+02, 9.673678884635414e+02, - 9.681145606746391e+02, 9.688575875894618e+02, 9.695970085935872e+02, 9.703328624136285e+02, 9.710651871322024e+02, - 9.717940202024602e+02, 9.725193984622102e+02, 9.732413581476430e+02, 9.739599349066590e+02, 9.746751638118344e+02, - 9.753870793730216e+02, 9.760957155496022e+02, 9.768011057624008e+02, 9.775032829052752e+02, 9.782022793563918e+02, - 9.788981269891957e+02, 9.795908571830869e+02, 9.802805003588244e+02, 9.809670878694548e+02, 9.816506492171322e+02, - 9.823312139062522e+02, 9.830088109964415e+02, 9.836834691116541e+02, 9.843552164490300e+02, 9.850240807875289e+02, - 9.856900894963418e+02, 9.863532695430914e+02, 9.870136475018203e+02, 9.876712495607818e+02, 9.883261015300391e+02, - 9.889782288488632e+02, 9.896276565929655e+02, 9.902744094815398e+02, 9.909185118841327e+02, 9.915599878273507e+02, - 9.921988610014075e+02, 9.928351547665022e+02, 9.934688921590562e+02, 9.941000958977963e+02, 9.947287883896912e+02, - 9.953549917357553e+02, 9.959787277367058e+02, 9.966000178984963e+02, 9.972188834377183e+02, 9.978353452868749e+02, - 9.984494240995392e+02, 9.990611402553898e+02, 9.996705138651309e+02, 1.000277564775305e+03, 1.000882312572994e+03, - 1.001484776590413e+03, 1.002084975909403e+03, 1.002682929365831e+03, 1.003278655553872e+03, 1.003872172830225e+03, - 1.004463499318209e+03, 1.005052652911789e+03, 1.005639651279504e+03, 1.006224511868317e+03, 1.006807251907374e+03, - 1.007387888411688e+03, 1.007966438185745e+03, 1.008542917827028e+03, 1.009117343729473e+03, 1.009689732086847e+03, - 1.010260098896057e+03, 1.010828459960393e+03, 1.011394830892695e+03, 1.011959227118467e+03, 1.012521663878912e+03, - 1.013082156233921e+03, 1.013640719064988e+03, 1.014197367078069e+03, 1.014752114806389e+03, 1.015304976613185e+03, - 1.015855966694397e+03, 1.016405099081304e+03, 1.016952387643114e+03, 1.017497846089490e+03, 1.018041487973038e+03, - 1.018583326691741e+03, 1.019123375491345e+03, 1.019661647467698e+03, 1.020198155569050e+03, 1.020732912598298e+03, - 1.021265931215197e+03, 1.021797223938523e+03, 1.022326803148196e+03, 1.022854681087370e+03, 1.023380869864465e+03, - 1.023905381455184e+03, 1.024428227704472e+03, 1.024949420328452e+03, 1.025468970916318e+03, 1.025986890932196e+03, - 1.026503191716965e+03, 1.027017884490054e+03, 1.027530980351199e+03, 1.028042490282168e+03, 1.028552425148458e+03, - 1.029060795700958e+03, 1.029567612577586e+03, 1.030072886304890e+03, 1.030576627299629e+03, 1.031078845870318e+03, - 1.031579552218747e+03, 1.032078756441481e+03, 1.032576468531319e+03, 1.033072698378742e+03, 1.033567455773325e+03, - 1.034060750405132e+03, 1.034552591866079e+03, 1.035042989651282e+03, 1.035531953160374e+03, 1.036019491698803e+03, - 1.036505614479110e+03, 1.036990330622179e+03, 1.037473649158474e+03, 1.037955579029243e+03, 1.038436129087717e+03, - 1.038915308100276e+03, 1.039393124747600e+03, 1.039869587625803e+03, 1.040344705247547e+03, 1.040818486043134e+03, - 1.041290938361583e+03, 1.041762070471690e+03, 1.042231890563068e+03, 1.042700406747172e+03, 1.043167627058310e+03, - 1.043633559454625e+03, 1.044098211819082e+03, 1.044561591960417e+03, 1.045023707614090e+03, 1.045484566443205e+03, - 1.045944176039432e+03, 1.046402543923902e+03, 1.046859677548092e+03, 1.047315584294699e+03, 1.047770271478494e+03, - 1.048223746347172e+03, 1.048676016082173e+03, 1.049127087799510e+03, 1.049576968550566e+03, 1.050025665322892e+03, - 1.050473185040986e+03, 1.050919534567059e+03, 1.051364720701794e+03, 1.051808750185089e+03, 1.052251629696795e+03, - 1.052693365857431e+03, 1.053133965228900e+03, 1.053573434315194e+03, 1.054011779563072e+03, 1.054449007362754e+03, - 1.054885124048579e+03, 1.055320135899672e+03, 1.055754049140589e+03, 1.056186869941961e+03, 1.056618604421122e+03, - 1.057049258642732e+03, 1.057478838619389e+03, 1.057907350312229e+03, 1.058334799631529e+03, 1.058761192437281e+03, - 1.059186534539780e+03, 1.059610831700188e+03, 1.060034089631093e+03, 1.060456313997067e+03, 1.060877510415205e+03, - 1.061297684455668e+03, 1.061716841642206e+03, 1.062134987452685e+03, 1.062552127319600e+03, 1.062968266630581e+03, - 1.063383410728892e+03, 1.063797564913928e+03, 1.064210734441697e+03, 1.064622924525304e+03, 1.065034140335417e+03, - 1.065444387000740e+03, 1.065853669608466e+03, 1.066261993204738e+03, 1.066669362795089e+03, 1.067075783344887e+03, - 1.067481259779768e+03, 1.067885796986065e+03, 1.068289399811234e+03, 1.068692073064268e+03, 1.069093821516109e+03, - 1.069494649900055e+03, 1.069894562912165e+03, 1.070293565211645e+03, 1.070691661421246e+03, 1.071088856127645e+03, - 1.071485153881828e+03, 1.071880559199461e+03, 1.072275076561263e+03, 1.072668710413367e+03, 1.073061465167684e+03, - 1.073453345202258e+03, 1.073844354861613e+03, 1.074234498457104e+03, 1.074623780267255e+03, 1.075012204538099e+03, - 1.075399775483509e+03, 1.075786497285526e+03, 1.076172374094687e+03, 1.076557410030338e+03, 1.076941609180960e+03, - 1.077324975604473e+03, 1.077707513328548e+03, 1.078089226350907e+03, 1.078470118639630e+03, 1.078850194133447e+03, - 1.079229456742029e+03, 1.079607910346284e+03, 1.079985558798636e+03, 1.080362405923308e+03, 1.080738455516602e+03, - 1.081113711347177e+03, 1.081488177156312e+03, 1.081861856658182e+03, 1.082234753540122e+03, 1.082606871462881e+03, - 1.082978214060892e+03, 1.083348784942518e+03, 1.083718587690310e+03, 1.084087625861250e+03, 1.084455902987005e+03, - 1.084823422574163e+03, 1.085190188104475e+03, 1.085556203035095e+03, 1.085921470798811e+03, 1.086285994804281e+03, - 1.086649778436254e+03, 1.087012825055804e+03, 1.087375138000549e+03, 1.087736720584873e+03, 1.088097576100145e+03, - 1.088457707814933e+03, 1.088817118975216e+03, 1.089175812804598e+03, 1.089533792504512e+03, 1.089891061254430e+03, - 1.090247622212062e+03, 1.090603478513558e+03, 1.090958633273710e+03, 1.091313089586142e+03, 1.091666850523507e+03, - 1.092019919137682e+03, 1.092372298459953e+03, 1.092723991501200e+03, 1.093075001252091e+03, 1.093425330683257e+03, - 1.093774982745476e+03, 1.094123960369851e+03, 1.094472266467990e+03, 1.094819903932174e+03, 1.095166875635538e+03, - 1.095513184432238e+03, 1.095858833157617e+03, 1.096203824628380e+03, 1.096548161642749e+03, 1.096891846980637e+03, - 1.097234883403802e+03, 1.097577273656010e+03, 1.097919020463193e+03, 1.098260126533604e+03, 1.098600594557973e+03, - 1.098940427209657e+03, 1.099279627144797e+03, 1.099618197002460e+03, 1.099956139404794e+03, 1.100293456957170e+03, - 1.100630152248326e+03, 1.100966227850514e+03, 1.101301686319640e+03, 1.101636530195400e+03, 1.101970762001426e+03, - 1.102304384245417e+03, 1.102637399419276e+03, 1.102969809999248e+03, 1.103301618446044e+03, 1.103632827204983e+03 - }, - { - 1.695711132541665e+00, 5.169502068105792e+00, 8.705152749500085e+00, 1.230542247177328e+01, 1.597327048484206e+01, - 1.971187585499763e+01, 2.352465987058886e+01, 2.741531140162334e+01, 3.138781569255044e+01, 3.544648717056794e+01, - 3.959600696611827e+01, 4.384146599005007e+01, 4.818841459491445e+01, 5.264292007814160e+01, 5.721163357593682e+01, - 6.190186826833237e+01, 6.672169129242103e+01, 7.168003237839037e+01, 7.678681302928516e+01, 8.205310112817115e+01, - 8.749129727073989e+01, 9.311536102342789e+01, 9.894108789365166e+01, 1.049864513584716e+02, 1.112720292605887e+02, - 1.178215408958522e+02, 1.246625311840786e+02, 1.318272530016802e+02, 1.393538205879198e+02, 1.472877398353921e+02, - 1.556839727413676e+02, 1.646097737306582e+02, 1.741486677059257e+02, 1.844061596504859e+02, 1.955181456972497e+02, - 2.076636730356485e+02, 2.210849438825634e+02, 2.361198209224099e+02, 2.532565976401486e+02, 2.732289087040577e+02, - 2.971789813982052e+02, 3.269031922800188e+02, 3.650322311623864e+02, 4.142009499469160e+02, 4.698271564680101e+02, - 5.186309476880714e+02, 5.557814208416860e+02, 5.834644733129585e+02, 6.050087019311810e+02, 6.225211677402108e+02, - 6.372336209146072e+02, 6.499068546065467e+02, 6.610377823738783e+02, 6.709658533800509e+02, 6.799317375956360e+02, - 6.881115284591516e+02, 6.956375682249187e+02, 7.026116203264099e+02, 7.091134903285229e+02, 7.152068424667145e+02, - 7.209432309557436e+02, 7.263649607054124e+02, 7.315071598328765e+02, 7.363993087965247e+02, 7.410663870356079e+02, - 7.455297453398658e+02, 7.498077782862603e+02, 7.539164487643644e+02, 7.578697016076385e+02, 7.616797930690470e+02, - 7.653575557183276e+02, 7.689126132729967e+02, 7.723535562425830e+02, 7.756880866277469e+02, 7.789231379782973e+02, - 7.820649756756142e+02, 7.851192812266344e+02, 7.880912235406990e+02, 7.909855195380402e+02, 7.938064859598354e+02, - 7.965580838786511e+02, 7.992439571183776e+02, 8.018674655650359e+02, 8.044317141697045e+02, 8.069395783014129e+02, - 8.093937259929750e+02, 8.117966375303057e+02, 8.141506227607966e+02, 8.164578364354094e+02, 8.187202918492341e+02, - 8.209398730042476e+02, 8.231183454841437e+02, 8.252573662029628e+02, 8.273584921658759e+02, 8.294231883608237e+02, - 8.314528348832738e+02, 8.334487333824658e+02, 8.354121129057428e+02, 8.373441352075896e+02, 8.392458995814777e+02, - 8.411184472653340e+02, 8.429627654651878e+02, 8.447797910361982e+02, 8.465704138555853e+02, 8.483354799179921e+02, - 8.500757941803026e+02, 8.517921231799100e+02, 8.534851974477687e+02, 8.551557137352509e+02, 8.568043370717960e+02, - 8.584317026685483e+02, 8.600384176816070e+02, 8.616250628471247e+02, 8.631921939992578e+02, 8.647403434808853e+02, - 8.662700214560488e+02, 8.677817171321915e+02, 8.692758998995320e+02, 8.707530203942000e+02, 8.722135114911633e+02, - 8.736577892324195e+02, 8.750862536954406e+02, 8.764992898064137e+02, 8.778972681024233e+02, 8.792805454463598e+02, - 8.806494656980187e+02, 8.820043603445672e+02, 8.833455490936443e+02, 8.846733404549861e+02, 8.859880322793142e+02, - 8.872899122161672e+02, 8.885792572938176e+02, 8.898563371392983e+02, 8.911214108107777e+02, 8.923747299391065e+02, - 8.936165373545099e+02, 8.948470683594414e+02, 8.960665508223896e+02, 8.972752054924123e+02, 8.984732462971723e+02, - 8.996608806254877e+02, 9.008383095953712e+02, 9.020057283084232e+02, 9.031633260914097e+02, 9.043112867257938e+02, - 9.054497886659241e+02, 9.065790052465525e+02, 9.076991048803005e+02, 9.088102512456417e+02, 9.099126034483309e+02, - 9.110063162820918e+02, 9.120915402074814e+02, 9.131684216942315e+02, 9.142371032741326e+02, 9.152977237016515e+02, - 9.163504180888943e+02, 9.173953180345451e+02, 9.184325517471128e+02, 9.194622441750939e+02, 9.204845170692113e+02, - 9.214994891680186e+02, 9.225072762479319e+02, 9.235079912358328e+02, 9.245017443038309e+02, 9.254886428707931e+02, - 9.264687920358982e+02, 9.274422941574855e+02, 9.284092492601213e+02, 9.293697550320032e+02, 9.303239068987839e+02, - 9.312717980944751e+02, 9.322135197295638e+02, 9.331491608564795e+02, 9.340788085325224e+02, 9.350025478803846e+02, - 9.359204621463656e+02, 9.368326327563889e+02, 9.377391393699221e+02, 9.386400599318875e+02, 9.395354707226609e+02, - 9.404254464062367e+02, 9.413100600766415e+02, 9.421893833026792e+02, 9.430634861710643e+02, 9.439324373280252e+02, - 9.447963040194437e+02, 9.456551521295818e+02, 9.465090462184637e+02, 9.473580495579686e+02, 9.482022241666808e+02, - 9.490416308435608e+02, 9.498763292004702e+02, 9.507063776936101e+02, 9.515318336539071e+02, 9.523527533163978e+02, - 9.531691918486441e+02, 9.539812033782204e+02, 9.547888410193083e+02, 9.555921568984403e+02, 9.563912021794107e+02, - 9.571860270874022e+02, 9.579766809323464e+02, 9.587632121315513e+02, 9.595456682316270e+02, 9.603240959297292e+02, - 9.610985410941496e+02, 9.618690487842795e+02, 9.626356632699636e+02, 9.633984280502710e+02, 9.641573858717037e+02, - 9.649125787458639e+02, 9.656640479665962e+02, 9.664118341266226e+02, 9.671559771336980e+02, 9.678965162262915e+02, - 9.686334899888121e+02, 9.693669363664043e+02, 9.700968926793173e+02, 9.708233956368614e+02, 9.715464813509849e+02, - 9.722661853494533e+02, 9.729825425886767e+02, 9.736955874661678e+02, 9.744053538326694e+02, 9.751118750039421e+02, - 9.758151837722326e+02, 9.765153124174313e+02, 9.772122922484200e+02, 9.779061554726052e+02, 9.785969324458869e+02, - 9.792846535044539e+02, 9.799693485236187e+02, 9.806510469273098e+02, 9.813297776973244e+02, 9.820055693823306e+02, - 9.826784501066537e+02, 9.833484475788223e+02, 9.840155890999044e+02, 9.846799015716364e+02, 9.853414115043340e+02, - 9.860001450246206e+02, 9.866561278829528e+02, 9.873093854609615e+02, 9.879599427786171e+02, 9.886078245012093e+02, - 9.892530549461674e+02, 9.898956580897056e+02, 9.905356575733180e+02, 9.911730767101044e+02, 9.918079384909574e+02, - 9.924402655905958e+02, 9.930700803734561e+02, 9.936974048994481e+02, 9.943222609295706e+02, 9.949446699314011e+02, - 9.955646530844557e+02, 9.961822312854268e+02, 9.967974251532983e+02, 9.974102550343471e+02, 9.980207410070251e+02, - 9.986289028867407e+02, 9.992347602305218e+02, 9.998383323415804e+02, 1.000439638273776e+03, 1.001038696835974e+03, - 1.001635526596316e+03, 1.002230145886390e+03, 1.002822572805312e+03, 1.003412825223715e+03, 1.004000920787660e+03, - 1.004586876922452e+03, 1.005170710836384e+03, 1.005752439524390e+03, 1.006332079771632e+03, 1.006909648157001e+03, - 1.007485161056551e+03, 1.008058634646857e+03, 1.008630084908304e+03, 1.009199527628309e+03, 1.009766978404472e+03, - 1.010332452647668e+03, 1.010895965585067e+03, 1.011457532263107e+03, 1.012017167550385e+03, 1.012574886140511e+03, - 1.013130702554887e+03, 1.013684631145446e+03, 1.014236686097320e+03, 1.014786881431468e+03, 1.015335231007246e+03, - 1.015881748524922e+03, 1.016426447528154e+03, 1.016969341406405e+03, 1.017510443397322e+03, 1.018049766589063e+03, - 1.018587323922579e+03, 1.019123128193855e+03, 1.019657192056105e+03, 1.020189528021928e+03, 1.020720148465422e+03, - 1.021249065624252e+03, 1.021776291601691e+03, 1.022301838368611e+03, 1.022825717765442e+03, 1.023347941504097e+03, - 1.023868521169855e+03, 1.024387468223213e+03, 1.024904794001701e+03, 1.025420509721672e+03, 1.025934626480047e+03, - 1.026447155256033e+03, 1.026958106912819e+03, 1.027467492199223e+03, 1.027975321751329e+03, 1.028481606094078e+03, - 1.028986355642842e+03, 1.029489580704962e+03, 1.029991291481268e+03, 1.030491498067562e+03, 1.030990210456079e+03, - 1.031487438536925e+03, 1.031983192099488e+03, 1.032477480833822e+03, 1.032970314332010e+03, 1.033461702089503e+03, - 1.033951653506433e+03, 1.034440177888910e+03, 1.034927284450288e+03, 1.035412982312416e+03, 1.035897280506870e+03, - 1.036380187976151e+03, 1.036861713574879e+03, 1.037341866070959e+03, 1.037820654146723e+03, 1.038298086400066e+03, - 1.038774171345547e+03, 1.039248917415488e+03, 1.039722332961040e+03, 1.040194426253243e+03, 1.040665205484062e+03, - 1.041134678767408e+03, 1.041602854140143e+03, 1.042069739563069e+03, 1.042535342921895e+03, 1.042999672028204e+03, - 1.043462734620383e+03, 1.043924538364555e+03, 1.044385090855490e+03, 1.044844399617498e+03, 1.045302472105318e+03, - 1.045759315704982e+03, 1.046214937734670e+03, 1.046669345445553e+03, 1.047122546022623e+03, 1.047574546585505e+03, - 1.048025354189261e+03, 1.048474975825184e+03, 1.048923418421570e+03, 1.049370688844487e+03, 1.049816793898535e+03, - 1.050261740327579e+03, 1.050705534815487e+03, 1.051148183986850e+03, 1.051589694407690e+03, 1.052030072586161e+03, - 1.052469324973235e+03, 1.052907457963381e+03, 1.053344477895237e+03, 1.053780391052259e+03, 1.054215203663380e+03, - 1.054648921903639e+03, 1.055081551894817e+03, 1.055513099706054e+03, 1.055943571354461e+03, 1.056372972805722e+03, - 1.056801309974683e+03, 1.057228588725945e+03, 1.057654814874433e+03, 1.058079994185967e+03, 1.058504132377818e+03, - 1.058927235119267e+03, 1.059349308032140e+03, 1.059770356691349e+03, 1.060190386625420e+03, 1.060609403317013e+03, - 1.061027412203433e+03, 1.061444418677143e+03, 1.061860428086255e+03, 1.062275445735026e+03, 1.062689476884344e+03, - 1.063102526752207e+03, 1.063514600514191e+03, 1.063925703303917e+03, 1.064335840213512e+03, 1.064745016294059e+03, - 1.065153236556044e+03, 1.065560505969798e+03, 1.065966829465928e+03, 1.066372211935745e+03, 1.066776658231692e+03, - 1.067180173167754e+03, 1.067582761519875e+03, 1.067984428026355e+03, 1.068385177388263e+03, 1.068785014269820e+03, - 1.069183943298793e+03, 1.069581969066881e+03, 1.069979096130091e+03, 1.070375329009117e+03, 1.070770672189700e+03, - 1.071165130123005e+03, 1.071558707225969e+03, 1.071951407881662e+03, 1.072343236439640e+03, 1.072734197216281e+03, - 1.073124294495135e+03, 1.073513532527257e+03, 1.073901915531544e+03, 1.074289447695052e+03, 1.074676133173335e+03, - 1.075061976090752e+03, 1.075446980540791e+03, 1.075831150586375e+03, 1.076214490260175e+03, 1.076597003564909e+03, - 1.076978694473645e+03, 1.077359566930097e+03, 1.077739624848914e+03, 1.078118872115977e+03, 1.078497312588673e+03, - 1.078874950096186e+03, 1.079251788439769e+03, 1.079627831393025e+03, 1.080003082702171e+03, 1.080377546086311e+03, - 1.080751225237698e+03, 1.081124123821999e+03, 1.081496245478547e+03, 1.081867593820604e+03, 1.082238172435603e+03, - 1.082607984885408e+03, 1.082977034706552e+03, 1.083345325410480e+03, 1.083712860483795e+03, 1.084079643388487e+03, - 1.084445677562175e+03, 1.084810966418333e+03, 1.085175513346519e+03, 1.085539321712604e+03, 1.085902394858992e+03, - 1.086264736104844e+03, 1.086626348746291e+03, 1.086987236056655e+03, 1.087347401286657e+03, 1.087706847664631e+03, - 1.088065578396730e+03, 1.088423596667129e+03, 1.088780905638237e+03, 1.089137508450885e+03, 1.089493408224535e+03, - 1.089848608057471e+03, 1.090203111026992e+03, 1.090556920189609e+03, 1.090910038581227e+03, 1.091262469217339e+03, - 1.091614215093206e+03, 1.091965279184043e+03, 1.092315664445199e+03, 1.092665373812333e+03, 1.093014410201598e+03, - 1.093362776509808e+03, 1.093710475614615e+03, 1.094057510374679e+03, 1.094403883629838e+03, 1.094749598201271e+03, - 1.095094656891670e+03, 1.095439062485395e+03, 1.095782817748647e+03, 1.096125925429613e+03, 1.096468388258637e+03, - 1.096810208948370e+03, 1.097151390193925e+03, 1.097491934673031e+03, 1.097831845046184e+03, 1.098171123956794e+03, - 1.098509774031338e+03, 1.098847797879502e+03, 1.099185198094325e+03, 1.099521977252347e+03, 1.099858137913746e+03, - 1.100193682622480e+03, 1.100528613906425e+03, 1.100862934277512e+03, 1.101196646231863e+03, 1.101529752249924e+03 - }, - { - 1.690131939898974e+00, 5.152001112709456e+00, 8.674813955015532e+00, 1.226124981461546e+01, 1.591417914986750e+01, - 1.963668217179535e+01, 2.343206982703837e+01, 2.730390749101703e+01, 3.125604180116054e+01, 3.529263115111956e+01, - 3.941818046631221e+01, 4.363758100966886e+01, 4.795615612458268e+01, 5.237971401989712e+01, 5.691460895076552e+01, - 6.156781246417466e+01, 6.634699678053494e+01, 7.126063289933454e+01, 7.631810668701573e+01, 8.152985708076284e+01, - 8.690754169669940e+01, 9.246423666879565e+01, 9.821467961378384e+01, 1.041755674318307e+02, 1.103659245265286e+02, - 1.168075624274771e+02, 1.235256594284283e+02, 1.305494997939439e+02, 1.379134280427216e+02, 1.456580973274988e+02, - 1.538321268885547e+02, 1.624943380742478e+02, 1.717168253768943e+02, 1.815892582531720e+02, 1.922250401578343e+02, - 2.037703417960356e+02, 2.164177021222105e+02, 2.304270785193995e+02, 2.461592901764700e+02, 2.641300805879214e+02, - 2.850964107418214e+02, 3.101799717211657e+02, 3.409736548969248e+02, 3.793824898474268e+02, 4.261102089091421e+02, - 4.752652883616822e+02, 5.182114258754896e+02, 5.521593470000446e+02, 5.784493653129069e+02, 5.993985668649067e+02, - 6.166731954557937e+02, 6.313215351685931e+02, 6.440182586085167e+02, 6.552169068387960e+02, 6.652342394730263e+02, - 6.742987340508510e+02, 6.825798220517142e+02, 6.902061999802468e+02, 6.972776788360705e+02, 7.038730818275233e+02, - 7.100556519141209e+02, 7.158768455762931e+02, 7.213790529802878e+02, 7.265975864479087e+02, 7.315621592200939e+02, - 7.362980021109655e+02, 7.408267183535357e+02, 7.451669461617387e+02, 7.493348780681995e+02, 7.533446722156823e+02, - 7.572087811932321e+02, 7.609382172780954e+02, 7.645427681499677e+02, 7.680311736825195e+02, 7.714112718873763e+02, - 7.746901202163567e+02, 7.778740970321857e+02, 7.809689870063454e+02, 7.839800534032121e+02, 7.869120995969929e+02, - 7.897695216947362e+02, 7.925563537706171e+02, 7.952763069283519e+02, 7.979328031813230e+02, 8.005290049596456e+02, - 8.030678409095393e+02, 8.055520285348899e+02, 8.079840941376840e+02, 8.103663904384260e+02, 8.127011121960192e+02, - 8.149903100960938e+02, 8.172359031352386e+02, 8.194396896941922e+02, 8.216033574645631e+02, 8.237284923698193e+02, - 8.258165866013933e+02, 8.278690458739832e+02, 8.298871959900061e+02, 8.318722887912186e+02, 8.338255075652997e+02, - 8.357479719665854e+02, 8.376407425026725e+02, 8.395048246322823e+02, 8.413411725142679e+02, 8.431506924429477e+02, - 8.449342460008262e+02, 8.466926529562199e+02, 8.484266939302232e+02, 8.501371128547245e+02, 8.518246192408427e+02, - 8.534898902750745e+02, 8.551335727586222e+02, 8.567562849037706e+02, 8.583586179997729e+02, 8.599411379594346e+02, - 8.615043867565091e+02, 8.630488837629958e+02, 8.645751269945878e+02, 8.660835942717107e+02, 8.675747443029234e+02, - 8.690490176967993e+02, 8.705068379078755e+02, 8.719486121217354e+02, 8.733747320838593e+02, 8.747855748764581e+02, - 8.761815036471406e+02, 8.775628682929586e+02, 8.789300061030413e+02, 8.802832423714614e+02, 8.816228910004085e+02, - 8.829492550039706e+02, 8.842626263456424e+02, 8.855632883979944e+02, 8.868515138391421e+02, 8.881275672328157e+02, - 8.893917038056961e+02, 8.906441707549988e+02, 8.918852073659282e+02, 8.931150453502828e+02, 8.943339091671161e+02, - 8.955420163265693e+02, 8.967395776779415e+02, 8.979267976829403e+02, 8.991038746750312e+02, 9.002710011057284e+02, - 9.014283637785874e+02, 9.025761440716465e+02, 9.037145181658020e+02, 9.048436571609809e+02, 9.059637274405205e+02, - 9.070748906780128e+02, 9.081773041008283e+02, 9.092711206375960e+02, 9.103564890763546e+02, 9.114335542154540e+02, - 9.125024570076025e+02, 9.135633346974382e+02, 9.146163209529599e+02, 9.156615460033247e+02, 9.166991367090226e+02, - 9.177292167536762e+02, 9.187519067013025e+02, 9.197673241151266e+02, 9.207755836583865e+02, 9.217767971909003e+02, - 9.227710738616150e+02, 9.237585201973407e+02, 9.247392400705616e+02, 9.257133352372955e+02, 9.266809047494962e+02, - 9.276420454626177e+02, 9.285968520025368e+02, 9.295454168349535e+02, 9.304878303320908e+02, 9.314241808368083e+02, - 9.323545547242582e+02, 9.332790364611913e+02, 9.341977086630224e+02, 9.351106521487533e+02, 9.360179459938528e+02, - 9.369196675811820e+02, 9.378158926500569e+02, 9.387066953435173e+02, 9.395921482538955e+02, 9.404723224667505e+02, - 9.413472876032326e+02, 9.422171118609590e+02, 9.430818620534494e+02, 9.439416036481923e+02, 9.447964008033925e+02, - 9.456463164034590e+02, 9.464914120932821e+02, 9.473317483113483e+02, 9.481673843217471e+02, 9.489983782451051e+02, - 9.498247870884959e+02, 9.506466667743651e+02, 9.514640721685088e+02, 9.522770571071477e+02, 9.530856744231203e+02, - 9.538899759712411e+02, 9.546900126528569e+02, 9.554858344396097e+02, 9.562774903964784e+02, 9.570650287040760e+02, - 9.578484966802713e+02, 9.586279408011427e+02, 9.594034067212805e+02, 9.601749392934879e+02, 9.609425825878723e+02, - 9.617063799103717e+02, 9.624663738207230e+02, 9.632226061499032e+02, 9.639751180170521e+02, 9.647239498458974e+02, - 9.654691413807117e+02, 9.662107317017977e+02, 9.669487592405272e+02, 9.676832617939629e+02, 9.684142765390496e+02, - 9.691418400464154e+02, 9.698659882937795e+02, 9.705867566789893e+02, 9.713041800326916e+02, 9.720182926306620e+02, - 9.727291282057857e+02, 9.734367199597197e+02, 9.741411001104157e+02, 9.748423017394050e+02, 9.755403560762239e+02, - 9.762352943080411e+02, 9.769271471445544e+02, 9.776159448279004e+02, 9.783017171423077e+02, 9.789844934234968e+02, - 9.796643025678306e+02, 9.803411730412412e+02, 9.810151328879151e+02, 9.816862097387669e+02, 9.823544308196924e+02, - 9.830198229596134e+02, 9.836824125983277e+02, 9.843422257941513e+02, 9.849992882313833e+02, 9.856536252275781e+02, - 9.863052617406437e+02, 9.869542223757600e+02, 9.876005313921409e+02, 9.882442127096178e+02, 9.888852899150797e+02, - 9.895237862687454e+02, 9.901597247102978e+02, 9.907931278648645e+02, 9.914240180488631e+02, 9.920524172757071e+02, - 9.926783472613760e+02, 9.933018294298624e+02, 9.939228849184869e+02, 9.945415345830950e+02, 9.951577990031310e+02, - 9.957716984866036e+02, 9.963832530749271e+02, 9.969924825476676e+02, 9.975994064271717e+02, 9.982040439830967e+02, - 9.988064142368384e+02, 9.994065359658624e+02, 1.000004427707938e+03, 1.000600107765284e+03, 1.001193594208615e+03, - 1.001784904881110e+03, 1.002374057402287e+03, 1.002961069171802e+03, 1.003545957373157e+03, 1.004128738977341e+03, - 1.004709430746381e+03, 1.005288049236826e+03, 1.005864610803158e+03, 1.006439131601127e+03, 1.007011627591017e+03, - 1.007582114540852e+03, 1.008150608029521e+03, 1.008717123449859e+03, 1.009281676011641e+03, 1.009844280744535e+03, - 1.010404952500986e+03, 1.010963705959040e+03, 1.011520555625120e+03, 1.012075515836733e+03, 1.012628600765135e+03, - 1.013179824417941e+03, 1.013729200641672e+03, 1.014276743124273e+03, 1.014822465397554e+03, 1.015366380839614e+03, - 1.015908502677191e+03, 1.016448843987983e+03, 1.016987417702917e+03, 1.017524236608378e+03, 1.018059313348391e+03, - 1.018592660426766e+03, 1.019124290209200e+03, 1.019654214925340e+03, 1.020182446670805e+03, 1.020708997409171e+03, - 1.021233878973925e+03, 1.021757103070370e+03, 1.022278681277505e+03, 1.022798625049869e+03, 1.023316945719348e+03, - 1.023833654496948e+03, 1.024348762474540e+03, 1.024862280626570e+03, 1.025374219811740e+03, 1.025884590774656e+03, - 1.026393404147450e+03, 1.026900670451371e+03, 1.027406400098344e+03, 1.027910603392510e+03, 1.028413290531730e+03, - 1.028914471609068e+03, 1.029414156614246e+03, 1.029912355435072e+03, 1.030409077858845e+03, 1.030904333573739e+03, - 1.031398132170153e+03, 1.031890483142048e+03, 1.032381395888255e+03, 1.032870879713769e+03, 1.033358943831002e+03, - 1.033845597361038e+03, 1.034330849334855e+03, 1.034814708694520e+03, 1.035297184294378e+03, 1.035778284902212e+03, - 1.036258019200388e+03, 1.036736395786972e+03, 1.037213423176846e+03, 1.037689109802785e+03, 1.038163464016532e+03, - 1.038636494089848e+03, 1.039108208215545e+03, 1.039578614508504e+03, 1.040047721006677e+03, 1.040515535672073e+03, - 1.040982066391722e+03, 1.041447320978633e+03, 1.041911307172727e+03, 1.042374032641770e+03, 1.042835504982267e+03, - 1.043295731720368e+03, 1.043754720312740e+03, 1.044212478147439e+03, 1.044669012544757e+03, 1.045124330758065e+03, - 1.045578439974636e+03, 1.046031347316459e+03, 1.046483059841040e+03, 1.046933584542191e+03, 1.047382928350801e+03, - 1.047831098135608e+03, 1.048278100703944e+03, 1.048723942802479e+03, 1.049168631117951e+03, 1.049612172277885e+03, - 1.050054572851295e+03, 1.050495839349392e+03, 1.050935978226259e+03, 1.051374995879535e+03, 1.051812898651077e+03, - 1.052249692827621e+03, 1.052685384641421e+03, 1.053119980270894e+03, 1.053553485841241e+03, 1.053985907425073e+03, - 1.054417251043011e+03, 1.054847522664294e+03, 1.055276728207368e+03, 1.055704873540470e+03, 1.056131964482198e+03, - 1.056558006802086e+03, 1.056983006221156e+03, 1.057406968412469e+03, 1.057829899001669e+03, 1.058251803567517e+03, - 1.058672687642418e+03, 1.059092556712942e+03, 1.059511416220333e+03, 1.059929271561019e+03, 1.060346128087103e+03, - 1.060761991106862e+03, 1.061176865885225e+03, 1.061590757644256e+03, 1.062003671563618e+03, 1.062415612781042e+03, - 1.062826586392785e+03, 1.063236597454080e+03, 1.063645650979582e+03, 1.064053751943806e+03, 1.064460905281564e+03, - 1.064867115888388e+03, 1.065272388620953e+03, 1.065676728297497e+03, 1.066080139698224e+03, 1.066482627565716e+03, - 1.066884196605328e+03, 1.067284851485583e+03, 1.067684596838560e+03, 1.068083437260282e+03, 1.068481377311088e+03, - 1.068878421516012e+03, 1.069274574365149e+03, 1.069669840314018e+03, 1.070064223783925e+03, 1.070457729162312e+03, - 1.070850360803110e+03, 1.071242123027086e+03, 1.071633020122177e+03, 1.072023056343833e+03, 1.072412235915348e+03, - 1.072800563028182e+03, 1.073188041842291e+03, 1.073574676486445e+03, 1.073960471058540e+03, 1.074345429625912e+03, - 1.074729556225645e+03, 1.075112854864871e+03, 1.075495329521074e+03, 1.075876984142383e+03, 1.076257822647861e+03, - 1.076637848927802e+03, 1.077017066844009e+03, 1.077395480230078e+03, 1.077773092891671e+03, 1.078149908606800e+03, - 1.078525931126088e+03, 1.078901164173043e+03, 1.079275611444319e+03, 1.079649276609980e+03, 1.080022163313753e+03, - 1.080394275173289e+03, 1.080765615780409e+03, 1.081136188701357e+03, 1.081505997477043e+03, 1.081875045623287e+03, - 1.082243336631055e+03, 1.082610873966701e+03, 1.082977661072200e+03, 1.083343701365375e+03, 1.083708998240129e+03, - 1.084073555066671e+03, 1.084437375191738e+03, 1.084800461938812e+03, 1.085162818608345e+03, 1.085524448477969e+03, - 1.085885354802708e+03, 1.086245540815193e+03, 1.086605009725864e+03, 1.086963764723181e+03, 1.087321808973820e+03, - 1.087679145622881e+03, 1.088035777794081e+03, 1.088391708589951e+03, 1.088746941092032e+03, 1.089101478361063e+03, - 1.089455323437174e+03, 1.089808479340068e+03, 1.090160949069212e+03, 1.090512735604015e+03, 1.090863841904011e+03, - 1.091214270909037e+03, 1.091564025539410e+03, 1.091913108696102e+03, 1.092261523260912e+03, 1.092609272096636e+03, - 1.092956358047240e+03, 1.093302783938019e+03, 1.093648552575773e+03, 1.093993666748961e+03, 1.094338129227864e+03, - 1.094681942764750e+03, 1.095025110094028e+03, 1.095367633932400e+03, 1.095709516979028e+03, 1.096050761915673e+03, - 1.096391371406852e+03, 1.096731348099989e+03, 1.097070694625559e+03, 1.097409413597241e+03, 1.097747507612053e+03, - 1.098084979250501e+03, 1.098421831076722e+03, 1.098758065638617e+03, 1.099093685467999e+03, 1.099428693080720e+03 - }, - { - 1.684589876096183e+00, 5.134623444801206e+00, 8.644701248528763e+00, 1.221742518536346e+01, 1.585557982781074e+01, - 1.956214992144462e+01, 2.334034003724983e+01, 2.719359671061860e+01, 3.112563345243778e+01, 3.514045909824269e+01, - 3.924241004780310e+01, 4.343618705924819e+01, 4.772689739846900e+01, 5.212010331456826e+01, 5.662187802476661e+01, - 6.123887066003188e+01, 6.597838196157477e+01, 7.084845295200104e+01, 7.585796936130193e+01, 8.101678531012098e+01, - 8.633587069644658e+01, 9.182748797676904e+01, 9.750540569034629e+01, 1.033851583047392e+02, 1.094843649918390e+02, - 1.158231241117939e+02, 1.224245059846260e+02, 1.293151747130096e+02, 1.365261815248629e+02, 1.440939891279538e+02, - 1.520618114757994e+02, 1.604813914457569e+02, 1.694153957811522e+02, 1.789406969298481e+02, 1.891529533922825e+02, - 2.001731303231682e+02, 2.121569787678100e+02, 2.253091094784071e+02, 2.399042806332380e+02, 2.563199069489737e+02, - 2.750848906514070e+02, 2.969464643434261e+02, 3.229328546014849e+02, 3.543135002347355e+02, 3.921984303662318e+02, - 4.357954965530827e+02, 4.794760769313771e+02, 5.177697286478743e+02, 5.489643463397512e+02, 5.739046476783535e+02, - 5.942107806959839e+02, 6.111861736320782e+02, 6.257137360062679e+02, 6.383864584105582e+02, 6.496144309200059e+02, - 6.596903126634091e+02, 6.688288403183509e+02, 6.771914504920924e+02, 6.849021304867700e+02, 6.920579131978129e+02, - 6.987360045555276e+02, 7.049987392826839e+02, 7.108971024544342e+02, 7.164732821146056e+02, 7.217625530157500e+02, - 7.267946892799907e+02, 7.315950391502690e+02, 7.361853533032552e+02, 7.405844307313296e+02, 7.448086277502506e+02, - 7.488722630600873e+02, 7.527879429923678e+02, 7.565668248545514e+02, 7.602188318175716e+02, 7.637528295455235e+02, - 7.671767723779275e+02, 7.704978250985494e+02, 7.737224649905829e+02, 7.768565678669058e+02, 7.799054809912981e+02, - 7.828740852113311e+02, 7.857668481617866e+02, 7.885878700366836e+02, 7.913409231442565e+02, 7.940294862347829e+02, - 7.966567744124723e+02, 7.992257652996431e+02, 8.017392220063643e+02, 8.041997133656263e+02, 8.066096318184653e+02, - 8.089712092716463e+02, 8.112865311997843e+02, 8.135575492219598e+02, 8.157860923482889e+02, 8.179738770630884e+02, - 8.201225163872826e+02, 8.222335280425472e+02, 8.243083418227402e+02, 8.263483062638770e+02, 8.283546946917834e+02, - 8.303287107162738e+02, 8.322714932318737e+02, 8.341841209776308e+02, 8.360676167020694e+02, 8.379229509737970e+02, - 8.397510456734774e+02, 8.415527771987121e+02, 8.433289794097793e+02, 8.450804463410321e+02, 8.468079347000117e+02, - 8.485121661739475e+02, 8.501938295611975e+02, 8.518535827433419e+02, 8.534920545120224e+02, 8.551098462631638e+02, - 8.567075335699684e+02, 8.582856676449268e+02, 8.598447767001035e+02, 8.613853672140527e+02, 8.629079251129451e+02, - 8.644129168727630e+02, 8.659007905487929e+02, 8.673719767380859e+02, 8.688268894800329e+02, 8.702659270997666e+02, - 8.716894729986619e+02, 8.730978963958710e+02, 8.744915530244571e+02, 8.758707857872104e+02, 8.772359254027382e+02, - 8.785872909790230e+02, 8.799251905292153e+02, 8.812499204903831e+02, 8.825617691737974e+02, 8.838610141888793e+02, - 8.851479237217959e+02, 8.864227573981522e+02, 8.876857664272856e+02, 8.889371939664886e+02, 8.901772754657344e+02, - 8.914062389941362e+02, 8.926243055492864e+02, 8.938316893505429e+02, 8.950285981340314e+02, 8.962152333484170e+02, - 8.973917905098475e+02, 8.985584593521199e+02, 8.997154241422596e+02, 9.008628637868802e+02, 9.020009521115427e+02, - 9.031298580368335e+02, 9.042497457642121e+02, 9.053607749531097e+02, 9.064631008897612e+02, 9.075568746482314e+02, - 9.086422432440575e+02, 9.097193497809211e+02, 9.107883335907148e+02, 9.118493303793343e+02, 9.129024723054712e+02, - 9.139478881785345e+02, 9.149857035238078e+02, 9.160160407077366e+02, 9.170390190450848e+02, 9.180547549015631e+02, - 9.190633617921410e+02, 9.200649504752701e+02, 9.210596290432129e+02, 9.220475030086723e+02, 9.230286753879057e+02, - 9.240032466293453e+02, 9.249713152792960e+02, 9.259329771938454e+02, 9.268883261699159e+02, 9.278374538763933e+02, - 9.287804499193890e+02, 9.297174019049930e+02, 9.306483954996364e+02, 9.315735144881706e+02, 9.324928408297652e+02, - 9.334064547117257e+02, 9.343144346013202e+02, 9.352168572957044e+02, 9.361137979700289e+02, 9.370053302238076e+02, - 9.378915261256235e+02, 9.387724562562358e+02, 9.396481897501715e+02, 9.405187943358525e+02, 9.413843363743207e+02, - 9.422448808966292e+02, 9.431004916399451e+02, 9.439512310824186e+02, 9.447971604768776e+02, 9.456383398833782e+02, - 9.464748282006801e+02, 9.473066831966643e+02, 9.481339615377598e+02, 9.489567188173994e+02, 9.497750095835534e+02, - 9.505888873653729e+02, 9.513984046989838e+02, 9.522036131524463e+02, 9.530045633499398e+02, 9.538013049951750e+02, - 9.545938868940796e+02, 9.553823569767833e+02, 9.561667623189153e+02, 9.569471491622583e+02, 9.577235629347687e+02, - 9.584960482699935e+02, 9.592646490259001e+02, 9.600294083031490e+02, 9.607903684628182e+02, 9.615475711436073e+02, - 9.623010572785382e+02, 9.630508671111684e+02, 9.637970402113316e+02, 9.645396154904287e+02, 9.652786312162823e+02, - 9.660141250275622e+02, 9.667461339478107e+02, 9.674746943990689e+02, 9.681998422151235e+02, 9.689216126543840e+02, - 9.696400404124089e+02, 9.703551596340848e+02, 9.710670034675431e+02, 9.717756058884139e+02, 9.724809990199130e+02, - 9.731832149195326e+02, 9.738822851502115e+02, 9.745782407906777e+02, 9.752711124455146e+02, 9.759609302549654e+02, - 9.766477239044779e+02, 9.773315226340073e+02, 9.780123552470733e+02, 9.786902501195906e+02, 9.793652352084652e+02, - 9.800373380599841e+02, 9.807065858179810e+02, 9.813730052318080e+02, 9.820366226640986e+02, 9.826974640983457e+02, - 9.833555551462856e+02, 9.840109210551049e+02, 9.846635867144691e+02, 9.853135766633815e+02, 9.859609150968735e+02, - 9.866056258725354e+02, 9.872477325168935e+02, 9.878872582316283e+02, 9.885242258996508e+02, 9.891586580910354e+02, - 9.897905770688074e+02, 9.904200047946043e+02, 9.910469629341965e+02, 9.916714728628884e+02, 9.922935556707881e+02, - 9.929132321679594e+02, 9.935305228894589e+02, 9.941454481002537e+02, 9.947580278000313e+02, 9.953682817279006e+02, - 9.959762293669889e+02, 9.965818899489327e+02, 9.971852824582737e+02, 9.977864256367553e+02, 9.983853379875262e+02, - 9.989820377792507e+02, 9.995765430501272e+02, 1.000168871611829e+03, 1.000759041053347e+03, 1.001347068744763e+03, - 1.001932971840932e+03, 1.002516767285092e+03, 1.003098471812395e+03, 1.003678101953367e+03, 1.004255674037291e+03, - 1.004831204195519e+03, 1.005404708364725e+03, 1.005976202290074e+03, 1.006545701528342e+03, 1.007113221450961e+03, - 1.007678777247006e+03, 1.008242383926125e+03, 1.008804056321399e+03, 1.009363809092156e+03, 1.009921656726721e+03, - 1.010477613545117e+03, 1.011031693701704e+03, 1.011583911187772e+03, 1.012134279834085e+03, 1.012682813313365e+03, - 1.013229525142738e+03, 1.013774428686129e+03, 1.014317537156603e+03, 1.014858863618676e+03, 1.015398420990564e+03, - 1.015936222046406e+03, 1.016472279418429e+03, 1.017006605599084e+03, 1.017539212943131e+03, 1.018070113669699e+03, - 1.018599319864290e+03, 1.019126843480757e+03, 1.019652696343243e+03, 1.020176890148081e+03, 1.020699436465666e+03, - 1.021220346742280e+03, 1.021739632301895e+03, 1.022257304347940e+03, 1.022773373965033e+03, 1.023287852120684e+03, - 1.023800749666965e+03, 1.024312077342156e+03, 1.024821845772351e+03, 1.025330065473049e+03, 1.025836746850699e+03, - 1.026341900204236e+03, 1.026845535726580e+03, 1.027347663506106e+03, 1.027848293528097e+03, 1.028347435676165e+03, - 1.028845099733650e+03, 1.029341295384991e+03, 1.029836032217081e+03, 1.030329319720592e+03, 1.030821167291279e+03, - 1.031311584231259e+03, 1.031800579750278e+03, 1.032288162966943e+03, 1.032774342909945e+03, 1.033259128519254e+03, - 1.033742528647294e+03, 1.034224552060104e+03, 1.034705207438477e+03, 1.035184503379074e+03, 1.035662448395531e+03, - 1.036139050919536e+03, 1.036614319301901e+03, 1.037088261813600e+03, 1.037560886646808e+03, 1.038032201915910e+03, - 1.038502215658500e+03, 1.038970935836358e+03, 1.039438370336422e+03, 1.039904526971732e+03, 1.040369413482369e+03, - 1.040833037536369e+03, 1.041295406730634e+03, 1.041756528591820e+03, 1.042216410577212e+03, 1.042675060075591e+03, - 1.043132484408079e+03, 1.043588690828979e+03, 1.044043686526595e+03, 1.044497478624044e+03, 1.044950074180053e+03, - 1.045401480189745e+03, 1.045851703585412e+03, 1.046300751237279e+03, 1.046748629954246e+03, 1.047195346484639e+03, - 1.047640907516926e+03, 1.048085319680438e+03, 1.048528589546077e+03, 1.048970723627006e+03, 1.049411728379334e+03, - 1.049851610202797e+03, 1.050290375441412e+03, 1.050728030384140e+03, 1.051164581265525e+03, 1.051600034266332e+03, - 1.052034395514174e+03, 1.052467671084123e+03, 1.052899866999326e+03, 1.053330989231598e+03, 1.053761043702010e+03, - 1.054190036281479e+03, 1.054617972791334e+03, 1.055044859003884e+03, 1.055470700642972e+03, 1.055895503384528e+03, - 1.056319272857105e+03, 1.056742014642421e+03, 1.057163734275872e+03, 1.057584437247062e+03, 1.058004129000308e+03, - 1.058422814935143e+03, 1.058840500406820e+03, 1.059257190726793e+03, 1.059672891163203e+03, 1.060087606941359e+03, - 1.060501343244201e+03, 1.060914105212768e+03, 1.061325897946650e+03, 1.061736726504447e+03, 1.062146595904203e+03, - 1.062555511123850e+03, 1.062963477101644e+03, 1.063370498736583e+03, 1.063776580888834e+03, 1.064181728380144e+03, - 1.064585945994256e+03, 1.064989238477305e+03, 1.065391610538221e+03, 1.065793066849122e+03, 1.066193612045702e+03, - 1.066593250727612e+03, 1.066991987458842e+03, 1.067389826768086e+03, 1.067786773149122e+03, 1.068182831061161e+03, - 1.068578004929219e+03, 1.068972299144459e+03, 1.069365718064548e+03, 1.069758266013999e+03, 1.070149947284508e+03, - 1.070540766135296e+03, 1.070930726793435e+03, 1.071319833454178e+03, 1.071708090281278e+03, 1.072095501407315e+03, - 1.072482070934001e+03, 1.072867802932496e+03, 1.073252701443716e+03, 1.073636770478632e+03, 1.074020014018571e+03, - 1.074402436015512e+03, 1.074784040392378e+03, 1.075164831043320e+03, 1.075544811834008e+03, 1.075923986601905e+03, - 1.076302359156550e+03, 1.076679933279828e+03, 1.077056712726244e+03, 1.077432701223185e+03, 1.077807902471190e+03, - 1.078182320144208e+03, 1.078555957889855e+03, 1.078928819329667e+03, 1.079300908059358e+03, 1.079672227649058e+03, - 1.080042781643566e+03, 1.080412573562592e+03, 1.080781606900991e+03, 1.081149885129005e+03, 1.081517411692495e+03, - 1.081884190013169e+03, 1.082250223488814e+03, 1.082615515493521e+03, 1.082980069377904e+03, 1.083343888469326e+03, - 1.083706976072111e+03, 1.084069335467761e+03, 1.084430969915172e+03, 1.084791882650836e+03, 1.085152076889057e+03, - 1.085511555822150e+03, 1.085870322620646e+03, 1.086228380433494e+03, 1.086585732388255e+03, 1.086942381591301e+03, - 1.087298331128007e+03, 1.087653584062943e+03, 1.088008143440064e+03, 1.088362012282893e+03, 1.088715193594710e+03, - 1.089067690358734e+03, 1.089419505538300e+03, 1.089770642077043e+03, 1.090121102899069e+03, 1.090470890909136e+03, - 1.090820008992818e+03, 1.091168460016686e+03, 1.091516246828466e+03, 1.091863372257215e+03, 1.092209839113481e+03, - 1.092555650189465e+03, 1.092900808259188e+03, 1.093245316078645e+03, 1.093589176385966e+03, 1.093932391901570e+03, - 1.094274965328322e+03, 1.094616899351681e+03, 1.094958196639858e+03, 1.095298859843957e+03, 1.095638891598131e+03, - 1.095978294519722e+03, 1.096317071209408e+03, 1.096655224251346e+03, 1.096992756213313e+03, 1.097329669646845e+03 - }, - { - 1.679084563985100e+00, 5.117367690331974e+00, 8.614811884941995e+00, 1.217394400614413e+01, 1.579746553847521e+01, - 1.948826901886792e+01, 2.324945644424241e+01, 2.708435996061811e+01, 3.099656517926189e+01, 3.498993753667488e+01, - 3.906865219020937e+01, 4.323722803824555e+01, 4.750056657188576e+01, 5.186399641122657e+01, 5.633332456097250e+01, - 6.091489564746058e+01, 6.561566068561775e+01, 7.044325728668551e+01, 7.540610368151138e+01, 8.051350952911534e+01, - 8.577580725260144e+01, 9.120450865313958e+01, 9.681249288249617e+01, 1.026142336236032e+02, 1.086260757050611e+02, - 1.148665746009020e+02, 1.213569166928603e+02, 1.281214443164529e+02, 1.351883182468730e+02, 1.425903625976265e+02, - 1.503661547106761e+02, 1.585614489806806e+02, 1.672310616039167e+02, 1.764414020199941e+02, 1.862739256129695e+02, - 1.968299201159714e+02, 2.082372522304059e+02, 2.206600300599506e+02, 2.343126189686662e+02, 2.494800481376020e+02, - 2.665471471210185e+02, 2.860368591769922e+02, 3.086476598022702e+02, 3.352470378890575e+02, 3.667184898728173e+02, - 4.034302019761506e+02, 4.436840495290930e+02, 4.828043863600190e+02, 5.173218306534949e+02, 5.461325244918834e+02, - 5.697845782353147e+02, 5.894194808125527e+02, 6.060486293135843e+02, 6.204080912844086e+02, 6.330147249855786e+02, - 6.442364316006459e+02, 6.543413955583908e+02, 6.635297318669200e+02, 6.719539523383113e+02, 6.797325100743038e+02, - 6.869589737404660e+02, 6.937083771356913e+02, 7.000417039430411e+02, 7.060091167141471e+02, 7.116523237379535e+02, - 7.170063427976754e+02, 7.221008353338827e+02, 7.269611293967031e+02, 7.316090136125198e+02, 7.360633602623528e+02, - 7.403406191834141e+02, 7.444552128853792e+02, 7.484198553242701e+02, 7.522458111100781e+02, 7.559431078274869e+02, - 7.595207111493315e+02, 7.629866702004593e+02, 7.663482389662516e+02, 7.696119782829827e+02, 7.727838419885646e+02, - 7.758692500755108e+02, 7.788731511173030e+02, 7.818000757943818e+02, 7.846541829966546e+02, 7.874392997035394e+02, - 7.901589556233262e+02, 7.928164133985636e+02, 7.954146950434806e+02, 7.979566051659459e+02, 8.004447514343113e+02, - 8.028815626744403e+02, 8.052693049207089e+02, 8.076100956942284e+02, 8.099059167397443e+02, 8.121586254180593e+02, - 8.143699649219637e+02, 8.165415734595497e+02, 8.186749925285476e+02, 8.207716743883062e+02, 8.228329888216040e+02, - 8.248602292663010e+02, 8.268546183864286e+02, 8.288173131434575e+02, 8.307494094208791e+02, 8.326519462487257e+02, - 8.345259096690377e+02, 8.363722362784098e+02, 8.381918164795829e+02, 8.399854974703695e+02, 8.417540859950255e+02, - 8.434983508804312e+02, 8.452190253769800e+02, 8.469168093219768e+02, 8.485923711414624e+02, 8.502463497047327e+02, - 8.518793560443705e+02, 8.534919749533215e+02, 8.550847664693979e+02, 8.566582672565996e+02, 8.582129918917102e+02, - 8.597494340638575e+02, 8.612680676939926e+02, 8.627693479805944e+02, 8.642537123773511e+02, 8.657215815080436e+02, - 8.671733600233930e+02, 8.686094374042211e+02, 8.700301887149011e+02, 8.714359753108031e+02, 8.728271455206218e+02, - 8.742040352930763e+02, 8.755669687490644e+02, 8.769162579628290e+02, 8.782522056614722e+02, 8.795751037129814e+02, - 8.808852338400092e+02, 8.821828686431986e+02, 8.834682717755907e+02, 8.847416983340750e+02, 8.860033952465466e+02, - 8.872536015537802e+02, 8.884925488460642e+02, 8.897204615066454e+02, 8.909375570280404e+02, 8.921440462949257e+02, - 8.933401338361774e+02, 8.945260181471640e+02, 8.957018918287741e+02, 8.968679418881885e+02, 8.980243499398767e+02, - 8.991712924140395e+02, 9.003089407550449e+02, 9.014374616104370e+02, 9.025570170110424e+02, 9.036677645426691e+02, - 9.047698575098748e+02, 9.058634450922251e+02, 9.069486724934593e+02, 9.080256810956407e+02, 9.090946085472709e+02, - 9.101555889672725e+02, 9.112087530187201e+02, 9.122542280408531e+02, 9.132921381629269e+02, 9.143226044131994e+02, - 9.153457448233032e+02, 9.163616745282349e+02, 9.173705058621753e+02, 9.183723484503630e+02, 9.193673092971877e+02, - 9.203554928707214e+02, 9.213370011838296e+02, 9.223119338720491e+02, 9.232803880768708e+02, 9.242424592653632e+02, - 9.251982402036659e+02, 9.261478217370591e+02, 9.270912926793359e+02, 9.280287398741875e+02, 9.289602482542538e+02, - 9.298859008979701e+02, 9.308057790842830e+02, 9.317199623453529e+02, 9.326285285173150e+02, 9.335315537891915e+02, - 9.344291127500371e+02, 9.353212784343904e+02, 9.362081223661039e+02, 9.370897146006262e+02, 9.379661237657922e+02, - 9.388374171012030e+02, 9.397036604962263e+02, 9.405649185267015e+02, 9.414212544903884e+02, 9.422727304412118e+02, - 9.431194072223562e+02, 9.439613444982500e+02, 9.447986007854927e+02, 9.456312334827561e+02, 9.464592988997088e+02, - 9.472828522850048e+02, 9.481019478533526e+02, 9.489166388117352e+02, 9.497269773847740e+02, 9.505330148393053e+02, - 9.513348015081729e+02, 9.521323868132803e+02, 9.529258192879273e+02, 9.537151465984556e+02, 9.545004155652317e+02, - 9.552816721829879e+02, 9.560589616405510e+02, 9.568323283399742e+02, 9.576018159150980e+02, 9.583674672495599e+02, - 9.591293244942696e+02, 9.598874290843773e+02, 9.606418217557369e+02, 9.613925425609050e+02, 9.621396308846637e+02, - 9.628831254591140e+02, 9.636230643783256e+02, 9.643594851125823e+02, 9.650924245222213e+02, 9.658219188710854e+02, - 9.665480038396048e+02, 9.672707145375109e+02, 9.679900850643627e+02, 9.687061503100548e+02, 9.694189433116408e+02, - 9.701284970164181e+02, 9.708348438595533e+02, 9.715380157748735e+02, 9.722380442053579e+02, 9.729349601133633e+02, - 9.736287939905765e+02, 9.743195758677061e+02, 9.750073353239212e+02, 9.756921014960520e+02, 9.763739030875469e+02, - 9.770527683772069e+02, 9.777287252276927e+02, 9.784018010938198e+02, 9.790720230306449e+02, 9.797394177013491e+02, - 9.804040113849231e+02, 9.810658299836688e+02, 9.817248990305063e+02, 9.823812436961105e+02, 9.830348887958706e+02, - 9.836858587966775e+02, 9.843341778235549e+02, 9.849798696661255e+02, 9.856229577849217e+02, 9.862634653175534e+02, - 9.869014150847245e+02, 9.875368295961058e+02, 9.881697310560779e+02, 9.888001413693349e+02, 9.894280821463594e+02, - 9.900535747087699e+02, 9.906766400945518e+02, 9.912972990631572e+02, 9.919155721005027e+02, 9.925314794238435e+02, - 9.931450409865411e+02, 9.937562764827295e+02, 9.943652053518646e+02, 9.949718467831901e+02, 9.955762197200879e+02, - 9.961783428643428e+02, 9.967782346803128e+02, 9.973759133990065e+02, 9.979713970220711e+02, 9.985647033256992e+02, - 9.991558498644453e+02, 9.997448539749670e+02, 1.000331732779681e+03, 1.000916503190347e+03, 1.001499181911571e+03, - 1.002079785444236e+03, 1.002658330088868e+03, 1.003234831948919e+03, 1.003809306933994e+03, 1.004381770763006e+03, - 1.004952238967264e+03, 1.005520726893504e+03, 1.006087249706854e+03, 1.006651822393737e+03, 1.007214459764724e+03, - 1.007775176457317e+03, 1.008333986938690e+03, 1.008890905508362e+03, 1.009445946300829e+03, 1.009999123288136e+03, - 1.010550450282399e+03, 1.011099940938282e+03, 1.011647608755426e+03, 1.012193467080821e+03, 1.012737529111141e+03, - 1.013279807895039e+03, 1.013820316335379e+03, 1.014359067191448e+03, 1.014896073081107e+03, 1.015431346482917e+03, - 1.015964899738208e+03, 1.016496745053129e+03, 1.017026894500637e+03, 1.017555360022470e+03, 1.018082153431070e+03, - 1.018607286411476e+03, 1.019130770523178e+03, 1.019652617201941e+03, 1.020172837761595e+03, 1.020691443395788e+03, - 1.021208445179715e+03, 1.021723854071806e+03, 1.022237680915397e+03, 1.022749936440350e+03, 1.023260631264671e+03, - 1.023769775896076e+03, 1.024277380733538e+03, 1.024783456068814e+03, 1.025288012087930e+03, 1.025791058872652e+03, - 1.026292606401927e+03, 1.026792664553298e+03, 1.027291243104294e+03, 1.027788351733803e+03, 1.028284000023409e+03, - 1.028778197458716e+03, 1.029270953430647e+03, 1.029762277236718e+03, 1.030252178082294e+03, 1.030740665081820e+03, - 1.031227747260036e+03, 1.031713433553166e+03, 1.032197732810095e+03, 1.032680653793514e+03, 1.033162205181059e+03, - 1.033642395566425e+03, 1.034121233460457e+03, 1.034598727292236e+03, 1.035074885410132e+03, 1.035549716082853e+03, - 1.036023227500467e+03, 1.036495427775412e+03, 1.036966324943491e+03, 1.037435926964846e+03, 1.037904241724923e+03, - 1.038371277035416e+03, 1.038837040635197e+03, 1.039301540191234e+03, 1.039764783299491e+03, 1.040226777485816e+03, - 1.040687530206816e+03, 1.041147048850713e+03, 1.041605340738193e+03, 1.042062413123237e+03, 1.042518273193944e+03, - 1.042972928073337e+03, 1.043426384820154e+03, 1.043878650429639e+03, 1.044329731834304e+03, 1.044779635904694e+03, - 1.045228369450130e+03, 1.045675939219449e+03, 1.046122351901727e+03, 1.046567614126990e+03, 1.047011732466922e+03, - 1.047454713435555e+03, 1.047896563489952e+03, 1.048337289030879e+03, 1.048776896403466e+03, 1.049215391897860e+03, - 1.049652781749869e+03, 1.050089072141592e+03, 1.050524269202047e+03, 1.050958379007783e+03, 1.051391407583485e+03, - 1.051823360902575e+03, 1.052254244887795e+03, 1.052684065411791e+03, 1.053112828297685e+03, 1.053540539319633e+03, - 1.053967204203384e+03, 1.054392828626830e+03, 1.054817418220539e+03, 1.055240978568292e+03, 1.055663515207606e+03, - 1.056085033630247e+03, 1.056505539282748e+03, 1.056925037566902e+03, 1.057343533840265e+03, 1.057761033416641e+03, - 1.058177541566565e+03, 1.058593063517773e+03, 1.059007604455682e+03, 1.059421169523839e+03, 1.059833763824386e+03, - 1.060245392418506e+03, 1.060656060326864e+03, 1.061065772530050e+03, 1.061474533969005e+03, 1.061882349545449e+03, - 1.062289224122301e+03, 1.062695162524093e+03, 1.063100169537376e+03, 1.063504249911126e+03, 1.063907408357142e+03, - 1.064309649550435e+03, 1.064710978129619e+03, 1.065111398697290e+03, 1.065510915820407e+03, 1.065909534030656e+03, - 1.066307257824827e+03, 1.066704091665172e+03, 1.067100039979759e+03, 1.067495107162831e+03, 1.067889297575151e+03, - 1.068282615544346e+03, 1.068675065365247e+03, 1.069066651300224e+03, 1.069457377579517e+03, 1.069847248401563e+03, - 1.070236267933314e+03, 1.070624440310562e+03, 1.071011769638246e+03, 1.071398259990770e+03, 1.071783915412304e+03, - 1.072168739917084e+03, 1.072552737489717e+03, 1.072935912085474e+03, 1.073318267630576e+03, 1.073699808022488e+03, - 1.074080537130199e+03, 1.074460458794505e+03, 1.074839576828284e+03, 1.075217895016769e+03, 1.075595417117819e+03, - 1.075972146862189e+03, 1.076348087953786e+03, 1.076723244069937e+03, 1.077097618861641e+03, 1.077471215953827e+03, - 1.077844038945599e+03, 1.078216091410492e+03, 1.078587376896708e+03, 1.078957898927366e+03, 1.079327661000736e+03, - 1.079696666590477e+03, 1.080064919145868e+03, 1.080432422092042e+03, 1.080799178830214e+03, 1.081165192737900e+03, - 1.081530467169147e+03, 1.081895005454749e+03, 1.082258810902464e+03, 1.082621886797230e+03, 1.082984236401377e+03, - 1.083345862954834e+03, 1.083706769675342e+03, 1.084066959758653e+03, 1.084426436378734e+03, 1.084785202687970e+03, - 1.085143261817358e+03, 1.085500616876705e+03, 1.085857270954819e+03, 1.086213227119702e+03, 1.086568488418740e+03, - 1.086923057878884e+03, 1.087276938506842e+03, 1.087630133289256e+03, 1.087982645192885e+03, 1.088334477164781e+03, - 1.088685632132470e+03, 1.089036113004120e+03, 1.089385922668721e+03, 1.089735063996246e+03, 1.090083539837828e+03, - 1.090431353025924e+03, 1.090778506374477e+03, 1.091125002679083e+03, 1.091470844717149e+03, 1.091816035248055e+03, - 1.092160577013310e+03, 1.092504472736710e+03, 1.092847725124487e+03, 1.093190336865470e+03, 1.093532310631226e+03, - 1.093873649076219e+03, 1.094214354837949e+03, 1.094554430537105e+03, 1.094893878777704e+03, 1.095232702147236e+03 - }, - { - 1.673615631652367e+00, 5.100232496994529e+00, 8.585143167596573e+00, 1.213080178788456e+01, 1.573982944905514e+01, - 1.941502960919761e+01, 2.315940533617886e+01, 2.697617864377811e+01, 3.086881223069592e+01, 3.484103399522613e+01, - 3.889686476338296e+01, 4.304064975271849e+01, 4.727709439597760e+01, 5.161130527425928e+01, 5.604883706457151e+01, - 6.059574659971076e+01, 6.525865537987170e+01, 7.004482217971119e+01, 7.496222777918376e+01, 8.001967433911553e+01, - 8.522690257331237e+01, 9.059473068761783e+01, 9.613522012398771e+01, 1.018618745531270e+02, 1.077898804254272e+02, - 1.139363998909067e+02, 1.203209302832266e+02, 1.269657489895802e+02, 1.338964689212766e+02, 1.411427387512712e+02, - 1.487391345934120e+02, 1.567263081667201e+02, 1.651524821308342e+02, 1.740754219211079e+02, 1.835650695507206e+02, - 1.937071085469176e+02, 2.046078527222149e+02, 2.164010298114432e+02, 2.292572708091434e+02, 2.433973730215468e+02, - 2.591104351218403e+02, 2.767768533729572e+02, 2.968911416023128e+02, 3.200644958600786e+02, 3.469581056702304e+02, - 3.780662069098050e+02, 4.131544259375623e+02, 4.501589759889115e+02, 4.854809564717429e+02, 5.168775367264767e+02, - 5.436105120138599e+02, 5.660463392733305e+02, 5.849977351631270e+02, 6.012457833108062e+02, 6.153984641577770e+02, - 6.279025816130405e+02, 6.390858496421730e+02, 6.491923246025837e+02, 6.584071681852563e+02, 6.668734116291002e+02, - 6.747033924144378e+02, 6.819866843082134e+02, 6.887956918662392e+02, 6.951896651569709e+02, 7.012176290490410e+02, - 7.069205548384122e+02, 7.123329945002185e+02, 7.174843277196649e+02, 7.223997255952428e+02, 7.271009040160731e+02, - 7.316067188031077e+02, 7.359336403376559e+02, 7.400961353810745e+02, 7.441069766956197e+02, 7.479774959814326e+02, - 7.517177919353654e+02, 7.553369025030277e+02, 7.588429483566073e+02, 7.622432530949842e+02, 7.655444444942792e+02, - 7.687525402407281e+02, 7.718730208846887e+02, 7.749108922147910e+02, 7.778707388279871e+02, 7.807567703372573e+02, - 7.835728613936560e+02, 7.863225864878170e+02, 7.890092503262979e+02, 7.916359144412576e+02, 7.942054205810565e+02, - 7.967204113391160e+02, 7.991833484045217e+02, 8.015965287572770e+02, 8.039620990811133e+02, 8.062820686253878e+02, - 8.085583207132092e+02, 8.107926230642346e+02, 8.129866370765432e+02, 8.151419261918138e+02, 8.172599634509778e+02, - 8.193421383331279e+02, 8.213897629582203e+02, 8.234040777236710e+02, 8.253862564360669e+02, 8.273374109915660e+02, - 8.292585956520061e+02, 8.311508109580949e+02, 8.330150073161584e+02, 8.348520882906993e+02, 8.366629136313459e+02, - 8.384483020595458e+02, 8.402090338375829e+02, 8.419458531400453e+02, 8.436594702457065e+02, 8.453505635659200e+02, - 8.470197815239436e+02, 8.486677442981497e+02, 8.502950454407821e+02, 8.519022533827566e+02, 8.534899128339918e+02, - 8.550585460878441e+02, 8.566086542373978e+02, 8.581407183106562e+02, 8.596552003310263e+02, 8.611525443088863e+02, - 8.626331771695482e+02, 8.640975096224271e+02, 8.655459369758006e+02, 8.669788399012181e+02, 8.683965851579242e+02, - 8.697995263006654e+02, 8.711880042872436e+02, 8.725623480598837e+02, 8.739228737326574e+02, 8.752698897821840e+02, - 8.766036914695439e+02, 8.779245649456832e+02, 8.792327868060138e+02, 8.805286246092503e+02, 8.818123372079549e+02, - 8.830841751415347e+02, 8.843443809920942e+02, 8.855931897214570e+02, 8.868308289905473e+02, 8.880575194466729e+02, - 8.892734750743184e+02, 8.904789033703723e+02, 8.916740056696143e+02, 8.928589773737293e+02, 8.940340081852256e+02, - 8.951992823299231e+02, 8.963549787686694e+02, 8.975012713989053e+02, 8.986383292466519e+02, 8.997663166494663e+02, - 9.008853934308564e+02, 9.019957150666422e+02, 9.030974328436967e+02, 9.041906940228366e+02, 9.052756419369372e+02, - 9.063524162009863e+02, 9.074211527950249e+02, 9.084819842031837e+02, 9.095350395345524e+02, 9.105804446388482e+02, - 9.116183222171460e+02, 9.126487919279143e+02, 9.136719704886019e+02, 9.146879717729946e+02, 9.156969069045473e+02, - 9.166988843458975e+02, 9.176940099847405e+02, 9.186823872162388e+02, 9.196641170221438e+02, 9.206392980467753e+02, - 9.216080266700110e+02, 9.225703968384395e+02, 9.235265010674913e+02, 9.244764291347796e+02, 9.254202690372359e+02, - 9.263581068321042e+02, 9.272900266946918e+02, 9.282161109739566e+02, 9.291364402460490e+02, 9.300510933658766e+02, - 9.309601475167966e+02, 9.318636782585093e+02, 9.327617595732276e+02, 9.336544639102054e+02, 9.345418622286834e+02, - 9.354240240393324e+02, 9.363010174442438e+02, 9.371729091755415e+02, 9.380397646326570e+02, 9.389016479183390e+02, - 9.397586218734367e+02, 9.406107481105117e+02, 9.414580870463275e+02, 9.423006979332575e+02, 9.431386388896545e+02, - 9.439719669292310e+02, 9.448007379894754e+02, 9.456250069591533e+02, 9.464448277049265e+02, 9.472602530971161e+02, - 9.480713350346565e+02, 9.488781244692590e+02, 9.496806714288192e+02, 9.504790250400986e+02, 9.512732335507013e+02, - 9.520633443503843e+02, 9.528494039917063e+02, 9.536314582100631e+02, 9.544095519431072e+02, 9.551837293495976e+02, - 9.559540338276796e+02, 9.567205080326316e+02, 9.574831938940843e+02, 9.582421326327395e+02, 9.589973647766088e+02, - 9.597489301767738e+02, 9.604968680227013e+02, 9.612412168571220e+02, 9.619820145904822e+02, 9.627192985149982e+02, - 9.634531053183042e+02, 9.641834710967307e+02, 9.649104309226109e+02, 9.656340206204286e+02, 9.663542741613314e+02, - 9.670712254020125e+02, 9.677849076689600e+02, 9.684953537697046e+02, 9.692025960037630e+02, 9.699066661732902e+02, - 9.706075955934529e+02, 9.713054151025248e+02, 9.720001550717252e+02, 9.726918454147949e+02, 9.733805155973273e+02, - 9.740661946458622e+02, 9.747489111567396e+02, 9.754286933047375e+02, 9.761055688514820e+02, 9.767795651536537e+02, - 9.774507091709819e+02, 9.781190274740439e+02, 9.787845462518701e+02, 9.794472913193581e+02, 9.801072881245144e+02, - 9.807645617555058e+02, 9.814191369475516e+02, 9.820710380896451e+02, 9.827202892311087e+02, 9.833669140880008e+02, - 9.840109360493661e+02, 9.846523781833370e+02, 9.852912632430938e+02, 9.859276136726818e+02, 9.865614516126986e+02, - 9.871927989058436e+02, 9.878216771023401e+02, 9.884481074652404e+02, 9.890721109755966e+02, 9.896937083375262e+02, - 9.903129199831549e+02, 9.909297660774517e+02, 9.915442665229559e+02, 9.921564409643939e+02, 9.927663087932015e+02, - 9.933738891519391e+02, 9.939792009386118e+02, 9.945822628108972e+02, 9.951830931902778e+02, 9.957817102660856e+02, - 9.963781319994604e+02, 9.969723761272185e+02, 9.975644601656429e+02, 9.981544014141946e+02, 9.987422169591355e+02, - 9.993279236770863e+02, 9.999115382385040e+02, 1.000493077111084e+03, 1.001072556563100e+03, 1.001649992666663e+03, - 1.002225401300922e+03, 1.002798798155201e+03, 1.003370198732055e+03, 1.003939618350286e+03, 1.004507072147883e+03, - 1.005072575084908e+03, 1.005636141946320e+03, 1.006197787344750e+03, 1.006757525723212e+03, 1.007315371357762e+03, - 1.007871338360115e+03, 1.008425440680192e+03, 1.008977692108633e+03, 1.009528106279249e+03, 1.010076696671441e+03, - 1.010623476612552e+03, 1.011168459280195e+03, 1.011711657704517e+03, 1.012253084770436e+03, 1.012792753219823e+03, - 1.013330675653649e+03, 1.013866864534091e+03, 1.014401332186598e+03, 1.014934090801911e+03, 1.015465152438062e+03, - 1.015994529022317e+03, 1.016522232353094e+03, 1.017048274101847e+03, 1.017572665814904e+03, 1.018095418915286e+03, - 1.018616544704480e+03, 1.019136054364189e+03, 1.019653958958044e+03, 1.020170269433291e+03, 1.020684996622439e+03, - 1.021198151244890e+03, 1.021709743908528e+03, 1.022219785111291e+03, 1.022728285242706e+03, 1.023235254585400e+03, - 1.023740703316590e+03, 1.024244641509535e+03, 1.024747079134977e+03, 1.025248026062542e+03, 1.025747492062131e+03, - 1.026245486805278e+03, 1.026742019866482e+03, 1.027237100724532e+03, 1.027730738763787e+03, 1.028222943275453e+03, - 1.028713723458831e+03, 1.029203088422538e+03, 1.029691047185722e+03, 1.030177608679241e+03, 1.030662781746834e+03, - 1.031146575146264e+03, 1.031628997550452e+03, 1.032110057548579e+03, 1.032589763647182e+03, 1.033068124271227e+03, - 1.033545147765161e+03, 1.034020842393955e+03, 1.034495216344121e+03, 1.034968277724723e+03, 1.035440034568355e+03, - 1.035910494832128e+03, 1.036379666398617e+03, 1.036847557076804e+03, 1.037314174603010e+03, 1.037779526641802e+03, - 1.038243620786894e+03, 1.038706464562030e+03, 1.039168065421852e+03, 1.039628430752759e+03, 1.040087567873747e+03, - 1.040545484037242e+03, 1.041002186429911e+03, 1.041457682173476e+03, 1.041911978325495e+03, 1.042365081880147e+03, - 1.042816999769004e+03, 1.043267738861776e+03, 1.043717305967065e+03, 1.044165707833096e+03, 1.044612951148436e+03, - 1.045059042542709e+03, 1.045503988587294e+03, 1.045947795796016e+03, 1.046390470625830e+03, 1.046832019477481e+03, - 1.047272448696172e+03, 1.047711764572213e+03, 1.048149973341657e+03, 1.048587081186938e+03, 1.049023094237483e+03, - 1.049458018570336e+03, 1.049891860210754e+03, 1.050324625132803e+03, 1.050756319259949e+03, 1.051186948465630e+03, - 1.051616518573828e+03, 1.052045035359635e+03, 1.052472504549797e+03, 1.052898931823268e+03, 1.053324322811745e+03, - 1.053748683100195e+03, 1.054172018227384e+03, 1.054594333686387e+03, 1.055015634925098e+03, 1.055435927346733e+03, - 1.055855216310321e+03, 1.056273507131190e+03, 1.056690805081454e+03, 1.057107115390479e+03, 1.057522443245355e+03, - 1.057936793791355e+03, 1.058350172132389e+03, 1.058762583331454e+03, 1.059174032411075e+03, 1.059584524353741e+03, - 1.059994064102334e+03, 1.060402656560558e+03, 1.060810306593351e+03, 1.061217019027303e+03, 1.061622798651063e+03, - 1.062027650215736e+03, 1.062431578435289e+03, 1.062834587986932e+03, 1.063236683511512e+03, 1.063637869613891e+03, - 1.064038150863321e+03, 1.064437531793817e+03, 1.064836016904523e+03, 1.065233610660074e+03, 1.065630317490951e+03, - 1.066026141793833e+03, 1.066421087931947e+03, 1.066815160235409e+03, 1.067208363001563e+03, 1.067600700495317e+03, - 1.067992176949468e+03, 1.068382796565036e+03, 1.068772563511576e+03, 1.069161481927504e+03, 1.069549555920403e+03, - 1.069936789567341e+03, 1.070323186915167e+03, 1.070708751980820e+03, 1.071093488751624e+03, 1.071477401185583e+03, - 1.071860493211671e+03, 1.072242768730119e+03, 1.072624231612698e+03, 1.073004885703000e+03, 1.073384734816713e+03, - 1.073763782741894e+03, 1.074142033239242e+03, 1.074519490042358e+03, 1.074896156858013e+03, 1.075272037366407e+03, - 1.075647135221424e+03, 1.076021454050886e+03, 1.076394997456805e+03, 1.076767769015629e+03, 1.077139772278486e+03, - 1.077511010771428e+03, 1.077881487995665e+03, 1.078251207427808e+03, 1.078620172520095e+03, 1.078988386700622e+03, - 1.079355853373574e+03, 1.079722575919450e+03, 1.080088557695280e+03, 1.080453802034848e+03, 1.080818312248908e+03, - 1.081182091625401e+03, 1.081545143429662e+03, 1.081907470904633e+03, 1.082269077271067e+03, 1.082629965727737e+03, - 1.082990139451633e+03, 1.083349601598165e+03, 1.083708355301360e+03, 1.084066403674056e+03, 1.084423749808097e+03, - 1.084780396774521e+03, 1.085136347623752e+03, 1.085491605385783e+03, 1.085846173070363e+03, 1.086200053667176e+03, - 1.086553250146028e+03, 1.086905765457016e+03, 1.087257602530708e+03, 1.087608764278322e+03, 1.087959253591891e+03, - 1.088309073344436e+03, 1.088658226390136e+03, 1.089006715564491e+03, 1.089354543684490e+03, 1.089701713548772e+03, - 1.090048227937788e+03, 1.090394089613958e+03, 1.090739301321832e+03, 1.091083865788241e+03, 1.091427785722459e+03, - 1.091771063816344e+03, 1.092113702744501e+03, 1.092455705164420e+03, 1.092797073716631e+03, 1.093137811024847e+03 - }, - { - 1.668182712325880e+00, 5.083216533766599e+00, 8.555692447125841e+00, 1.208799412799323e+01, 1.568266486994490e+01, - 1.934242206070560e+01, 2.307017333497581e+01, 2.686903464767809e+01, 3.074235054497155e+01, 3.469371696641610e+01, - 3.872700696793549e+01, 4.284639982860940e+01, 4.705641409230098e+01, 5.136194520291266e+01, 5.576830852463120e+01, - 6.028128870240695e+01, 6.490719652166233e+01, 6.965293468095099e+01, 7.452607421216132e+01, 7.953494368779620e+01, - 8.468873387343675e+01, 8.999762114609547e+01, 9.547291385795513e+01, 1.011272269424982e+02, 1.069746915274289e+02, - 1.130312082610935e+02, 1.193147556521225e+02, 1.258457682145443e+02, 1.326476039578195e+02, 1.397471272901478e+02, - 1.471754423256751e+02, 1.549688244573096e+02, 1.631699154274261e+02, 1.718292727310304e+02, 1.810073999567000e+02, - 1.907774359581414e+02, 2.012287527402889e+02, 2.124718094085293e+02, 2.246447288492400e+02, 2.379221683549627e+02, - 2.525270003753703e+02, 2.687446419316576e+02, 2.869372931284125e+02, 3.075481066308228e+02, 3.310706996580825e+02, - 3.579435652080397e+02, 3.883121462093201e+02, 4.215238284953771e+02, 4.555279307247923e+02, 4.876651563594154e+02, - 5.164426910670059e+02, 5.413535376764013e+02, 5.626500576215921e+02, 5.809183040439510e+02, 5.967606990560154e+02, - 6.106756461454477e+02, 6.230463357191056e+02, 6.341626972276912e+02, 6.442454550442459e+02, 6.534648889994785e+02, - 6.619543058227705e+02, 6.698195699540971e+02, 6.771458848208119e+02, 6.840026739914225e+02, 6.904471416320400e+02, - 6.965269057254214e+02, 7.022819726067435e+02, 7.077462375747225e+02, 7.129486399215863e+02, 7.179140625443347e+02, - 7.226640402730902e+02, 7.272173231449782e+02, 7.315903283922414e+02, 7.357975061348660e+02, 7.398516375011080e+02, - 7.437640793657954e+02, 7.475449665741361e+02, 7.512033800545935e+02, 7.547474873757853e+02, 7.581846609012180e+02, - 7.615215776234169e+02, 7.647643039316523e+02, 7.679183679237967e+02, 7.709888213686797e+02, 7.739802930277550e+02, - 7.768970347294933e+02, 7.797429613382978e+02, 7.825216855579220e+02, 7.852365483467332e+02, 7.878906455903597e+02, - 7.904868515701587e+02, 7.930278396783063e+02, 7.955161007584619e+02, 7.979539593917996e+02, 8.003435883991639e+02, - 8.026870217895328e+02, 8.049861663510345e+02, 8.072428120524808e+02, 8.094586413995829e+02, 8.116352378700024e+02, - 8.137740935344991e+02, 8.158766159570574e+02, 8.179441344547420e+02, 8.199779057875996e+02, 8.219791193400365e+02, - 8.239489018475141e+02, 8.258883217157726e+02, 8.277983929742144e+02, 8.296800789001110e+02, 8.315342953461037e+02, - 8.333619137997511e+02, 8.351637642006582e+02, 8.369406375379378e+02, 8.386932882482582e+02, 8.404224364326030e+02, - 8.421287699079530e+02, 8.438129461084283e+02, 8.454755938489557e+02, 8.471173149632248e+02, 8.487386858265032e+02, - 8.503402587729122e+02, 8.519225634157708e+02, 8.534861078788783e+02, 8.550313799458054e+02, 8.565588481336624e+02, - 8.580689626972016e+02, 8.595621565685893e+02, 8.610388462377263e+02, 8.624994325775473e+02, 8.639443016201526e+02, - 8.653738253133904e+02, 8.667883621986056e+02, 8.681882580266343e+02, 8.695738452316884e+02, 8.709454472923242e+02, - 8.723033743554900e+02, 8.736479266627032e+02, 8.749793943604534e+02, 8.762980579512406e+02, 8.776041887197485e+02, - 8.788980491357863e+02, 8.801798932354758e+02, 8.814499669660343e+02, 8.827085085932194e+02, 8.839557489244029e+02, - 8.851919116845341e+02, 8.864172137898596e+02, 8.876318656244979e+02, 8.888360713031209e+02, 8.900300289205550e+02, - 8.912139307890737e+02, 8.923879636641094e+02, 8.935523089590399e+02, 8.947071429496949e+02, 8.958526369691415e+02, - 8.969889575933131e+02, 8.981162668179900e+02, 8.992347222398400e+02, 9.003444771672727e+02, 9.014456808515951e+02, - 9.025384785808067e+02, 9.036230118335800e+02, 9.046994184133729e+02, 9.057678325766703e+02, 9.068283851556562e+02, - 9.078812036756035e+02, 9.089264124672532e+02, 9.099641327744389e+02, 9.109944828571865e+02, 9.120175780905352e+02, - 9.130335310592596e+02, 9.140424516487291e+02, 9.150444471320684e+02, 9.160396222538076e+02, 9.170280793101871e+02, - 9.180099182262807e+02, 9.189852366300804e+02, 9.199541299236945e+02, 9.209166913517822e+02, 9.218730117731233e+02, - 9.228231808763356e+02, 9.237672855475414e+02, 9.247054110351000e+02, 9.256376407349743e+02, 9.265640562450633e+02, - 9.274847374175532e+02, 9.283997624093519e+02, 9.293092077306970e+02, 9.302131482920266e+02, 9.311116574491691e+02, - 9.320048070469352e+02, 9.328926674611828e+02, 9.337753076394066e+02, 9.346527951399227e+02, 9.355251961697090e+02, - 9.363925756209485e+02, 9.372549971063306e+02, 9.381125229931682e+02, 9.389652144363687e+02, 9.398131314103097e+02, - 9.406563327396632e+02, 9.414948761292097e+02, 9.423288181926763e+02, 9.431582144806479e+02, 9.439831195075773e+02, - 9.448035867779338e+02, 9.456196688115244e+02, 9.464314171680126e+02, 9.472388824706708e+02, 9.480421144293994e+02, - 9.488411618630254e+02, 9.496360727209208e+02, 9.504268941039642e+02, 9.512136722848599e+02, 9.519964527278480e+02, - 9.527752801078274e+02, 9.535501983289025e+02, 9.543212505423870e+02, 9.550884791642775e+02, 9.558519258922140e+02, - 9.566116317219497e+02, 9.573676369633447e+02, 9.581199812559023e+02, 9.588687035838581e+02, 9.596138422908484e+02, - 9.603554350941554e+02, 9.610935190985632e+02, 9.618281308098192e+02, 9.625593056898016e+02, 9.632870799817310e+02, - 9.640114880321544e+02, 9.647325640780517e+02, 9.654503418193457e+02, 9.661648544302977e+02, 9.668761345706173e+02, - 9.675842143962568e+02, 9.682891255699351e+02, 9.689908992713786e+02, 9.696895662072899e+02, 9.703851566210674e+02, - 9.710777003022617e+02, 9.717672265957996e+02, 9.724537644109599e+02, 9.731373422301353e+02, 9.738179881173561e+02, - 9.744957297266113e+02, 9.751705943099560e+02, 9.758426087254170e+02, 9.765117994447050e+02, 9.771781925607316e+02, - 9.778418137949450e+02, 9.785026885044873e+02, 9.791608416891761e+02, 9.798162979983175e+02, 9.804690817373554e+02, - 9.811192168743635e+02, 9.817667270463796e+02, 9.824116355655933e+02, 9.830539654253823e+02, 9.836937393062154e+02, - 9.843309795814112e+02, 9.849657083227652e+02, 9.855979473060464e+02, 9.862277180163691e+02, 9.868550416534379e+02, - 9.874799391366799e+02, 9.881024311102548e+02, 9.887225379479519e+02, 9.893402797579812e+02, 9.899556763876565e+02, - 9.905687474279696e+02, 9.911795122180707e+02, 9.917879898496445e+02, 9.923941991711908e+02, 9.929981587922149e+02, - 9.935998870873266e+02, 9.941994022002451e+02, 9.947967220477238e+02, 9.953918643233901e+02, 9.959848465014985e+02, - 9.965756858406124e+02, 9.971643993871987e+02, 9.977510039791533e+02, 9.983355162492506e+02, 9.989179526285219e+02, - 9.994983293495612e+02, 1.000076662449766e+03, 1.000652967774507e+03, 1.001227260980241e+03, 1.001799557537546e+03, - 1.002369872734115e+03, 1.002938221677668e+03, 1.003504619298817e+03, 1.004069080353876e+03, 1.004631619427607e+03, - 1.005192250935914e+03, 1.005750989128486e+03, 1.006307848091387e+03, 1.006862841749593e+03, 1.007415983869480e+03, - 1.007967288061268e+03, 1.008516767781408e+03, 1.009064436334935e+03, 1.009610306877767e+03, 1.010154392418960e+03, - 1.010696705822927e+03, 1.011237259811606e+03, 1.011776066966595e+03, 1.012313139731239e+03, 1.012848490412685e+03, - 1.013382131183896e+03, 1.013914074085620e+03, 1.014444331028337e+03, 1.014972913794161e+03, 1.015499834038703e+03, - 1.016025103292910e+03, 1.016548732964863e+03, 1.017070734341547e+03, 1.017591118590586e+03, 1.018109896761941e+03, - 1.018627079789595e+03, 1.019142678493187e+03, 1.019656703579632e+03, 1.020169165644700e+03, 1.020680075174583e+03, - 1.021189442547417e+03, 1.021697278034786e+03, 1.022203591803202e+03, 1.022708393915553e+03, 1.023211694332531e+03, - 1.023713502914030e+03, 1.024213829420523e+03, 1.024712683514419e+03, 1.025210074761387e+03, 1.025706012631668e+03, - 1.026200506501357e+03, 1.026693565653667e+03, 1.027185199280168e+03, 1.027675416482014e+03, 1.028164226271137e+03, - 1.028651637571431e+03, 1.029137659219910e+03, 1.029622299967850e+03, 1.030105568481914e+03, 1.030587473345251e+03, - 1.031068023058587e+03, 1.031547226041287e+03, 1.032025090632412e+03, 1.032501625091747e+03, 1.032976837600822e+03, - 1.033450736263908e+03, 1.033923329109004e+03, 1.034394624088804e+03, 1.034864629081653e+03, 1.035333351892477e+03, - 1.035800800253718e+03, 1.036266981826228e+03, 1.036731904200175e+03, 1.037195574895916e+03, 1.037658001364863e+03, - 1.038119190990340e+03, 1.038579151088417e+03, 1.039037888908741e+03, 1.039495411635344e+03, 1.039951726387450e+03, - 1.040406840220256e+03, 1.040860760125719e+03, 1.041313493033306e+03, 1.041765045810765e+03, 1.042215425264847e+03, - 1.042664638142054e+03, 1.043112691129346e+03, 1.043559590854856e+03, 1.044005343888584e+03, 1.044449956743088e+03, - 1.044893435874159e+03, 1.045335787681486e+03, 1.045777018509322e+03, 1.046217134647118e+03, 1.046656142330175e+03, - 1.047094047740262e+03, 1.047530857006242e+03, 1.047966576204680e+03, 1.048401211360444e+03, 1.048834768447299e+03, - 1.049267253388493e+03, 1.049698672057330e+03, 1.050129030277738e+03, 1.050558333824830e+03, 1.050986588425456e+03, - 1.051413799758744e+03, 1.051839973456639e+03, 1.052265115104430e+03, 1.052689230241271e+03, 1.053112324360695e+03, - 1.053534402911119e+03, 1.053955471296347e+03, 1.054375534876059e+03, 1.054794598966296e+03, 1.055212668839945e+03, - 1.055629749727203e+03, 1.056045846816047e+03, 1.056460965252694e+03, 1.056875110142053e+03, 1.057288286548173e+03, - 1.057700499494679e+03, 1.058111753965216e+03, 1.058522054903866e+03, 1.058931407215583e+03, 1.059339815766603e+03, - 1.059747285384857e+03, 1.060153820860379e+03, 1.060559426945707e+03, 1.060964108356276e+03, 1.061367869770811e+03, - 1.061770715831710e+03, 1.062172651145426e+03, 1.062573680282842e+03, 1.062973807779640e+03, 1.063373038136663e+03, - 1.063771375820286e+03, 1.064168825262758e+03, 1.064565390862565e+03, 1.064961076984770e+03, 1.065355887961357e+03, - 1.065749828091568e+03, 1.066142901642239e+03, 1.066535112848127e+03, 1.066926465912233e+03, 1.067316965006128e+03, - 1.067706614270265e+03, 1.068095417814295e+03, 1.068483379717373e+03, 1.068870504028464e+03, 1.069256794766645e+03, - 1.069642255921402e+03, 1.070026891452923e+03, 1.070410705292386e+03, 1.070793701342248e+03, 1.071175883476528e+03, - 1.071557255541084e+03, 1.071937821353890e+03, 1.072317584705308e+03, 1.072696549358358e+03, 1.073074719048982e+03, - 1.073452097486309e+03, 1.073828688352910e+03, 1.074204495305060e+03, 1.074579521972985e+03, 1.074953771961116e+03, - 1.075327248848335e+03, 1.075699956188219e+03, 1.076071897509279e+03, 1.076443076315201e+03, 1.076813496085082e+03, - 1.077183160273655e+03, 1.077552072311532e+03, 1.077920235605417e+03, 1.078287653538340e+03, 1.078654329469874e+03, - 1.079020266736357e+03, 1.079385468651104e+03, 1.079749938504627e+03, 1.080113679564842e+03, 1.080476695077278e+03, - 1.080838988265288e+03, 1.081200562330246e+03, 1.081561420451756e+03, 1.081921565787846e+03, 1.082281001475169e+03, - 1.082639730629197e+03, 1.082997756344410e+03, 1.083355081694491e+03, 1.083711709732514e+03, 1.084067643491126e+03, - 1.084422885982737e+03, 1.084777440199697e+03, 1.085131309114477e+03, 1.085484495679849e+03, 1.085837002829061e+03, - 1.086188833476008e+03, 1.086539990515408e+03, 1.086890476822968e+03, 1.087240295255559e+03, 1.087589448651372e+03, - 1.087937939830091e+03, 1.088285771593053e+03, 1.088632946723407e+03, 1.088979467986275e+03, 1.089325338128909e+03, - 1.089670559880845e+03, 1.090015135954058e+03, 1.090359069043117e+03, 1.090702361825329e+03, 1.091045016960894e+03 - }, - { - 1.662785444283274e+00, 5.066318490465886e+00, 8.526457120341686e+00, 1.204551670811607e+01, 1.562596525069569e+01, - 1.927043695800166e+01, 2.298174738537926e+01, 2.676291032773751e+01, 3.061715672373820e+01, 3.454795586812902e+01, - 3.855903927893006e+01, 4.265442762994337e+01, 4.683846123494560e+01, 5.111583466246233e+01, 5.549163617317745e+01, - 5.997139281112727e+01, 6.456112215166463e+01, 6.926739192263408e+01, 7.409738898175982e+01, 7.905899946871237e+01, - 8.416090237268692e+01, 8.941267929683735e+01, 9.482494388924303e+01, 1.004094953004241e+02, 1.061795011819311e+02, - 1.121497172507210e+02, 1.183367524335940e+02, 1.247593912470329e+02, 1.314389886005692e+02, 1.383999569732515e+02, - 1.456703724017827e+02, 1.532827344039421e+02, 1.612749275133984e+02, 1.696914482261421e+02, 1.785849848097789e+02, - 1.880184686481310e+02, 1.980677580197992e+02, 2.088251684080960e+02, 2.204041216064836e+02, 2.329452218933596e+02, - 2.466239943734372e+02, 2.616600925535158e+02, 2.783263785088730e+02, 2.969526035624883e+02, 3.179109061955500e+02, - 3.415608448598726e+02, 3.681280253077286e+02, 3.974761217113130e+02, 4.287200525195435e+02, 4.600275675453333e+02, - 4.894700664198596e+02, 5.160205745384360e+02, 5.393239487757140e+02, 5.595589253948581e+02, 5.771541639214389e+02, - 5.925751210689214e+02, 6.062282050467753e+02, 6.184397025118914e+02, 6.294644208487762e+02, 6.395008189642899e+02, - 6.487046368706452e+02, 6.571994489651838e+02, 6.650844767033462e+02, 6.724403188476194e+02, 6.793331692128666e+02, - 6.858179473261063e+02, 6.919406466351687e+02, 6.977401159798742e+02, 7.032494269235847e+02, 7.084969352863206e+02, - 7.135071143097177e+02, 7.183012152847796e+02, 7.228977963222952e+02, 7.273131492454626e+02, 7.315616469587544e+02, - 7.356560281543291e+02, 7.396076322150732e+02, 7.434265942223789e+02, 7.471220077755929e+02, 7.507020616697857e+02, - 7.541741552133650e+02, 7.575449959936257e+02, 7.608206831430587e+02, 7.640067785683910e+02, 7.671083681389897e+02, - 7.701301144622637e+02, 7.730763025793530e+02, 7.759508796783745e+02, 7.787574897321915e+02, 7.814995038135701e+02, - 7.841800467151461e+02, 7.868020203991708e+02, 7.893681247179504e+02, 7.918808757765548e+02, 7.943426222522144e+02, - 7.967555599372084e+02, 7.991217447325205e+02, 8.014431042864308e+02, 8.037214484445143e+02, 8.059584786541318e+02, - 8.081557964468551e+02, 8.103149111055591e+02, 8.124372466087799e+02, 8.145241479328605e+02, 8.165768867821188e+02, - 8.185966668084445e+02, 8.205846283741338e+02, 8.225418529052864e+02, 8.244693668773891e+02, 8.263681454698913e+02, - 8.282391159222873e+02, 8.300831606205741e+02, 8.319011199397105e+02, 8.336937948649056e+02, 8.354619494120991e+02, - 8.372063128658339e+02, 8.389275818508129e+02, 8.406264222517649e+02, 8.423034709947531e+02, 8.439593377017471e+02, - 8.455946062291247e+02, 8.472098360997240e+02, 8.488055638371529e+02, 8.503823042102409e+02, 8.519405513947823e+02, - 8.534807800590653e+02, 8.550034463790967e+02, 8.565089889888985e+02, 8.579978298707844e+02, 8.594703752055366e+02, - 8.609270161132278e+02, 8.623681294986486e+02, 8.637940786462705e+02, 8.652052129198639e+02, 8.666018715869498e+02, - 8.679843802326020e+02, 8.693530537890008e+02, 8.707081964754541e+02, 8.720501022819271e+02, 8.733790554256601e+02, - 8.746953307826664e+02, 8.759991942806482e+02, 8.772909033466925e+02, 8.785707071779773e+02, 8.798388471526157e+02, - 8.810955571411087e+02, 8.823410638174324e+02, 8.835755869541908e+02, 8.847993397028057e+02, 8.860125288596407e+02, - 8.872153551188858e+02, 8.884080133129976e+02, 8.895906926414024e+02, 8.907635768881565e+02, 8.919268446291800e+02, - 8.930806694296663e+02, 8.942252200322159e+02, 8.953606605479592e+02, 8.964871505794214e+02, 8.976048454581148e+02, - 8.987138963494418e+02, 8.998144504146917e+02, 9.009066509532813e+02, 9.019906375387152e+02, 9.030665461485912e+02, - 9.041345092889754e+02, 9.051946561134126e+02, 9.062471125368713e+02, 9.072920013448579e+02, 9.083294422979642e+02, - 9.093595522320539e+02, 9.103824451543222e+02, 9.113982323354187e+02, 9.124070223978315e+02, 9.134089214007139e+02, - 9.144040329213170e+02, 9.153924581331944e+02, 9.163742958813375e+02, 9.173496427543690e+02, 9.183185931539490e+02, - 9.192812393615096e+02, 9.202376712475143e+02, 9.211879777240174e+02, 9.221322447881853e+02, 9.230705568043090e+02, - 9.240029963945464e+02, 9.249296443856355e+02, 9.258505798860584e+02, 9.267658803353349e+02, 9.276756215515571e+02, - 9.285798777772184e+02, 9.294787217234283e+02, 9.303722246125662e+02, 9.312604562194492e+02, 9.321434849110733e+02, - 9.330213776849857e+02, 9.338942002063461e+02, 9.347620168437304e+02, 9.356248907037256e+02, 9.364828836643719e+02, - 9.373360564074843e+02, 9.381844684499147e+02, 9.390281781737835e+02, 9.398672428557313e+02, 9.407017186952154e+02, - 9.415316608419054e+02, 9.423571234222001e+02, 9.431781595648989e+02, 9.439948214260718e+02, 9.448071602131448e+02, - 9.456152262082365e+02, 9.464190687907732e+02, 9.472187364594137e+02, 9.480142768532950e+02, 9.488057367726428e+02, - 9.495931621987530e+02, 9.503765983133844e+02, 9.511560895175602e+02, 9.519316794498278e+02, 9.527034110039673e+02, - 9.534713263461944e+02, 9.542354669318569e+02, 9.549958735216468e+02, 9.557525861973551e+02, 9.565056443771709e+02, - 9.572550868305443e+02, 9.580009516926386e+02, 9.587432764783669e+02, 9.594820976447431e+02, 9.602174523902477e+02, - 9.609493760167423e+02, 9.616779036909298e+02, 9.624030700238587e+02, 9.631249090828023e+02, 9.638434544028186e+02, - 9.645587389980027e+02, 9.652707953724364e+02, 9.659796555308470e+02, 9.666853509889930e+02, 9.673879127837642e+02, - 9.680873714830353e+02, 9.687837571952474e+02, 9.694770995787584e+02, 9.701674278509388e+02, 9.708547707970492e+02, - 9.715391567788814e+02, 9.722206137431920e+02, 9.728991692299129e+02, 9.735748503801683e+02, 9.742476839440840e+02, - 9.749176962884101e+02, 9.755849134039497e+02, 9.762493609128161e+02, 9.769110640754994e+02, 9.775700477977771e+02, - 9.782263366374477e+02, 9.788799548109075e+02, 9.795309261995704e+02, 9.801792743561349e+02, 9.808250225107039e+02, - 9.814681935767575e+02, 9.821088101569940e+02, 9.827468945490263e+02, 9.833824687509523e+02, 9.840155544667956e+02, - 9.846461731118195e+02, 9.852743458177252e+02, 9.859000934377253e+02, 9.865234365515067e+02, 9.871443954700831e+02, - 9.877629902405351e+02, 9.883792406506498e+02, 9.889931662334513e+02, 9.896047862716362e+02, 9.902141198019134e+02, - 9.908211856192407e+02, 9.914260022809773e+02, 9.920285881109459e+02, 9.926289612033999e+02, 9.932271394269170e+02, - 9.938231404281977e+02, 9.944169816357929e+02, 9.950086802637458e+02, 9.955982533151612e+02, 9.961857175856977e+02, - 9.967710896669904e+02, 9.973543859499950e+02, 9.979356226282715e+02, 9.985148157011945e+02, 9.990919809771023e+02, - 9.996671340763730e+02, 1.000240290434449e+03, 1.000811465304796e+03, 1.001380673761794e+03, 1.001947930703585e+03, - 1.002513250854854e+03, 1.003076648769557e+03, 1.003638138833595e+03, 1.004197735267433e+03, 1.004755452128675e+03, - 1.005311303314576e+03, 1.005865302564520e+03, 1.006417463462436e+03, 1.006967799439178e+03, 1.007516323774849e+03, - 1.008063049601091e+03, 1.008607989903327e+03, 1.009151157522952e+03, 1.009692565159498e+03, 1.010232225372750e+03, - 1.010770150584813e+03, 1.011306353082164e+03, 1.011840845017637e+03, 1.012373638412398e+03, 1.012904745157861e+03, - 1.013434177017585e+03, 1.013961945629128e+03, 1.014488062505868e+03, 1.015012539038792e+03, 1.015535386498254e+03, - 1.016056616035698e+03, 1.016576238685349e+03, 1.017094265365881e+03, 1.017610706882048e+03, 1.018125573926286e+03, - 1.018638877080294e+03, 1.019150626816575e+03, 1.019660833499964e+03, 1.020169507389114e+03, 1.020676658637972e+03, - 1.021182297297215e+03, 1.021686433315670e+03, 1.022189076541708e+03, 1.022690236724608e+03, 1.023189923515907e+03, - 1.023688146470721e+03, 1.024184915049042e+03, 1.024680238617021e+03, 1.025174126448217e+03, 1.025666587724839e+03, - 1.026157631538955e+03, 1.026647266893688e+03, 1.027135502704388e+03, 1.027622347799790e+03, 1.028107810923146e+03, - 1.028591900733340e+03, 1.029074625805991e+03, 1.029555994634531e+03, 1.030036015631265e+03, 1.030514697128419e+03, - 1.030992047379169e+03, 1.031468074558646e+03, 1.031942786764942e+03, 1.032416192020080e+03, 1.032888298270982e+03, - 1.033359113390417e+03, 1.033828645177932e+03, 1.034296901360772e+03, 1.034763889594786e+03, 1.035229617465311e+03, - 1.035694092488053e+03, 1.036157322109947e+03, 1.036619313710004e+03, 1.037080074600150e+03, 1.037539612026046e+03, - 1.037997933167895e+03, 1.038455045141246e+03, 1.038910954997775e+03, 1.039365669726056e+03, 1.039819196252326e+03, - 1.040271541441235e+03, 1.040722712096580e+03, 1.041172714962036e+03, 1.041621556721873e+03, 1.042069244001657e+03, - 1.042515783368948e+03, 1.042961181333987e+03, 1.043405444350365e+03, 1.043848578815691e+03, 1.044290591072247e+03, - 1.044731487407629e+03, 1.045171274055389e+03, 1.045609957195655e+03, 1.046047542955753e+03, 1.046484037410811e+03, - 1.046919446584360e+03, 1.047353776448927e+03, 1.047787032926613e+03, 1.048219221889671e+03, 1.048650349161067e+03, - 1.049080420515042e+03, 1.049509441677656e+03, 1.049937418327338e+03, 1.050364356095413e+03, 1.050790260566630e+03, - 1.051215137279682e+03, 1.051638991727720e+03, 1.052061829358853e+03, 1.052483655576651e+03, 1.052904475740630e+03, - 1.053324295166741e+03, 1.053743119127844e+03, 1.054160952854180e+03, 1.054577801533836e+03, 1.054993670313201e+03, - 1.055408564297418e+03, 1.055822488550831e+03, 1.056235448097422e+03, 1.056647447921247e+03, 1.057058492966861e+03, - 1.057468588139742e+03, 1.057877738306706e+03, 1.058285948296316e+03, 1.058693222899293e+03, 1.059099566868906e+03, - 1.059504984921376e+03, 1.059909481736260e+03, 1.060313061956834e+03, 1.060715730190478e+03, 1.061117491009040e+03, - 1.061518348949217e+03, 1.061918308512909e+03, 1.062317374167585e+03, 1.062715550346634e+03, 1.063112841449718e+03, - 1.063509251843115e+03, 1.063904785860062e+03, 1.064299447801093e+03, 1.064693241934367e+03, 1.065086172496003e+03, - 1.065478243690397e+03, 1.065869459690546e+03, 1.066259824638365e+03, 1.066649342644995e+03, 1.067038017791113e+03, - 1.067425854127240e+03, 1.067812855674030e+03, 1.068199026422581e+03, 1.068584370334718e+03, 1.068968891343285e+03, - 1.069352593352429e+03, 1.069735480237885e+03, 1.070117555847253e+03, 1.070498824000273e+03, 1.070879288489097e+03, - 1