tasmet/src/gui/solver_worker.cpp

78 lines
1.5 KiB
C++

// solver_thread.cpp
//
// last-edit-by: J.A. de Jong
//
// Description:
//
//////////////////////////////////////////////////////////////////////
#include "solver_worker.h"
#include <functional>
#include "tasmet_tracer.h"
#include "system.pb.h"
#include <QThread>
#include <qcustomplot.h>
SolverWorker::SolverWorker(pb::System& sys):
_run(false),
_reltol(sys.solverparams().reltol()),
_funtol(sys.solverparams().funtol())
{
}
SolverWorker::~SolverWorker(){
TRACE(15,"~SolverWorker");
}
void SolverWorker::solver_stop() {
_run = false;
}
void SolverWorker::solver_start() {
TRACE(15,"SolverWorker::solver_start()");
using namespace std::placeholders; // for _1, _2 etc.
_run = true;
progress_callback callback = std::bind(&SolverWorker::pg_callback,
this,_1);
SolverProgress p;
// For testing purposes
SolverAction action;
while(true) {
TRACE(15,"Solver start virtual iteration");
SolverAction action = callback(p);
if(action != Continue) break;
sleep(1);
p.fun_err/=10;
p.rel_err/=10;
p.iteration++;
}
emit solver_stopped(_converged);
}
SolverAction SolverWorker::pg_callback(SolverProgress pg) {
TRACE(15,"pg_callback");
if(!_run) return Stop;
emit progress(pg);
if(pg.fun_err <= _funtol && pg.rel_err <= _reltol) {
_converged = true;
return Stop;
}
return Continue;
}
//////////////////////////////////////////////////////////////////////