This commit is contained in:
张壹 2025-02-24 23:58:35 +08:00
parent bc8b09f693
commit b17e7b529e
3 changed files with 41 additions and 2 deletions

View File

@ -125,6 +125,8 @@ int main(int argc, char const *argv[])
test.LCG_Minimize(m, B, gctl::LCG_CG, ofile);
ofile << "maximal difference: " << max_diff(fm, m) << std::endl;
test.save_convergence("convergence");
m.assign(0.0);
test.LCG_Minimize(m, B, gctl::LCG_PCG, ofile);

View File

@ -93,6 +93,19 @@ void gctl::lcg_solver::set_lcg_para(const lcg_para &in_param)
return;
}
void gctl::lcg_solver::save_convergence(std::string filename)
{
std::ofstream ofs;
open_outfile(ofs, filename, ".txt");
for (size_t i = 0; i < rcd.size(); ++i)
{
ofs << i << " " << rcd[i] << std::endl;
}
ofs.close();
return;
}
gctl::lcg_para gctl::lcg_solver::default_lcg_para()
{
lcg_para dp = lcg_defparam;
@ -345,6 +358,7 @@ void gctl::lcg_solver::lcg(array<double> &m, const array<double> &B, std::ostrea
gk.resize(n_size);
dk.resize(n_size);
Adk.resize(n_size);
if (!rcd.empty()) rcd.clear();
LCG_Ax(m, Adk);
@ -361,6 +375,7 @@ void gctl::lcg_solver::lcg(array<double> &m, const array<double> &B, std::ostrea
{
if (lcg_param_.abs_diff) residual = sqrt(gk_mod)/n_size;
else residual = gk_mod/g0_mod;
rcd.push_back(residual);
if (LCG_Progress(m, residual, lcg_param_, t, ss))
{
@ -415,6 +430,7 @@ void gctl::lcg_solver::lpcg(array<double> &m, const array<double> &B, std::ostre
// locate memory
rk.resize(n_size); zk.resize(n_size);
dk.resize(n_size); Adk.resize(n_size);
if (!rcd.empty()) rcd.clear();
LCG_Ax(m, Adk);
@ -436,6 +452,7 @@ void gctl::lcg_solver::lpcg(array<double> &m, const array<double> &B, std::ostre
{
if (lcg_param_.abs_diff) residual = sqrt(rk_mod)/n_size;
else residual = rk_mod/r0_mod;
rcd.push_back(residual);
if (LCG_Progress(m, residual, lcg_param_, t, ss))
{
@ -499,6 +516,7 @@ void gctl::lcg_solver::lcgs(array<double> &m, const array<double> &B, std::ostre
uk.resize(n_size);
qk.resize(n_size);
wk.resize(n_size);
if (!rcd.empty()) rcd.clear();
LCG_Ax(m, Apx);
@ -520,6 +538,7 @@ void gctl::lcg_solver::lcgs(array<double> &m, const array<double> &B, std::ostre
{
if (lcg_param_.abs_diff) residual = sqrt(rk_mod)/n_size;
else residual = rk_mod/r0_mod;
rcd.push_back(residual);
if (LCG_Progress(m, residual, lcg_param_, t, ss))
{
@ -584,6 +603,7 @@ void gctl::lcg_solver::lbicgstab(array<double> &m, const array<double> &B, std::
pk.resize(n_size); Adk.resize(n_size);
sk.resize(n_size); Apx.resize(n_size);
yk.resize(n_size);
if (!rcd.empty()) rcd.clear();
LCG_Ax(m, Adk);
@ -602,6 +622,7 @@ void gctl::lcg_solver::lbicgstab(array<double> &m, const array<double> &B, std::
{
if (lcg_param_.abs_diff) residual = sqrt(rk_mod)/n_size;
else residual = rk_mod/r0_mod;
rcd.push_back(residual);
if (LCG_Progress(m, residual, lcg_param_, t, ss))
{
@ -669,6 +690,7 @@ void gctl::lcg_solver::lbicgstab2(array<double> &m, const array<double> &B, std:
pk.resize(n_size); Adk.resize(n_size);
sk.resize(n_size); Apx.resize(n_size);
yk.resize(n_size);
if (!rcd.empty()) rcd.clear();
LCG_Ax(m, Adk);
@ -688,6 +710,7 @@ void gctl::lcg_solver::lbicgstab2(array<double> &m, const array<double> &B, std:
{
if (lcg_param_.abs_diff) residual = sqrt(rk_mod)/n_size;
else residual = rk_mod/r0_mod;
rcd.push_back(residual);
if (LCG_Progress(m, residual, lcg_param_, t, ss))
{
@ -804,6 +827,8 @@ void gctl::lcg_solver::lpg(array<double> &m, const array<double> &B,
gk_new.resize(n_size);
sk.resize(n_size);
yk.resize(n_size);
if (!rcd.empty()) rcd.clear();
double alpha_k = lcg_param_.step;
vectop(m, hig);
@ -823,6 +848,7 @@ void gctl::lcg_solver::lpg(array<double> &m, const array<double> &B,
{
if (lcg_param_.abs_diff) residual = sqrt(gk_mod)/n_size;
else residual = gk_mod/g0_mod;
rcd.push_back(residual);
if (LCG_Progress(m, residual, lcg_param_, t, ss))
{
@ -889,6 +915,8 @@ void gctl::lcg_solver::lspg(array<double> &m, const array<double> &B,
yk.resize(n_size);
dk.resize(n_size);
qk_m.resize(lcg_param_.maxi_m);
if (!rcd.empty()) rcd.clear();
double lambda_k = lcg_param_.step;
double qk = 0;
@ -923,6 +951,7 @@ void gctl::lcg_solver::lspg(array<double> &m, const array<double> &B,
{
if (lcg_param_.abs_diff) residual = sqrt(gk_mod)/n_size;
else residual = gk_mod/g0_mod;
rcd.push_back(residual);
if (LCG_Progress(m, residual, lcg_param_, t, ss))
{

View File

@ -28,7 +28,7 @@
#ifndef _GCTL_LCG_H
#define _GCTL_LCG_H
#include "iostream"
#include <iostream>
#include "gctl_optimization_config.h"
#ifdef GCTL_OPTIMIZATION_TOML
@ -40,7 +40,7 @@
#endif // _WINDOWS || __WIN32__
#include "gctl/utility/stream_t.h"
#include "gctl/core/array.h"
#include "gctl/utility/stream.h"
#include "gctl/maths/linear_algebra.h"
namespace gctl
@ -201,6 +201,7 @@ namespace gctl
array<double> Apx, uk, qk, qk_m, wk;
array<double> m_new, gk_new;
array<double> sk, yk;
std::vector<double> rcd;
/**
* @brief Display info of a given return code. This is a private function
@ -266,6 +267,13 @@ namespace gctl
* @param param Input lcg parameters.
*/
void set_lcg_para(const lcg_para &param);
/**
* @brief Save the convergence history to a file.
*
* @param filename Filename of the output file.
*/
void save_convergence(std::string filename);
/**
* @brief Return a lcg_para object with default values