diff --git a/src/samplefunctional.hh b/src/samplefunctional.hh index 7504cb8070336dd3830de9dcf28e912a24050d88..a6a2d55383b4586d5bbb85cd44d8cf922edf95ff 100644 --- a/src/samplefunctional.hh +++ b/src/samplefunctional.hh @@ -78,7 +78,7 @@ template <int dim> class SampleFunctional { // points in direction -x. The projection will then be zero. SmallVector d; smoothGradient(x, d); - ret = negative_projection(d, x); + negative_projection(d, x, ret); dverb << "## Directional derivative (as per scalar product w/ " "semigradient): " << -(ret * ret) << " (coordinates of the restriction)" << std::endl; @@ -111,12 +111,13 @@ template <int dim> class SampleFunctional { y += z; } - // No normalising is done! - SmallVector negative_projection(SmallVector const z, - SmallVector const x) const { - SmallVector y = z; - y.axpy(-(z * x) / x.two_norm2(), x); - return y; + // y = (id - P)(d) where P is the projection onto the line t*x + void negative_projection(SmallVector const &d, SmallVector const &x, + SmallVector &y) const { + double const dx = d * x; + double const xx = x.two_norm2(); + y = d; + y.axpy(-dx / xx, x); } };