diff options
Diffstat (limited to 'log-fourier_integrator.cpp')
-rw-r--r-- | log-fourier_integrator.cpp | 50 |
1 files changed, 38 insertions, 12 deletions
diff --git a/log-fourier_integrator.cpp b/log-fourier_integrator.cpp index 5544f18..3e05a08 100644 --- a/log-fourier_integrator.cpp +++ b/log-fourier_integrator.cpp @@ -16,15 +16,16 @@ int main(int argc, char* argv[]) { /* Iteration parameters */ Real ε = 1e-14; - Real γ = 1; + Real γ₀ = 1; Real β₀ = 0; Real βₘₐₓ = 0.7; Real Δβ = 0.01; bool loadData = false; + unsigned stepsToRespond = 1000; int opt; - while ((opt = getopt(argc, argv, "p:s:2:T:t:b:d:g:k:D:e:0:l")) != -1) { + while ((opt = getopt(argc, argv, "p:s:2:T:t:b:d:g:k:D:e:0:lS:")) != -1) { switch (opt) { case 'p': p = atoi(optarg); @@ -45,7 +46,7 @@ int main(int argc, char* argv[]) { Δβ = atof(optarg); break; case 'g': - γ = atof(optarg); + γ₀ = atof(optarg); break; case 'k': k = atof(optarg); @@ -62,6 +63,9 @@ int main(int argc, char* argv[]) { case 'l': loadData = true; break; + case 'S': + stepsToRespond = atoi(optarg); + break; default: exit(1); } @@ -112,8 +116,12 @@ int main(int argc, char* argv[]) { Real β = β₀ + Δβ; while (β < βₘₐₓ) { - Real ΔC = 100; - while (ΔC > ε) { + Real γ = γ₀; + Real ΔCmin = 1000; + Real ΔCₜ = 100; + unsigned stepsDown = 0; + unsigned stepsUp = 0; + while (ΔCₜ > ε) { auto [RddfCt, dfCt] = RddfCtdfCt(fft, Cₜ, Rₜ, p, s, λ); std::vector<Complex> Ĉₜ₊₁(N); @@ -127,12 +135,31 @@ int main(int argc, char* argv[]) { μₜ *= pow(tanh(Cₜ₊₁[0]-1)+1, 0.05); - ΔC = 0; + ΔCₜ = 0; for (unsigned i = 0; i < N; i++) { - ΔC += std::norm(Ĉₜ[i] - Ĉₜ₊₁[i]); - ΔC += std::norm(Ȓₜ[i] - Ȓₜ₊₁[i]); + ΔCₜ += std::norm(Ĉₜ[i] - Ĉₜ₊₁[i]); + ΔCₜ += std::norm(Ȓₜ[i] - Ȓₜ₊₁[i]); + } + ΔCₜ = sqrt(ΔCₜ) / (2*N); + + if (ΔCₜ < ΔCmin) { + ΔCmin = ΔCₜ; + stepsUp = 0; + stepsDown++; + } else { + stepsDown = 0; + stepsUp++; + } + + if (stepsUp > stepsToRespond) { + γ = std::max(γ/2, 1e-4); + stepsUp = 0; + } + + if (stepsDown > stepsToRespond) { + γ = std::min(2*γ, 1.0); + stepsDown = 0; } - ΔC = sqrt(ΔC) / (2*N); for (unsigned i = 0; i < N; i++) { Cₜ[i] += γ * (Cₜ₊₁[i] - Cₜ[i]); @@ -142,12 +169,11 @@ int main(int argc, char* argv[]) { } std::cerr << "\x1b[2K" << "\r"; - std::cerr << β << " " << μₜ << " " << ΔC << " " << γ << " " << Cₜ[0]; + std::cerr << β << " " << μₜ << " " << ΔCₜ << " " << γ << " " << Cₜ[0]; } if (std::isnan(Cₜ[0])) { - Δβ /= 2; - β -= Δβ; + γ₀ /= 2; Cₜ = Cₜ₋₁; Rₜ = Rₜ₋₁; Ĉₜ = Ĉₜ₋₁; |