diff --git a/dune/tectonic/spatial-solving/tnnmg/functional.hh b/dune/tectonic/spatial-solving/tnnmg/functional.hh index 9d08eca2b34cfb3115f69cd2375dd62b23514cc4..2cb37df887947376f53edaada1c554f6df069631 100755 --- a/dune/tectonic/spatial-solving/tnnmg/functional.hh +++ b/dune/tectonic/spatial-solving/tnnmg/functional.hh @@ -116,6 +116,22 @@ class ShiftedFunctional { return phi_; } + friend auto directionalRestriction(const ShiftedFunctional& f, const Vector& origin, const Vector& direction) + -> DirectionalRestriction<Matrix, Vector, Nonlinearity, LowerObstacle, UpperObstacle, Range> + { + // rescale direction for numerical stability + auto dir = direction; + auto dirNorm = dir.two_norm(); + if (dirNorm > 0.0) + dir /= dirNorm; + else { + dirNorm = 0.0; + dir = 0.0; + } + + return DirectionalRestriction<Matrix, Vector, Nonlinearity, LowerObstacle, UpperObstacle, Range>(f.quadraticPart(), f.originalLinearPart(), f.phi(), f.originalLowerObstacle(), f.originalUpperObstacle(), origin, dir, dirNorm); + } + protected: Dune::Solvers::ConstCopyOrReference<M> quadraticPart_; @@ -267,9 +283,9 @@ auto coordinateRestriction(const GlobalShiftedFunctional& f, const Index& i) dli -= origini; dui -= origini; - return Functional<decltype(Aii), LocalVector, decltype(phii), LocalLowerObstacle, LocalUpperObstacle, Range>(Aii, std::move(ri), phii, std::move(dli), std::move(dui)); + //return Functional<decltype(Aii), LocalVector, decltype(phii), LocalLowerObstacle, LocalUpperObstacle, Range>(Aii, std::move(ri), phii, std::move(dli), std::move(dui)); - //return ShiftedFunctional<decltype(Aii), LocalVector, decltype(phii), LocalLowerObstacle, LocalUpperObstacle, LocalVector, Range>(Aii, std::move(ri), phii, std::move(dli), std::move(dui), origini); + return ShiftedFunctional<decltype(Aii), LocalVector, decltype(phii), LocalLowerObstacle, LocalUpperObstacle, LocalVector, Range>(Aii, std::move(ri), phii, std::move(dli), std::move(dui), origini); } diff --git a/dune/tectonic/spatial-solving/tnnmg/localbisectionsolver.hh b/dune/tectonic/spatial-solving/tnnmg/localbisectionsolver.hh index a9327ad77125202b10567161f175d0d7d7a00f50..ea694ea62204307fffb03f02115baf46acc548b9 100644 --- a/dune/tectonic/spatial-solving/tnnmg/localbisectionsolver.hh +++ b/dune/tectonic/spatial-solving/tnnmg/localbisectionsolver.hh @@ -26,9 +26,8 @@ class LocalBisectionSolver return; } - auto old_x = x; - auto origin = x; - auto linearPart = f.linearPart(); + auto origin = f.origin(); + auto linearPart = f.originalLinearPart(); //std::cout << x << std::endl; @@ -36,11 +35,11 @@ class LocalBisectionSolver //std::cout << "ignore: " << ignore << std::endl; //std::cout << "orig linear part: " << linearPart << std::endl; - auto lower = f.lowerObstacle(); - auto upper = f.upperObstacle(); + auto lower = f.originalLowerObstacle(); + auto upper = f.originalUpperObstacle(); for (size_t j = 0; j < lower.size(); ++j) { if (std::abs(upper[j]-lower[j])<= safety) { - //linearPart[j] = 0; + linearPart[j] = 0; } } @@ -54,13 +53,14 @@ class LocalBisectionSolver } } + /* auto linearPartNorm = linearPart.two_norm(); if (linearPartNorm > 0.0) linearPart /= linearPartNorm; else { linearPartNorm = 0.0; linearPart = 0.0; - } + }*/ //using DirectionalRestriction = DirectionalRestriction<Matrix, Vector, Nonlinearity, LowerObstacle, UpperObstacle, Range>; //DirectionalRestriction fv(f.quadraticPart(), f.linearPart(), f.phi(), f.lowerObstacle(), f.upperObstacle(), f.origin(), linearPart, linearPartNorm); @@ -70,10 +70,10 @@ class LocalBisectionSolver //std::cout << "origin: " << origin << std::endl; //std::cout << " linearPart: " << linearPart << std::endl; - std::cout << "maxEigenvalue " << f.quadraticPart() << std::endl; - print(linearPart, "linearPart:"); - std::cout << "linearPartNorm " << linearPartNorm << std::endl; - print(origin, "origin:"); + //std::cout << "maxEigenvalue " << f.quadraticPart() << std::endl; + //print(linearPart, "linearPart:"); + //std::cout << "linearPartNorm " << linearPartNorm << std::endl; + //print(origin, "origin:"); @@ -115,11 +115,11 @@ class LocalBisectionSolver if (fv.scaling()<=0.0) { alpha = 0.0; - } /* else { + } else { LineSearchSolver lineSearch; lineSearch(alpha, fv, false); - }*/ - + } +/* const auto& domain = fv.domain(); if (std::abs(domain[0]-domain[1])>safety) { int bisectionsteps = 0; @@ -128,15 +128,16 @@ class LocalBisectionSolver alpha = globalBisection.minimize(fv, 0.0, 0.0, bisectionsteps); } else { alpha = domain[0]; - } + }*/ - std::cout << "alpha: " << alpha << std::endl; + //std::cout << "alpha: " << alpha << std::endl; linearPart *= alpha; - std::cout << linearPart << std::endl; + //std::cout << linearPart << std::endl; + //std::cout << "old_x: " << old_x << std::endl; #ifdef NEW_TNNMG_COMPUTE_ITERATES_DIRECTLY if (std::abs(alpha)> safety) { x = origin; @@ -145,14 +146,14 @@ class LocalBisectionSolver x = origin; } #else - std::cout << "use old" << std::endl; + //std::cout << "use old" << std::endl; if (std::abs(alpha)> safety) { x = origin; x += linearPart; - x -= old_x;//f.origin(); + x -= f.origin(); } #endif - std::cout << "new x: "<< x << std::endl << std::endl; + //std::cout << "new x: "<< x << std::endl << std::endl; } };