diff options
author | Jaron Kent-Dobias <jaron@kent-dobias.com> | 2025-03-29 16:59:26 -0300 |
---|---|---|
committer | Jaron Kent-Dobias <jaron@kent-dobias.com> | 2025-03-29 16:59:26 -0300 |
commit | 0452aabf52993b4750471d585c085fdec85a822e (patch) | |
tree | 9fa3057d0a00434b582183c1e5b1bc11e501f88e | |
parent | bdf7b97b2e2d5efc4c2b5fee2868dfc33c891d16 (diff) | |
download | code-0452aabf52993b4750471d585c085fdec85a822e.tar.gz code-0452aabf52993b4750471d585c085fdec85a822e.tar.bz2 code-0452aabf52993b4750471d585c085fdec85a822e.zip |
Starting implementing persistence, but there is a serious problem with the third derivative right now.
-rw-r--r-- | Makefile | 2 | ||||
-rw-r--r-- | integrator.cpp | 29 |
2 files changed, 22 insertions, 9 deletions
@@ -1,6 +1,6 @@ all: walk correlations integrator -CC := clang++ -std=c++17 -Wno-mathematical-notation-identifier-extension -O3 -march=native -mtune=native +CC := clang++ -std=c++17 -Wno-mathematical-notation-identifier-extension -O3 -march=native -mtune=native -fopenmp walk: walk.cpp $(CC) walk.cpp -o walk diff --git a/integrator.cpp b/integrator.cpp index ea5c477..7d0ad1d 100644 --- a/integrator.cpp +++ b/integrator.cpp @@ -16,7 +16,7 @@ public: } }; -unsigned p = 3; +unsigned p = 2; Real f(Real q) { return 0.5 * pow(q, p); @@ -30,25 +30,38 @@ Real ddf(Real q) { return 0.5 * p * (p - 1) * pow(q, p - 2); } -Real integrate(const std::vector<Point>& Cₜ) { +Real integrate(const std::vector<Point>& Cₜ, double τ₀) { Real I = 0; +#pragma omp parallel for reduction(+:I) for (unsigned i = 0; i < Cₜ.size() - 1; i++) { unsigned j = Cₜ.size() - 1 - i; Real Δτ = Cₜ[i + 1].τ() - Cₜ[i].τ(); Real C = (Cₜ[j].C() + Cₜ[j - 1].C()) / 2; Real dC = (Cₜ[i + 1].C() - Cₜ[i].C()) / Δτ; - I += Δτ * df(C) * dC; + + Real dddC = 0; + if (i > 4 && i < Cₜ.size() && Cₜ.size() > 4) { + dddC += (Cₜ[j].C() - 3 * Cₜ[j+1].C() + 3 * Cₜ[j+2].C() - Cₜ[j+3].C()) / pow(Δτ, 3); + dddC += (Cₜ[j+1].C() - 3 * Cₜ[j+2].C() + 3 * Cₜ[j+3].C() - Cₜ[j+4].C()) / pow(Δτ, 3); + dddC /= 2; + } + I += Δτ * df(C) * (dC - pow(τ₀, 2) * dddC); } return I; } -Real energy(const std::vector<Point>& Ct) { +Real energy(const std::vector<Point>& Ct, Real τ₀) { Real I = 0; for (unsigned i = 0; i < Ct.size() - 1; i++) { Real Δτ = Ct[i + 1].τ() - Ct[i].τ(); Real C = (Ct[i].C() + Ct[i + 1].C()) / 2; Real dC = (Ct[i + 1].C() - Ct[i].C()) / Δτ; - I += Δτ * df(C) * dC; + + Real dddC = 0; + if (i > 1 && i < Ct.size() - 2 && Ct.size() > 3) { + dddC = (Ct[i+1].C() - 3 * Ct[i].C() + 3 * Ct[i-1].C() - Ct[i-2].C()) / pow(Δτ, 3); + } + I += Δτ * df(C) * (dC - pow(τ₀, 2) * dddC); } return I; } @@ -80,7 +93,7 @@ int main(int argc, char* argv[]) { } } - Real z = 0.5 + 0.0 * pow(y, 2); + Real z = (sqrt(1 + 2 * τ₀) - 1) / (2 * τ₀); std::vector<Point> Cₜ; Cₜ.reserve(τₘₐₓ / Δτ + 1); @@ -88,12 +101,12 @@ int main(int argc, char* argv[]) { Cₜ.push_back({0, 1}); while (Cₜ.back().τ() < τₘₐₓ) { - Real dC = -z * Cₜ.back().C() - 2 * pow(y, 2) * integrate(Cₜ); + Real dC = -z * Cₜ.back().C() - 2 * pow(y, 2) * integrate(Cₜ, τ₀); Cₜ.push_back({Cₜ.back().τ() + Δτ, Cₜ.back().C() + Δτ * dC}); std::cout << Cₜ.back().τ() << " " << Cₜ.back().C() << std::endl; } - std::cerr << - 2 * y * energy(Cₜ) << std::endl; + std::cerr << - 2 * y * energy(Cₜ, τ₀) << std::endl; return 0; } |