summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJaron Kent-Dobias <jaron@kent-dobias.com>2025-03-29 16:59:26 -0300
committerJaron Kent-Dobias <jaron@kent-dobias.com>2025-03-29 16:59:26 -0300
commit0452aabf52993b4750471d585c085fdec85a822e (patch)
tree9fa3057d0a00434b582183c1e5b1bc11e501f88e
parentbdf7b97b2e2d5efc4c2b5fee2868dfc33c891d16 (diff)
downloadcode-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--Makefile2
-rw-r--r--integrator.cpp29
2 files changed, 22 insertions, 9 deletions
diff --git a/Makefile b/Makefile
index 6b77cca..25e23dd 100644
--- a/Makefile
+++ b/Makefile
@@ -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;
}