From a88e67f2e10403d11ba40e16a65d1605bf8be31e Mon Sep 17 00:00:00 2001 From: Mark Olesen <Mark.Olesen@esi-group.com> Date: Fri, 3 Apr 2020 15:31:44 +0200 Subject: [PATCH] BUG: potential divide-by-zero in x3d surface output (#1212) - eg, for a uniform field and auto range. --- src/surfMesh/writers/x3d/x3dSurfaceWriter.C | 40 ++++++++++++++++----- 1 file changed, 32 insertions(+), 8 deletions(-) diff --git a/src/surfMesh/writers/x3d/x3dSurfaceWriter.C b/src/surfMesh/writers/x3d/x3dSurfaceWriter.C index 0ff808599b3..3a5f03403ed 100644 --- a/src/surfMesh/writers/x3d/x3dSurfaceWriter.C +++ b/src/surfMesh/writers/x3d/x3dSurfaceWriter.C @@ -5,7 +5,7 @@ \\ / A nd | www.openfoam.com \\/ M anipulation | ------------------------------------------------------------------------------- - Copyright (C) 2019 OpenCFD Ltd. + Copyright (C) 2019-2020 OpenCFD Ltd. ------------------------------------------------------------------------------- License This file is part of OpenFOAM. @@ -50,13 +50,30 @@ namespace surfaceWriters namespace Foam { +//- A (0-1) range for colouring +inline scalar srange01(const scalarMinMax& range, scalar x) +{ + if (x >= range.max()) + { + return 1; + } + + x -= range.min(); + + if (x < VSMALL) + { + return 0; + } + + return x / (range.max() - range.min()); +} + + //- A (0-1) range for colouring template<class Type> static inline scalar rangex(const scalarMinMax& range, const Type& val) { - scalar x = Foam::mag(val); - - return (x - range.min()) / (range.max() - range.min()); + return srange01(range, Foam::mag(val)); } @@ -64,8 +81,7 @@ static inline scalar rangex(const scalarMinMax& range, const Type& val) template<> inline scalar rangex(const scalarMinMax& range, const scalar& val) { - scalar x = val; - return (x - range.min()) / (range.max() - range.min()); + return srange01(range, val); } @@ -73,8 +89,7 @@ inline scalar rangex(const scalarMinMax& range, const scalar& val) template<> inline scalar rangex(const scalarMinMax& range, const label& val) { - scalar x = val; - return (x - range.min()) / (range.max() - range.min()); + return srange01(range, val); } @@ -266,8 +281,17 @@ Foam::fileName Foam::surfaceWriters::x3dWriter::writeTemplate if (!range.valid()) { range = minMaxMag(values); + + if (equal(range.mag(), 0)) + { + range.add(range.centre()); + } } + // Slight rounding + range.min() -= VSMALL; + range.max() += VSMALL; + if (!isDir(outputFile.path())) { mkDir(outputFile.path()); -- GitLab