diff --git a/Applications/FileIO/Gmsh/GMSHInterface.cpp b/Applications/FileIO/Gmsh/GMSHInterface.cpp index a7073724a4d86aa6892a5cb709f0ea9ac514a71c..54ba7864c75035e89ded9e6d8a1c6edd286d93d1 100644 --- a/Applications/FileIO/Gmsh/GMSHInterface.cpp +++ b/Applications/FileIO/Gmsh/GMSHInterface.cpp @@ -268,7 +268,7 @@ int GMSHInterface::writeGMSHInputFile(std::ostream& out) } std::stringstream error_messages; - error_messages.precision(std::numeric_limits<double>::digits10); + error_messages.precision(std::numeric_limits<double>::max_digits10); for (std::size_t k = 0; k < _gmsh_pnts.size(); ++k) { if (_gmsh_pnts[k] == nullptr) diff --git a/Applications/FileIO/Gmsh/GMSHPolygonTree.cpp b/Applications/FileIO/Gmsh/GMSHPolygonTree.cpp index e7e1883912240b405528ad1407da280e96987bb8..967fb003cb6de46a8309df0ec019156da81063c9 100644 --- a/Applications/FileIO/Gmsh/GMSHPolygonTree.cpp +++ b/Applications/FileIO/Gmsh/GMSHPolygonTree.cpp @@ -307,7 +307,7 @@ void GMSHPolygonTree::createGMSHPoints(std::vector<GMSHPoint*>& gmsh_pnts) const const std::size_t n_plys(_plys.size()); std::stringstream error_messages; - error_messages.precision(std::numeric_limits<double>::digits10); + error_messages.precision(std::numeric_limits<double>::max_digits10); for (std::size_t k(0); k < n_plys; k++) { const std::size_t n_pnts_in_ply(_plys[k]->getNumberOfPoints()); diff --git a/Applications/FileIO/Legacy/OGSIOVer4.cpp b/Applications/FileIO/Legacy/OGSIOVer4.cpp index f1f29379af810ce64839d10a60ca2c68289a1028..eaba9e019aec7bff9631340356f9f93b4098ebfb 100644 --- a/Applications/FileIO/Legacy/OGSIOVer4.cpp +++ b/Applications/FileIO/Legacy/OGSIOVer4.cpp @@ -670,7 +670,7 @@ void writeGLIFileV4(const std::string& fname, n_pnts, fname); os << "#POINTS" << "\n"; - os.precision(std::numeric_limits<double>::digits10); + os.precision(std::numeric_limits<double>::max_digits10); for (std::size_t k(0); k < n_pnts; k++) { os << k << " " << *(pnts[k]); @@ -738,7 +738,7 @@ void writeAllDataToGLIFileV4(const std::string& fname, << "\n"; for (auto const& geo_name : geo_names) { - os.precision(std::numeric_limits<double>::digits10); + os.precision(std::numeric_limits<double>::max_digits10); GeoLib::PointVec const* const pnt_vec(geo.getPointVecObj(geo_name)); if (pnt_vec) { @@ -766,7 +766,7 @@ void writeAllDataToGLIFileV4(const std::string& fname, geo.getStationVectorNames(stn_names); for (auto& stn_name : stn_names) { - os.precision(std::numeric_limits<double>::digits10); + os.precision(std::numeric_limits<double>::max_digits10); const std::vector<GeoLib::Point*>* pnts(geo.getStationVec(stn_name)); if (pnts) { diff --git a/Applications/FileIO/TetGenInterface.cpp b/Applications/FileIO/TetGenInterface.cpp index ea9b7c7f41915419e45fb89b7901c82bbc6ee1a5..9296012e981ca02d5ec0ed41e54888fbf19a3d82 100644 --- a/Applications/FileIO/TetGenInterface.cpp +++ b/Applications/FileIO/TetGenInterface.cpp @@ -630,7 +630,7 @@ bool TetGenInterface::writeTetGenSmesh( } std::ofstream out(file_name.c_str(), std::ios::out); - out.precision(std::numeric_limits<double>::digits10); + out.precision(std::numeric_limits<double>::max_digits10); // the points header const std::size_t nPoints(points->size()); out << nPoints << " 3\n"; @@ -700,7 +700,7 @@ bool TetGenInterface::writeTetGenSmesh( const std::vector<MeshLib::Node*>& nodes = mesh.getNodes(); std::ofstream out(file_name.c_str(), std::ios::out); - out.precision(std::numeric_limits<double>::digits10); + out.precision(std::numeric_limits<double>::max_digits10); // the points header const std::size_t nPoints(nodes.size()); out << nPoints << " 3\n"; diff --git a/Applications/Utils/MeshEdit/queryMesh.cpp b/Applications/Utils/MeshEdit/queryMesh.cpp index 0b38b294a63caf1a56e9801d39620f2cfdb97baf..fd713e8fe74b52b847d04e6e968859c0cd3adb8d 100644 --- a/Applications/Utils/MeshEdit/queryMesh.cpp +++ b/Applications/Utils/MeshEdit/queryMesh.cpp @@ -95,7 +95,7 @@ int main(int argc, char* argv[]) { std::stringstream out; out << std::scientific - << std::setprecision(std::numeric_limits<double>::digits10); + << std::setprecision(std::numeric_limits<double>::max_digits10); out << "--------------------------------------------------------" << std::endl; auto* ele = mesh->getElement(ele_id); @@ -133,7 +133,7 @@ int main(int argc, char* argv[]) { std::stringstream out; out << std::scientific - << std::setprecision(std::numeric_limits<double>::digits10); + << std::setprecision(std::numeric_limits<double>::max_digits10); out << "--------------------------------------------------------" << std::endl; MeshLib::Node const* node = mesh->getNode(node_id); diff --git a/Applications/Utils/ModelPreparation/ComputeNodeAreasFromSurfaceMesh.cpp b/Applications/Utils/ModelPreparation/ComputeNodeAreasFromSurfaceMesh.cpp index b805da8084f8159e4e7096c268de122fcb232b1f..c29a8bc4bbf82d1f7c42efb6c041d08f63935835 100644 --- a/Applications/Utils/ModelPreparation/ComputeNodeAreasFromSurfaceMesh.cpp +++ b/Applications/Utils/ModelPreparation/ComputeNodeAreasFromSurfaceMesh.cpp @@ -45,8 +45,8 @@ static void writeToFile( OGS_FATAL("Unable to open the file '{:s}' - aborting.", csv_fname); } - ids_and_area_out.precision(std::numeric_limits<double>::digits10); - csv_out.precision(std::numeric_limits<double>::digits10); + ids_and_area_out.precision(std::numeric_limits<double>::max_digits10); + csv_out.precision(std::numeric_limits<double>::max_digits10); csv_out << "ID x y z area node_id\n"; // CSV header for (std::size_t k(0); k < ids_and_areas.size(); k++) diff --git a/Applications/Utils/ModelPreparation/createNeumannBc.cpp b/Applications/Utils/ModelPreparation/createNeumannBc.cpp index e2e479ffae35aeaf7b1a6a1db8899a299c1cefc6..7f108478b1f70e54b7fa99ae67114c4d8dea7e28 100644 --- a/Applications/Utils/ModelPreparation/createNeumannBc.cpp +++ b/Applications/Utils/ModelPreparation/createNeumannBc.cpp @@ -186,7 +186,7 @@ int main(int argc, char* argv[]) MeshLib::IO::writeMeshToFile(*surface_mesh, result_file.getValue()); std::ofstream result_out(result_file.getValue() + ".txt"); - result_out.precision(std::numeric_limits<double>::digits10); + result_out.precision(std::numeric_limits<double>::max_digits10); for (auto const& p : direct_values) { result_out << p.first << " " << p.second << "\n"; diff --git a/BaseLib/IO/Writer.cpp b/BaseLib/IO/Writer.cpp index 3296c6e5e2a70178210f2ed906596ddc07d3edb1..b220c2335cfb36d4e13c7f3b546d5ba1dea2d3d3 100644 --- a/BaseLib/IO/Writer.cpp +++ b/BaseLib/IO/Writer.cpp @@ -25,7 +25,7 @@ namespace IO { Writer::Writer() { - out.precision(std::numeric_limits<double>::digits10); + out.precision(std::numeric_limits<double>::max_digits10); } std::string Writer::writeToString() diff --git a/ChemistryLib/PhreeqcIO.cpp b/ChemistryLib/PhreeqcIO.cpp index d109707cf2bc6a02239df2f55b61894b283335d7..93118dd4c0fa13845d7bc668895cfc8715c76356 100644 --- a/ChemistryLib/PhreeqcIO.cpp +++ b/ChemistryLib/PhreeqcIO.cpp @@ -468,7 +468,7 @@ void PhreeqcIO::writeInputsToFile(double const dt) } out << std::scientific - << std::setprecision(std::numeric_limits<double>::digits10); + << std::setprecision(std::numeric_limits<double>::max_digits10); out << (*this << dt); if (!out) diff --git a/GeoLib/AnalyticalGeometry.cpp b/GeoLib/AnalyticalGeometry.cpp index 5adb8909c39cf1bed80b9e4b6c0e61cad3a14639..5dbd918e0cc43fe7b4012e92064205d055bfd0c4 100644 --- a/GeoLib/AnalyticalGeometry.cpp +++ b/GeoLib/AnalyticalGeometry.cpp @@ -519,7 +519,7 @@ std::vector<MathLib::Point3d> lineSegmentIntersect2d( return {{c, d}}; } std::stringstream err; - err.precision(std::numeric_limits<double>::digits10); + err.precision(std::numeric_limits<double>::max_digits10); err << ab << " x " << cd; OGS_FATAL( "The case of parallel line segments ({:s}) is not handled yet. " @@ -552,7 +552,7 @@ std::vector<MathLib::Point3d> lineSegmentIntersect2d( } std::stringstream err; - err.precision(std::numeric_limits<double>::digits10); + err.precision(std::numeric_limits<double>::max_digits10); err << ab << " x " << cd; OGS_FATAL( "The case of parallel line segments ({:s}) is not handled yet. " diff --git a/GeoLib/IO/AsciiRasterInterface.cpp b/GeoLib/IO/AsciiRasterInterface.cpp index 9a5f2b6950359309f6c34c331958b5d0a572986e..1ca81a2526d9944e62abfe1b0cbc28ebf0628840 100644 --- a/GeoLib/IO/AsciiRasterInterface.cpp +++ b/GeoLib/IO/AsciiRasterInterface.cpp @@ -359,7 +359,7 @@ void AsciiRasterInterface::writeRasterAsASC(GeoLib::Raster const& raster, out << "ncols " << nCols << "\n"; out << "nrows " << nRows << "\n"; auto const default_precision = out.precision(); - out.precision(std::numeric_limits<double>::digits10); + out.precision(std::numeric_limits<double>::max_digits10); out << "xllcorner " << origin[0] << "\n"; out << "yllcorner " << origin[1] << "\n"; out << "cellsize " << header.cell_size << "\n"; diff --git a/GeoLib/IO/TINInterface.cpp b/GeoLib/IO/TINInterface.cpp index ecf1e9f8064bfd72175bb1a7a90e97de6945a753..1ff83a3d078c2827f66c96abeaf2824e60caeedc 100644 --- a/GeoLib/IO/TINInterface.cpp +++ b/GeoLib/IO/TINInterface.cpp @@ -168,7 +168,7 @@ void TINInterface::writeSurfaceAsTIN(GeoLib::Surface const& surface, WARN("writeSurfaceAsTIN(): could not open stream to {:s}.", file_name); return; } - os.precision(std::numeric_limits<double>::digits10); + os.precision(std::numeric_limits<double>::max_digits10); const std::size_t n_tris(surface.getNumberOfTriangles()); for (std::size_t l(0); l < n_tris; l++) { diff --git a/GeoLib/IO/XmlIO/Qt/XmlGmlInterface.cpp b/GeoLib/IO/XmlIO/Qt/XmlGmlInterface.cpp index 3320b39bd9251a047da419bc44c7b4e576a6919b..762bb3c14c83d0a0eb439e0ee90476d4176d1db0 100644 --- a/GeoLib/IO/XmlIO/Qt/XmlGmlInterface.cpp +++ b/GeoLib/IO/XmlIO/Qt/XmlGmlInterface.cpp @@ -308,15 +308,15 @@ bool XmlGmlInterface::write() pointTag.setAttribute( "x", QString::number((*points[i])[0], 'f', - std::numeric_limits<double>::digits10)); + std::numeric_limits<double>::max_digits10)); pointTag.setAttribute( "y", QString::number((*points[i])[1], 'f', - std::numeric_limits<double>::digits10)); + std::numeric_limits<double>::max_digits10)); pointTag.setAttribute( "z", QString::number((*points[i])[2], 'f', - std::numeric_limits<double>::digits10)); + std::numeric_limits<double>::max_digits10)); std::string const& point_name(pnt_vec->getItemNameByID(i)); if (!point_name.empty()) diff --git a/GeoLib/IO/XmlIO/Qt/XmlStnInterface.cpp b/GeoLib/IO/XmlIO/Qt/XmlStnInterface.cpp index 77c280633b0fa7d6107eeb8861d5c3a9e2d08a40..6bdc2c79aaeb238a5d7f122df4170345a737f98c 100644 --- a/GeoLib/IO/XmlIO/Qt/XmlStnInterface.cpp +++ b/GeoLib/IO/XmlIO/Qt/XmlStnInterface.cpp @@ -298,13 +298,13 @@ bool XmlStnInterface::write() stationTag.setAttribute("id", QString::number(i)); stationTag.setAttribute( "x", QString::number((*(*stations)[i])[0], 'f', - std::numeric_limits<double>::digits10)); + std::numeric_limits<double>::max_digits10)); stationTag.setAttribute( "y", QString::number((*(*stations)[i])[1], 'f', - std::numeric_limits<double>::digits10)); + std::numeric_limits<double>::max_digits10)); stationTag.setAttribute( "z", QString::number((*(*stations)[i])[2], 'f', - std::numeric_limits<double>::digits10)); + std::numeric_limits<double>::max_digits10)); stationsTag.appendChild(stationTag); QDomElement stationNameTag = doc.createElement("name"); diff --git a/MeshGeoToolsLib/GeoMapper.cpp b/MeshGeoToolsLib/GeoMapper.cpp index 27a7c864b38fcf1fcf19264e4a7a578770e90659..e2c8545ea20372445bc7cc448c9d89f8bfc564ec 100644 --- a/MeshGeoToolsLib/GeoMapper.cpp +++ b/MeshGeoToolsLib/GeoMapper.cpp @@ -508,7 +508,7 @@ static bool snapPointToElementNode(MathLib::Point3d& p, { #ifdef DEBUG_GEOMAPPER std::stringstream out; - out.precision(std::numeric_limits<double>::digits10); + out.precision(std::numeric_limits<double>::max_digits10); out << "Segment point snapped from " << p; #endif p = node; diff --git a/MeshLib/IO/VtkIO/PVDFile.cpp b/MeshLib/IO/VtkIO/PVDFile.cpp index 5a9d31ae3b3de857b70293321bf669b0b7d1fab4..7e1cb002daf98438e5b12bd7e9e2abbca91fa75e 100644 --- a/MeshLib/IO/VtkIO/PVDFile.cpp +++ b/MeshLib/IO/VtkIO/PVDFile.cpp @@ -51,7 +51,7 @@ void PVDFile::addVTUFile(const std::string& vtu_fname, double timestep) OGS_FATAL("could not open file `{:s}'", pvd_filename); } - fh << std::setprecision(std::numeric_limits<double>::digits10); + fh << std::setprecision(std::numeric_limits<double>::max_digits10); fh << "<?xml version=\"1.0\"?>\n" "<VTKFile type=\"Collection\" version=\"0.1\" " diff --git a/MeshLib/IO/XDMF/writeXdmf.cpp b/MeshLib/IO/XDMF/writeXdmf.cpp index 18e64a89a48e41088a1e569700425e3b8e140fa3..c1b1bed1815749db3ad09ef50f3ac5e1571d5577 100644 --- a/MeshLib/IO/XDMF/writeXdmf.cpp +++ b/MeshLib/IO/XDMF/writeXdmf.cpp @@ -216,19 +216,21 @@ std::function<std::string(std::vector<double>)> write_xdmf( [](double const& time_value, auto const& geometry, auto const& topology, auto const& constant_attributes, auto const& variable_attributes) { - // Output of "Time Value" with sufficient precision. - static_assert(15 == std::numeric_limits<double>::digits10); return fmt::format( R"( <Grid Name="Grid" GridType="Uniform"> - <Time Value="{time_value:.15g}"/> + <Time Value="{time_value:.{precision}g}"/> {geometry} {topology} {fix_attributes} {variable_attributes} </Grid>)", - "time_value"_a = time_value, "geometry"_a = geometry, - "topology"_a = topology, "fix_attributes"_a = constant_attributes, + "time_value"_a = time_value, + // Output of "Time Value" with sufficient precision. + "precision"_a = std::numeric_limits<double>::max_digits10, + "geometry"_a = geometry, + "topology"_a = topology, + "fix_attributes"_a = constant_attributes, "variable_attributes"_a = variable_attributes); }; diff --git a/ProcessLib/Assembly/MatrixOutput.cpp b/ProcessLib/Assembly/MatrixOutput.cpp index 5aabd69dc9fbcd58d0f91cf610be0812063b88e2..a029bde37cf9656909e8d10d3e6ac68770d2a953 100644 --- a/ProcessLib/Assembly/MatrixOutput.cpp +++ b/ProcessLib/Assembly/MatrixOutput.cpp @@ -33,15 +33,19 @@ std::string getSeparatorAfterFilenamePrefix(std::string const& filenamePrefix) #ifndef USE_PETSC static void outputGlobalMatrix(GlobalMatrix const& mat, std::ostream& os) { - os << std::setprecision(16) << "(" << mat.getNumberOfRows() << " x " - << mat.getNumberOfColumns() << ")\n"; + auto const precision = os.precision(); + os << std::setprecision(std::numeric_limits<double>::max_digits10) << "(" + << mat.getNumberOfRows() << " x " << mat.getNumberOfColumns() << ")\n" + << std::setprecision(precision); mat.write(os); } static void outputGlobalVector(GlobalVector const& vec, std::ostream& os) { - os << std::setprecision(16) << "(" << vec.size() << ")\n"; - os << vec.getRawVector() << '\n'; + auto const precision = os.precision(); + os << std::setprecision(std::numeric_limits<double>::max_digits10) << "(" + << vec.size() << ")\n"; + os << vec.getRawVector() << '\n' << std::setprecision(precision); } std::ofstream openGlobalMatrixOutputFile(std::string const& filenamePrefix, @@ -326,8 +330,9 @@ void LocalMatrixOutput::operator()(double const t, int const process_id, DBUG("Writing to local matrix debug output file..."); - fmt::print(fh, "## t = {:.15g}, process id = {}, element id = {}\n\n", t, - process_id, element_id); + fmt::print(fh, "## t = {:.{}g}, process id = {}, element id = {}\n\n", t, + std::numeric_limits<double>::max_digits10, process_id, + element_id); if (!local_M_data.empty()) { @@ -364,8 +369,9 @@ void LocalMatrixOutput::operator()(double const t, int const process_id, DBUG("Writing to local matrix debug output file..."); - fmt::print(fh, "## t = {:.15g}, process id = {}, element id = {}\n\n", t, - process_id, element_id); + fmt::print(fh, "## t = {:.{}g}, process id = {}, element id = {}\n\n", t, + std::numeric_limits<double>::max_digits10, process_id, + element_id); if (!local_b_data.empty()) { diff --git a/ProcessLib/CompareJacobiansJacobianAssembler.h b/ProcessLib/CompareJacobiansJacobianAssembler.h index 8b7fcd3132854a4731ded68c040b5299b2f2191c..711bf5231c15bf6dd01f8000dc1b3d921a01d84b 100644 --- a/ProcessLib/CompareJacobiansJacobianAssembler.h +++ b/ProcessLib/CompareJacobiansJacobianAssembler.h @@ -45,7 +45,7 @@ public: _fail_on_error(fail_on_error), _log_file(log_file_path) { - _log_file.precision(std::numeric_limits<double>::digits10); + _log_file.precision(std::numeric_limits<double>::max_digits10); _log_file << "#!/usr/bin/env python\n" "import numpy as np\n" "from numpy import nan\n" diff --git a/Tests/MaterialLib/TestMPLAverageMolarMass.cpp b/Tests/MaterialLib/TestMPLAverageMolarMass.cpp index ec83a037248d343e2dced2f8bc24ebab7e7d3388..95738e378dcec6e0c11c3f6a3cf8eb0ec860966c 100644 --- a/Tests/MaterialLib/TestMPLAverageMolarMass.cpp +++ b/Tests/MaterialLib/TestMPLAverageMolarMass.cpp @@ -84,7 +84,7 @@ TEST(MaterialPropertyLib, AverageMolarMass) m_composition << "<value>" << std::setprecision( - std::numeric_limits<double>::digits10) + std::numeric_limits<double>::max_digits10) << ref_molar_fraction_A[idx] << " " << 1. - ref_molar_fraction_A[idx] << "</value>\n"; std::stringstream m; diff --git a/Tests/MathLib/TestNonlinear1D.cpp b/Tests/MathLib/TestNonlinear1D.cpp index 78f64384fec3528175e7914cf2b4d199b70dc743..79e4068560bea9880b3a337f4ff9100d7e738b84 100644 --- a/Tests/MathLib/TestNonlinear1D.cpp +++ b/Tests/MathLib/TestNonlinear1D.cpp @@ -37,7 +37,11 @@ TYPED_TEST(MathLibRegulaFalsi, QuadraticFunction) auto rf = NL::makeRegulaFalsi<TypeParam>(f, -0.1, 1.1); double old_range = rf.getRange(); - DBUG(" 0 -- x ~ {:23.16g}, range = {:23.16g}", rf.getResult(), old_range); + auto format_double = + [p = std::numeric_limits<double>::max_digits10](double const value) + { return fmt::format("{:23.{}g}", value, p); }; + DBUG(" 0 -- x ~ {}, range = {}", format_double(rf.getResult()), + format_double(old_range)); for (unsigned n = 0; n < 10; ++n) { @@ -46,8 +50,8 @@ TYPED_TEST(MathLibRegulaFalsi, QuadraticFunction) // expect that the interval of the root search shrinks EXPECT_GT(old_range, range); old_range = range; - DBUG("{:2d} -- x ~ {:23.16g}, range = {:23.16g}", n + 1, rf.getResult(), - range); + DBUG("{:2d} -- x ~ {}, range = {}", n + 1, + format_double(rf.getResult()), format_double(range)); if (range < std::numeric_limits<double>::epsilon()) { diff --git a/Tests/xdmfdiff/xdmfdiff.cpp b/Tests/xdmfdiff/xdmfdiff.cpp index 72240b645129f9b609aec89be69196d1e043de16..c96e8c77638d998eefb1bdd6cebde6bae99dd0e0 100644 --- a/Tests/xdmfdiff/xdmfdiff.cpp +++ b/Tests/xdmfdiff/xdmfdiff.cpp @@ -246,7 +246,7 @@ bool compareValues(std::vector<double> const& points_a, int main(int argc, char* argv[]) { - auto const digits10 = std::numeric_limits<double>::digits10; + auto const digits10 = std::numeric_limits<double>::max_digits10; auto const args = parseCommandLine(argc, argv); // Setup the standard output and error stream numerical formats.