Skip to content
Snippets Groups Projects
Commit 6b0114c7 authored by podlesny's avatar podlesny
Browse files

coordinateRestriction now yields ShiftedFunctional

parent 473b833b
Branches
No related tags found
No related merge requests found
...@@ -116,6 +116,22 @@ class ShiftedFunctional { ...@@ -116,6 +116,22 @@ class ShiftedFunctional {
return phi_; 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: protected:
Dune::Solvers::ConstCopyOrReference<M> quadraticPart_; Dune::Solvers::ConstCopyOrReference<M> quadraticPart_;
...@@ -267,9 +283,9 @@ auto coordinateRestriction(const GlobalShiftedFunctional& f, const Index& i) ...@@ -267,9 +283,9 @@ auto coordinateRestriction(const GlobalShiftedFunctional& f, const Index& i)
dli -= origini; dli -= origini;
dui -= 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);
} }
......
...@@ -26,9 +26,8 @@ class LocalBisectionSolver ...@@ -26,9 +26,8 @@ class LocalBisectionSolver
return; return;
} }
auto old_x = x; auto origin = f.origin();
auto origin = x; auto linearPart = f.originalLinearPart();
auto linearPart = f.linearPart();
//std::cout << x << std::endl; //std::cout << x << std::endl;
...@@ -36,11 +35,11 @@ class LocalBisectionSolver ...@@ -36,11 +35,11 @@ class LocalBisectionSolver
//std::cout << "ignore: " << ignore << std::endl; //std::cout << "ignore: " << ignore << std::endl;
//std::cout << "orig linear part: " << linearPart << std::endl; //std::cout << "orig linear part: " << linearPart << std::endl;
auto lower = f.lowerObstacle(); auto lower = f.originalLowerObstacle();
auto upper = f.upperObstacle(); auto upper = f.originalUpperObstacle();
for (size_t j = 0; j < lower.size(); ++j) { for (size_t j = 0; j < lower.size(); ++j) {
if (std::abs(upper[j]-lower[j])<= safety) { if (std::abs(upper[j]-lower[j])<= safety) {
//linearPart[j] = 0; linearPart[j] = 0;
} }
} }
...@@ -54,13 +53,14 @@ class LocalBisectionSolver ...@@ -54,13 +53,14 @@ class LocalBisectionSolver
} }
} }
/*
auto linearPartNorm = linearPart.two_norm(); auto linearPartNorm = linearPart.two_norm();
if (linearPartNorm > 0.0) if (linearPartNorm > 0.0)
linearPart /= linearPartNorm; linearPart /= linearPartNorm;
else { else {
linearPartNorm = 0.0; linearPartNorm = 0.0;
linearPart = 0.0; linearPart = 0.0;
} }*/
//using DirectionalRestriction = DirectionalRestriction<Matrix, Vector, Nonlinearity, LowerObstacle, UpperObstacle, Range>; //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); //DirectionalRestriction fv(f.quadraticPart(), f.linearPart(), f.phi(), f.lowerObstacle(), f.upperObstacle(), f.origin(), linearPart, linearPartNorm);
...@@ -70,10 +70,10 @@ class LocalBisectionSolver ...@@ -70,10 +70,10 @@ class LocalBisectionSolver
//std::cout << "origin: " << origin << std::endl; //std::cout << "origin: " << origin << std::endl;
//std::cout << " linearPart: " << linearPart << std::endl; //std::cout << " linearPart: " << linearPart << std::endl;
std::cout << "maxEigenvalue " << f.quadraticPart() << std::endl; //std::cout << "maxEigenvalue " << f.quadraticPart() << std::endl;
print(linearPart, "linearPart:"); //print(linearPart, "linearPart:");
std::cout << "linearPartNorm " << linearPartNorm << std::endl; //std::cout << "linearPartNorm " << linearPartNorm << std::endl;
print(origin, "origin:"); //print(origin, "origin:");
...@@ -115,11 +115,11 @@ class LocalBisectionSolver ...@@ -115,11 +115,11 @@ class LocalBisectionSolver
if (fv.scaling()<=0.0) { if (fv.scaling()<=0.0) {
alpha = 0.0; alpha = 0.0;
} /* else { } else {
LineSearchSolver lineSearch; LineSearchSolver lineSearch;
lineSearch(alpha, fv, false); lineSearch(alpha, fv, false);
}*/ }
/*
const auto& domain = fv.domain(); const auto& domain = fv.domain();
if (std::abs(domain[0]-domain[1])>safety) { if (std::abs(domain[0]-domain[1])>safety) {
int bisectionsteps = 0; int bisectionsteps = 0;
...@@ -128,15 +128,16 @@ class LocalBisectionSolver ...@@ -128,15 +128,16 @@ class LocalBisectionSolver
alpha = globalBisection.minimize(fv, 0.0, 0.0, bisectionsteps); alpha = globalBisection.minimize(fv, 0.0, 0.0, bisectionsteps);
} else { } else {
alpha = domain[0]; alpha = domain[0];
} }*/
std::cout << "alpha: " << alpha << std::endl; //std::cout << "alpha: " << alpha << std::endl;
linearPart *= alpha; 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 #ifdef NEW_TNNMG_COMPUTE_ITERATES_DIRECTLY
if (std::abs(alpha)> safety) { if (std::abs(alpha)> safety) {
x = origin; x = origin;
...@@ -145,14 +146,14 @@ class LocalBisectionSolver ...@@ -145,14 +146,14 @@ class LocalBisectionSolver
x = origin; x = origin;
} }
#else #else
std::cout << "use old" << std::endl; //std::cout << "use old" << std::endl;
if (std::abs(alpha)> safety) { if (std::abs(alpha)> safety) {
x = origin; x = origin;
x += linearPart; x += linearPart;
x -= old_x;//f.origin(); x -= f.origin();
} }
#endif #endif
std::cout << "new x: "<< x << std::endl << std::endl; //std::cout << "new x: "<< x << std::endl << std::endl;
} }
}; };
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment