tmp
This commit is contained in:
parent
bc8b09f693
commit
b17e7b529e
@ -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);
|
||||
|
@ -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))
|
||||
{
|
||||
|
@ -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 ¶m);
|
||||
|
||||
/**
|
||||
* @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
|
||||
|
Loading…
Reference in New Issue
Block a user