-// Copyright (C) 2007-2013 CEA/DEN, EDF R&D
+// Copyright (C) 2007-2024 CEA, EDF
//
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Lesser General Public
// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
+// version 2.1 of the License, or (at your option) any later version.
//
// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
#ifndef __VECTORUTILS_HXX__
#define __VECTORUTILS_HXX__
+#include <algorithm>
#include <sstream>
#include <numeric>
#include <string>
#include <cmath>
#include <map>
+
namespace INTERP_KERNEL
{
/// Precision used for tests of 3D part of INTERP_KERNEL
// return std::fabs(x - y) < errTol;
}
+
+ /**
+ * Test whether two 3D vectors are colinear. The two vectors are expected to be of unit norm (not checked)
+ * Implemented by checking that the norm of the cross product is null.
+ */
+ inline bool isColinear3D(const double *v1, const double *v2, const double eps = DEFAULT_ABS_TOL)
+ {
+ double cros[3];
+ cross(v1, v2, cros);
+ return epsilonEqual(dot(cros, cros), 0.0, eps);
+ }
+
+ /**
+ * Caracteristic vector size (its biggest component, in absolute)
+ */
+ inline double caracteristicDimVector(const double *v)
+ {
+ double ret = 0;
+ for (int i = 0; i < 3; i++)
+ ret = std::max(ret, std::fabs(v[i]));
+ return ret;
+ }
+
/**
* Compares doubles using a relative tolerance
* This is suitable mainly for comparing larger values to each other. Before performing the relative test,
return relError < relTol;
}
+ inline double sumOfAbsoluteValues(const double row[3])
+ {
+ double ret(0.);
+ std::for_each(row,row+3,[&ret](double v) { ret += std::abs(v); });
+ return ret;
+ }
+
+ /*!
+ * Returns the infinite norm of a 3x3 input matrix \a mat.
+ * The max of absolute value of row sum.
+ */
+ inline double normInf(const double mat[9])
+ {
+ double ret(std::max(sumOfAbsoluteValues(mat),sumOfAbsoluteValues(mat+3)));
+ return std::max(ret,sumOfAbsoluteValues(mat+6));
+ }
+
}
#endif