diff options
author | Jaron Kent-Dobias <jaron@kent-dobias.com> | 2025-05-14 09:31:27 -0300 |
---|---|---|
committer | Jaron Kent-Dobias <jaron@kent-dobias.com> | 2025-05-14 09:31:27 -0300 |
commit | c55d6dd50157621e448c7e2596fb15676c958cb9 (patch) | |
tree | bbbda8e71447cea883289b9e9ea223e3d026bf24 | |
parent | 34771600a168bc12d66986d62e60e77c11a161fe (diff) | |
download | code-c55d6dd50157621e448c7e2596fb15676c958cb9.tar.gz code-c55d6dd50157621e448c7e2596fb15676c958cb9.tar.bz2 code-c55d6dd50157621e448c7e2596fb15676c958cb9.zip |
Stop adjusting γ, and stop smoothing C and R during the iteration
-rw-r--r-- | log-fourier_integrator.cpp | 92 |
1 files changed, 13 insertions, 79 deletions
diff --git a/log-fourier_integrator.cpp b/log-fourier_integrator.cpp index f02aebc..2f80f4c 100644 --- a/log-fourier_integrator.cpp +++ b/log-fourier_integrator.cpp @@ -17,18 +17,17 @@ int main(int argc, char* argv[]) { /* Iteration parameters */ Real ε = 1e-15; - Real γ₀ = 1; + Real γ = 1; Real x = 1; Real β₀ = 0; Real βₘₐₓ = 20; Real Δβ = 0.01; bool loadData = false; - unsigned stepsToRespond = 1e7; unsigned pad = 2; int opt; - while ((opt = getopt(argc, argv, "p:s:2:T:t:b:d:g:k:D:e:0:lS:x:P:h:")) != -1) { + while ((opt = getopt(argc, argv, "p:s:2:T:t:b:d:k:D:e:0:lg:x:P:h:")) != -1) { switch (opt) { case 'p': p = atoi(optarg); @@ -49,7 +48,7 @@ int main(int argc, char* argv[]) { Δβ = atof(optarg); break; case 'g': - γ₀ = atof(optarg); + γ = atof(optarg); break; case 'k': k = atof(optarg); @@ -75,9 +74,6 @@ int main(int argc, char* argv[]) { case 'l': loadData = true; break; - case 'S': - stepsToRespond = atoi(optarg); - break; default: exit(1); } @@ -129,10 +125,7 @@ int main(int argc, char* argv[]) { Real β = β₀ + Δβ; while (β < βₘₐₓ) { - Real γ = γ₀; - Real ΔCmin = 1000; Real ΔCₜ = 100; - unsigned stepsUp = 0; while (ΔCₜ > ε) { auto [RddfCt, dfCt] = RddfCtdfCt(fft, Cₜ, Rₜ, p, s, λ); @@ -160,77 +153,19 @@ int main(int argc, char* argv[]) { } } - for (unsigned n = 0; n < N; n++) { - Ȓₜ₊₁[n] = ((Real)1.0 + std::pow(β, 2) * RddfCt[n] * Ȓₜ[n]) / (μₜ + II * fft.ν(n)); - } - std::vector<Real> Cₜ₊₁ = fft.inverse(Ĉₜ₊₁); - std::vector<Real> Rₜ₊₁ = fft.inverse(Ȓₜ₊₁); - - if (!std::isnan(Cₜ₊₁[0])) { - - bool trigger0 = false; - bool trigger1 = false; - for (unsigned i = 0; i < N; i++) { - if (Rₜ₊₁[i] < ε || trigger0) { - Rₜ₊₁[i] = 0; - trigger0 = true; - } - } - - - Real Rmax = 0; - for (unsigned i = 0; i < N; i++) { - if (Rₜ₊₁[N-1-i] > Rmax) Rmax = Rₜ₊₁[N-1-i]; - Rₜ₊₁[N-1-i] = Rmax; - } - - trigger0 = false; - trigger1 = false; - for (unsigned i = 0; i < N; i++) { - if (Cₜ₊₁[i] < ε || trigger0) { - Cₜ₊₁[i] = 0; - trigger0 = true; - } - if (Cₜ₊₁[N-1-i] > 1 - ε || trigger1) { - Cₜ₊₁[N-1-i] = 1; - trigger1 = true; - } - } - trigger0 = false; - trigger1 = false; - for (unsigned i = 0; i < N; i++) { - if (Rₜ₊₁[N-1-i] > 1 - ε || trigger1) { - Rₜ₊₁[N-1-i] = 1; - trigger1 = true; - } - } - - Real Cmax = 0; - for (unsigned i = 0; i < N; i++) { - if (Cₜ₊₁[N-1-i] > Cmax) Cmax = Cₜ₊₁[N-1-i]; - Cₜ₊₁[N-1-i] = Cmax; - } - } - ΔCₜ = 0; - for (unsigned i = 0; i < N; i++) { - ΔCₜ += std::norm(Cₜ[i] - Cₜ₊₁[i]); - ΔCₜ += std::norm(Rₜ[i] - Rₜ₊₁[i]); + for (unsigned n = 0; n < N; n++) { + ΔCₜ += std::norm((2 * Γ₀ * std::conj(Ȓₜ[n]) / (1 + std::pow(τ₀ * fft.ν(n), 2)) + std::pow(β, 2) * (RddfCt[n] * Ĉₜ[n] + dfCt[n] * std::conj(Ȓₜ[n]))) - Ĉₜ[n] * (μₜ + II * fft.ν(n))); + ΔCₜ += std::norm(((Real)1.0 + std::pow(β, 2) * RddfCt[n] * Ȓₜ[n]) - Ȓₜ[n] * (μₜ + II * fft.ν(n))); } ΔCₜ = sqrt(ΔCₜ) / (2*N); - if (ΔCₜ < 0.9 * ΔCmin) { - ΔCmin = ΔCₜ; - stepsUp = 0; - } else { - stepsUp++; + for (unsigned n = 0; n < N; n++) { + Ȓₜ₊₁[n] = ((Real)1.0 + std::pow(β, 2) * RddfCt[n] * Ȓₜ[n]) / (μₜ + II * fft.ν(n)); } - if (stepsUp > stepsToRespond) { - γ = std::max(γ/2, (Real)1e-4); - stepsUp = 0; - ΔCmin = ΔCₜ; - } + std::vector<Real> Cₜ₊₁ = fft.inverse(Ĉₜ₊₁); + std::vector<Real> Rₜ₊₁ = fft.inverse(Ȓₜ₊₁); for (unsigned i = 0; i < N; i++) { Cₜ[i] += γ * (Cₜ₊₁[i] - Cₜ[i]); @@ -240,11 +175,10 @@ int main(int argc, char* argv[]) { } std::cerr << "\x1b[2K" << "\r"; - std::cerr << β << " " << μₜ << " " << ΔCₜ << " " << γ << " " << C₀; + std::cerr << β << " " << μₜ << " " << ΔCₜ; } if (std::isnan(Cₜ[0])) { - γ₀ /= 2; Cₜ = Cₜ₋₁; Rₜ = Rₜ₋₁; Ĉₜ = Ĉₜ₋₁; @@ -254,11 +188,11 @@ int main(int argc, char* argv[]) { Real E = energy(fft, Cₜ, Rₜ, p, s, λ, β); std::cerr << "\x1b[2K" << "\r"; - std::cerr << β << " " << μₜ << " " << Ĉₜ[0].real() << " " << E << " " << γ << std::endl; + std::cerr << β << " " << μₜ << " " << Ĉₜ[0].real() << " " << E << std::endl; logFourierSave(Cₜ, Rₜ, Ĉₜ, Ȓₜ, p, s, λ, τ₀, β, log2n, Δτ, logShift); - if (Ĉₜ[0].real() / Ĉₜ₋₁[0].real() > 1.5) { + if (Ĉₜ[0].real() / Ĉₜ₋₁[0].real() > 1.25) { Δβ *= 0.1; } |