summaryrefslogtreecommitdiff
path: root/log-fourier_integrator.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'log-fourier_integrator.cpp')
-rw-r--r--log-fourier_integrator.cpp50
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ₜ₋₁;
Ĉₜ = Ĉₜ₋₁;