diff options
author | Jaron Kent-Dobias <jaron@kent-dobias.com> | 2025-05-08 17:32:18 -0300 |
---|---|---|
committer | Jaron Kent-Dobias <jaron@kent-dobias.com> | 2025-05-08 17:32:18 -0300 |
commit | e151b804071d69a41beef04a73c12c42b12bd775 (patch) | |
tree | 01d989abdc354ab28e9a4a551052039972d2cc42 /log_integrator.cpp | |
parent | 18c33edc2fdf6abc9f8f36ea67b256d4a885493a (diff) | |
download | code-e151b804071d69a41beef04a73c12c42b12bd775.tar.gz code-e151b804071d69a41beef04a73c12c42b12bd775.tar.bz2 code-e151b804071d69a41beef04a73c12c42b12bd775.zip |
Revert "Made log-Fourier padding symmetric, and began writing regular integrator"
This reverts commit 5fd9866479ec50051d2c9eeb4e217e9376e6f9b4.
Diffstat (limited to 'log_integrator.cpp')
-rw-r--r-- | log_integrator.cpp | 219 |
1 files changed, 0 insertions, 219 deletions
diff --git a/log_integrator.cpp b/log_integrator.cpp deleted file mode 100644 index a8d9778..0000000 --- a/log_integrator.cpp +++ /dev/null @@ -1,219 +0,0 @@ -#include "log-fourier.hpp" -#include "p-spin.hpp" -#include <getopt.h> -#include <iostream> - -int main(int argc, char* argv[]) { - /* Model parameters */ - unsigned p = 2; - unsigned s = 2; - Real λ = 0.5; - Real τ₀ = 0; - - /* Log-Fourier parameters */ - unsigned log2n = 8; - Real Δτ = 0.1; - Real k = 0.1; - - /* Iteration parameters */ - Real ε = 1e-14; - Real γ₀ = 1; - Real x = 0.5; - Real β₀ = 0; - Real βₘₐₓ = 0.7; - Real Δβ = 0.01; - bool loadData = false; - unsigned stepsToRespond = 1000; - unsigned pad = 4; - - int opt; - - while ((opt = getopt(argc, argv, "p:s:2:T:t:b:d:g:k:D:e:0:lS:x:P:")) != -1) { - switch (opt) { - case 'p': - p = atoi(optarg); - break; - case 's': - s = atoi(optarg); - break; - case '2': - log2n = atoi(optarg); - break; - case 't': - τ₀ = atof(optarg); - break; - case 'b': - βₘₐₓ = atof(optarg); - break; - case 'd': - Δβ = atof(optarg); - break; - case 'g': - γ₀ = atof(optarg); - break; - case 'k': - k = atof(optarg); - break; - case 'D': - Δτ = atof(optarg); - break; - case 'e': - ε = atof(optarg); - break; - case '0': - β₀ = atof(optarg); - break; - case 'x': - x = atof(optarg); - break; - case 'P': - pad = atoi(optarg); - break; - case 'l': - loadData = true; - break; - case 'S': - stepsToRespond = atoi(optarg); - break; - default: - exit(1); - } - } - - unsigned N = pow(2, log2n); - - LogarithmicFourierTransform fft(N, k, Δτ, pad); - - Real Γ₀ = 1; - Real μₜ₋₁ = Γ₀; - if (τ₀ > 0) { - μₜ₋₁ = (sqrt(1+4*Γ₀*τ₀)-1)/(2*τ₀); - } - - std::vector<Real> Cₜ₋₁(N); - std::vector<Real> Rₜ₋₁(N); - std::vector<Complex> Ĉₜ₋₁(N); - std::vector<Complex> Ȓₜ₋₁(N); - - if (!loadData) { - /* Start from the exact solution for β = 0 */ - for (unsigned n = 0; n < N; n++) { - if (τ₀ > 0) { - if (τ₀ == 2) { - Cₜ₋₁[n] = Γ₀ * exp(-fft.t(n) / 2) * (1 + fft.t(n) / 2); - } else { - Cₜ₋₁[n] = Γ₀ * (exp(-μₜ₋₁ * fft.t(n)) - μₜ₋₁ * τ₀ * exp(-fft.t(n) / τ₀)) / (μₜ₋₁ - pow(μₜ₋₁, 3) * pow(τ₀, 2)); - } - } else { - Cₜ₋₁[n] = Γ₀ * exp(-μₜ₋₁ * fft.t(n)) / μₜ₋₁; - } - Rₜ₋₁[n] = exp(-μₜ₋₁ * fft.t(n)); - - Ĉₜ₋₁[n] = 2 * Γ₀ / (pow(μₜ₋₁, 2) + pow(fft.ν(n), 2)) / (1 + pow(τ₀ * fft.ν(n), 2)); - Ȓₜ₋₁[n] = (Real)1.0 / (μₜ₋₁ + II * fft.ν(n)); - } - } else { - logFourierLoad(Cₜ₋₁, Rₜ₋₁, Ĉₜ₋₁, Ȓₜ₋₁, p, s, λ, τ₀, β₀, log2n, Δτ, k); - μₜ₋₁ = estimateZ(fft, Cₜ₋₁, Ĉₜ₋₁, Rₜ₋₁, Ȓₜ₋₁, p, s, λ, τ₀, β₀); - } - - std::vector<Real> Cₜ = Cₜ₋₁; - std::vector<Real> Rₜ = Rₜ₋₁; - std::vector<Complex> Ĉₜ = Ĉₜ₋₁; - std::vector<Complex> Ȓₜ = Ȓₜ₋₁; - Real μₜ = μₜ₋₁; - - Real β = β₀ + Δβ; - while (β < βₘₐₓ) { - Real γ = γ₀; - Real ΔCmin = 1000; - Real ΔCₜ = 100; - unsigned stepsUp = 0; - while (ΔCₜ > ε) { - std::vector<Real> RddfC(N); - std::vector<Real> dfC(N); - for (unsigned i = 0; i < N; i++) { - RddfC[i] = Rₜ[i] * ddf(λ, p, s, Cₜ[i]); - dfC[i] = df(λ, p, s, Cₜ[i]); - } - - std::vector<Real> dC(N); - std::vector<Real> dR(N); - - for (unsigned i = 0; i < N; i++) { - dC[i] += -μₜ * Cₜ[i]; - Real ΓR; - for (unsigned j = 0; j < N; j++) { - - } - } - - - std::vector<Complex> Ĉₜ₊₁(N); - std::vector<Complex> Ȓₜ₊₁(N); - for (unsigned n = 0; n < N; n++) { - Ȓₜ₊₁[n] = ((Real)1.0 + std::pow(β, 2) * RddfCt[n] * Ȓₜ[n]) / (μₜ + II * fft.ν(n)); - Ĉₜ₊₁[n] = (2 * Γ₀ * std::conj(Ȓₜ[n]) / (1 + std::pow(τ₀ * fft.ν(n), 2)) + std::pow(β, 2) * (RddfCt[n] * Ĉₜ[n] + dfCt[n] * std::conj(Ȓₜ[n]))) / (μₜ + II * fft.ν(n)); - } - std::vector<Real> Rₜ₊₁ = fft.inverse(Ȓₜ₊₁); - std::vector<Real> Cₜ₊₁ = fft.inverse(Ĉₜ₊₁); - - μₜ *= pow(tanh(Cₜ₊₁[0]-1)+1, x); - - ΔCₜ = 0; - for (unsigned i = 0; i < N; i++) { - ΔCₜ += std::norm(Cₜ[i] - Cₜ₊₁[i]); - ΔCₜ += std::norm(Rₜ[i] - Rₜ₊₁[i]); - } - ΔCₜ = sqrt(ΔCₜ) / (2*N); - - if (ΔCₜ < 0.9 * ΔCmin) { - ΔCmin = ΔCₜ; - stepsUp = 0; - } else { - stepsUp++; - } - - if (stepsUp > stepsToRespond) { - γ = std::max(γ/2, (Real)1e-4); - stepsUp = 0; - ΔCmin = ΔCₜ; - } - - for (unsigned i = 0; i < N; i++) { - Cₜ[i] += γ * (Cₜ₊₁[i] - Cₜ[i]); - Rₜ[i] += γ * (Rₜ₊₁[i] - Rₜ[i]); - Ĉₜ[i] += γ * (Ĉₜ₊₁[i] - Ĉₜ[i]); - Ȓₜ[i] += γ * (Ȓₜ₊₁[i] - Ȓₜ[i]); - } - - std::cerr << "\x1b[2K" << "\r"; - std::cerr << β << " " << μₜ << " " << ΔCₜ << " " << γ << " " << Cₜ[0]; - } - - if (std::isnan(Cₜ[0])) { - γ₀ /= 2; - Cₜ = Cₜ₋₁; - Rₜ = Rₜ₋₁; - Ĉₜ = Ĉₜ₋₁; - Ȓₜ = Ȓₜ₋₁; - μₜ = μₜ₋₁; - } else { - Real E = energy(fft, Cₜ, Rₜ, p, s, λ, β); - - std::cerr << "\x1b[2K" << "\r"; - std::cerr << β << " " << μₜ << " " << Ĉₜ[0].real() << " " << E << " " << γ << std::endl; - - logFourierSave(Cₜ, Rₜ, Ĉₜ, Ȓₜ, p, s, λ, τ₀, β, log2n, Δτ, k); - - β += Δβ; - Cₜ₋₁ = Cₜ; - Rₜ₋₁ = Rₜ; - Ĉₜ₋₁ = Ĉₜ; - Ȓₜ₋₁ = Ȓₜ; - μₜ₋₁ = μₜ; - } - } - - return 0; -} |