Solver works in GUI.
This commit is contained in:
parent
e0018a6da4
commit
317cf07ee2
@ -141,8 +141,8 @@ void AddDuctDialog::accept(){
|
|||||||
|
|
||||||
try {
|
try {
|
||||||
// If duct can be built without exceptions, everything is OK
|
// If duct can be built without exceptions, everything is OK
|
||||||
TaSystem sys(TaSystem::testSystem());
|
std::unique_ptr<TaSystem> sys(TaSystem::testSystem());
|
||||||
Duct duct (sys,0,_duct);
|
Duct duct (*sys,0,_duct);
|
||||||
}
|
}
|
||||||
catch(TaSMETError& e) {
|
catch(TaSMETError& e) {
|
||||||
|
|
||||||
@ -220,10 +220,10 @@ void AddDuctDialog::changed(){
|
|||||||
|
|
||||||
PreviewShow pshow = (PreviewShow) _dialog->previewshow->currentIndex();
|
PreviewShow pshow = (PreviewShow) _dialog->previewshow->currentIndex();
|
||||||
|
|
||||||
TaSystem sys = TaSystem::testSystem();
|
std::unique_ptr<TaSystem> sys(TaSystem::testSystem());
|
||||||
std::unique_ptr<Duct> duct;
|
std::unique_ptr<Duct> duct;
|
||||||
try {
|
try {
|
||||||
duct = std::unique_ptr<Duct>(new Duct(sys,0,_duct));
|
duct = std::unique_ptr<Duct>(new Duct(*sys,0,_duct));
|
||||||
}
|
}
|
||||||
catch(TaSMETError& e) {
|
catch(TaSMETError& e) {
|
||||||
return;
|
return;
|
||||||
|
@ -417,14 +417,43 @@ void TaSMETMainWindow::on_actionSolve_triggered() {
|
|||||||
TRACE(15,"actionSolve()");
|
TRACE(15,"actionSolve()");
|
||||||
|
|
||||||
SolverDialog *d;
|
SolverDialog *d;
|
||||||
|
|
||||||
|
std::unique_ptr<TaSystem> sys;
|
||||||
try {
|
try {
|
||||||
d = new SolverDialog(this,_system,*_model.mutable_sparams());
|
sys = std::unique_ptr<TaSystem>(new TaSystem(_model.system()));
|
||||||
|
|
||||||
|
if(_model.solution_size()>0) {
|
||||||
|
vd solution(_model.solution_size());
|
||||||
|
for(us i=0;i<_model.solution_size();i++) {
|
||||||
|
solution(i) = _model.solution(i);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Throws in case the solution size does not match.
|
||||||
|
try {
|
||||||
|
sys->updateSolution(solution);
|
||||||
|
}
|
||||||
|
catch(...) {}
|
||||||
|
}
|
||||||
|
d = new SolverDialog(this,*sys.get(),*_model.mutable_sparams());
|
||||||
}
|
}
|
||||||
|
|
||||||
catch(TaSMETError &e) {
|
catch(TaSMETError &e) {
|
||||||
e.show_user("Solver failed to initialize");
|
e.show_user("Solver failed to initialize");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
d->exec();
|
|
||||||
|
if(d->exec()) {
|
||||||
|
|
||||||
|
// On succes, we copy the solution to the model
|
||||||
|
const vd& sol = d->getSolution();
|
||||||
|
|
||||||
|
// Clear old solution
|
||||||
|
_model.clear_solution();
|
||||||
|
for(us i=0;i<sol.size();i++) {
|
||||||
|
_model.add_solution(sol(i));
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
// Solution is put in system, system updated from solver
|
// Solution is put in system, system updated from solver
|
||||||
// dialog. Therefore we are now probably dirty
|
// dialog. Therefore we are now probably dirty
|
||||||
@ -432,6 +461,28 @@ void TaSMETMainWindow::on_actionSolve_triggered() {
|
|||||||
|
|
||||||
delete d;
|
delete d;
|
||||||
}
|
}
|
||||||
|
void TaSMETMainWindow::on_actionPostprocess_model_triggered() {
|
||||||
|
|
||||||
|
try {
|
||||||
|
TaSystem sys(_model.system());
|
||||||
|
if(_model.solution_size() == 0)
|
||||||
|
throw TaSMETError("No solution found");
|
||||||
|
vd sol(_model.solution_size());
|
||||||
|
for(us i=0;i<sol.size();i++) {
|
||||||
|
sol(i) = _model.solution(i);
|
||||||
|
}
|
||||||
|
sys.updateSolution(sol);
|
||||||
|
|
||||||
|
if(_filepath.size() == 0)
|
||||||
|
throw TaSMETError("Model has not yet been saved");
|
||||||
|
sys.exportHDF5(_filepath + ".h5");
|
||||||
|
|
||||||
|
}
|
||||||
|
catch(TaSMETError &e) {
|
||||||
|
e.show_user("Postprocessing failed");
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
bool TaSMETMainWindow::isDirty() const {
|
bool TaSMETMainWindow::isDirty() const {
|
||||||
TRACE(15,"isDirty()");
|
TRACE(15,"isDirty()");
|
||||||
if(_filepath.size()==0) return true;
|
if(_filepath.size()==0) return true;
|
||||||
@ -452,5 +503,10 @@ void TaSMETMainWindow::on_actionAbout_triggered(){
|
|||||||
|
|
||||||
AboutDialog(this).exec();
|
AboutDialog(this).exec();
|
||||||
}
|
}
|
||||||
|
void TaSMETMainWindow::on_actionReinitialize_solution_triggered() {
|
||||||
|
|
||||||
|
_model.clear_solution();
|
||||||
|
changed();
|
||||||
|
}
|
||||||
|
|
||||||
//////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////
|
||||||
|
@ -98,6 +98,9 @@ private slots:
|
|||||||
void on_actionAbout_triggered(); // Show about dialog
|
void on_actionAbout_triggered(); // Show about dialog
|
||||||
void on_actionSolve_triggered(); // Solve the system
|
void on_actionSolve_triggered(); // Solve the system
|
||||||
|
|
||||||
|
void on_actionReinitialize_solution_triggered();
|
||||||
|
void on_actionPostprocess_model_triggered();
|
||||||
|
|
||||||
void on_nf_valueChanged(int) {changed();}
|
void on_nf_valueChanged(int) {changed();}
|
||||||
void on_freq_textEdited() {changed();}
|
void on_freq_textEdited() {changed();}
|
||||||
void on_gastype_currentIndexChanged(int) {changed();}
|
void on_gastype_currentIndexChanged(int) {changed();}
|
||||||
|
@ -64,7 +64,7 @@
|
|||||||
<item row="5" column="0">
|
<item row="5" column="0">
|
||||||
<widget class="QLabel" name="label_7">
|
<widget class="QLabel" name="label_7">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>&System type:</string>
|
<string>S&ystem type:</string>
|
||||||
</property>
|
</property>
|
||||||
<property name="buddy">
|
<property name="buddy">
|
||||||
<cstring>systemtype</cstring>
|
<cstring>systemtype</cstring>
|
||||||
@ -151,7 +151,7 @@
|
|||||||
<item row="1" column="0">
|
<item row="1" column="0">
|
||||||
<widget class="QLabel" name="label_4">
|
<widget class="QLabel" name="label_4">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>&Fundamental frequency: </string>
|
<string>F&undamental frequency: </string>
|
||||||
</property>
|
</property>
|
||||||
<property name="buddy">
|
<property name="buddy">
|
||||||
<cstring>freq</cstring>
|
<cstring>freq</cstring>
|
||||||
@ -348,7 +348,7 @@
|
|||||||
<x>0</x>
|
<x>0</x>
|
||||||
<y>0</y>
|
<y>0</y>
|
||||||
<width>683</width>
|
<width>683</width>
|
||||||
<height>21</height>
|
<height>18</height>
|
||||||
</rect>
|
</rect>
|
||||||
</property>
|
</property>
|
||||||
<widget class="QMenu" name="menuFile">
|
<widget class="QMenu" name="menuFile">
|
||||||
@ -372,11 +372,11 @@
|
|||||||
</widget>
|
</widget>
|
||||||
<widget class="QMenu" name="menuSolver">
|
<widget class="QMenu" name="menuSolver">
|
||||||
<property name="title">
|
<property name="title">
|
||||||
<string>Solver</string>
|
<string>So&lver</string>
|
||||||
</property>
|
</property>
|
||||||
<addaction name="actionSolve"/>
|
<addaction name="actionSolve"/>
|
||||||
<addaction name="actionReinitialize_solver"/>
|
<addaction name="actionReinitialize_solution"/>
|
||||||
<addaction name="actionPosprocess_model"/>
|
<addaction name="actionPostprocess_model"/>
|
||||||
</widget>
|
</widget>
|
||||||
<addaction name="menuFile"/>
|
<addaction name="menuFile"/>
|
||||||
<addaction name="menuSolver"/>
|
<addaction name="menuSolver"/>
|
||||||
@ -446,17 +446,17 @@
|
|||||||
</action>
|
</action>
|
||||||
<action name="actionSolve">
|
<action name="actionSolve">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>Solve...</string>
|
<string>&Solve...</string>
|
||||||
</property>
|
</property>
|
||||||
</action>
|
</action>
|
||||||
<action name="actionReinitialize_solver">
|
<action name="actionReinitialize_solution">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>Reinitialize solver</string>
|
<string>&Reinitialize solution</string>
|
||||||
</property>
|
</property>
|
||||||
</action>
|
</action>
|
||||||
<action name="actionPosprocess_model">
|
<action name="actionPostprocess_model">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>Posprocess model...</string>
|
<string>Create postprocessing file</string>
|
||||||
</property>
|
</property>
|
||||||
</action>
|
</action>
|
||||||
</widget>
|
</widget>
|
||||||
|
@ -22,7 +22,7 @@
|
|||||||
#include <qcustomplot.h>
|
#include <qcustomplot.h>
|
||||||
|
|
||||||
SolverDialog::SolverDialog(QWidget* parent,
|
SolverDialog::SolverDialog(QWidget* parent,
|
||||||
pb::System& sys,
|
const GradientNonlinearSystem& sys,
|
||||||
pb::SolverParams& sparams):
|
pb::SolverParams& sparams):
|
||||||
QDialog(parent),
|
QDialog(parent),
|
||||||
_sys(sys),
|
_sys(sys),
|
||||||
@ -125,8 +125,13 @@ void SolverDialog::solver_progress(const SolverProgress& progress){
|
|||||||
|
|
||||||
TRACE(15,"SolverDialog::solver_progress()");
|
TRACE(15,"SolverDialog::solver_progress()");
|
||||||
|
|
||||||
// VARTRACE(15,progress.fun_err);
|
if(progress.error) {
|
||||||
// VARTRACE(15,progress.iteration);
|
QMessageBox::warning(this,
|
||||||
|
"Solver error",
|
||||||
|
QString::fromStdString(progress.err_msg));
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
d funtol = _sparams.funtol();
|
d funtol = _sparams.funtol();
|
||||||
d reltol = _sparams.reltol();
|
d reltol = _sparams.reltol();
|
||||||
|
|
||||||
@ -159,17 +164,18 @@ void SolverDialog::on_solve_clicked() {
|
|||||||
_funtol->setData(empty,empty);
|
_funtol->setData(empty,empty);
|
||||||
_reltol->setData(empty,empty);
|
_reltol->setData(empty,empty);
|
||||||
|
|
||||||
|
|
||||||
assert(!_solver_worker);
|
assert(!_solver_worker);
|
||||||
|
|
||||||
qRegisterMetaType<SolverProgress>();
|
qRegisterMetaType<SolverProgress>();
|
||||||
|
|
||||||
_solver_worker = new SolverWorker(_sys,_sparams);
|
_solver_worker = new SolverWorker(_sys,_sparams);
|
||||||
|
|
||||||
QThread* thread = new QThread;
|
QThread* thread = new QThread;
|
||||||
|
if(!_solver_worker || !thread) throw TaSMETBadAlloc();
|
||||||
|
|
||||||
|
// Move the _solver_worker to its own thread
|
||||||
_solver_worker->moveToThread(thread);
|
_solver_worker->moveToThread(thread);
|
||||||
|
|
||||||
|
|
||||||
connect(thread, &QThread::started,
|
connect(thread, &QThread::started,
|
||||||
_solver_worker, &SolverWorker::solver_start);
|
_solver_worker, &SolverWorker::solver_start);
|
||||||
|
|
||||||
@ -192,12 +198,9 @@ void SolverDialog::on_solve_clicked() {
|
|||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
void SolverDialog::on_singleiteration_clicked() {
|
|
||||||
|
|
||||||
}
|
|
||||||
void SolverDialog::setEnabled(bool enabled){
|
void SolverDialog::setEnabled(bool enabled){
|
||||||
_dialog->solve->setEnabled(enabled);
|
_dialog->solve->setEnabled(enabled);
|
||||||
_dialog->singleiteration->setEnabled(enabled);
|
|
||||||
_dialog->stop->setEnabled(!enabled);
|
_dialog->stop->setEnabled(!enabled);
|
||||||
|
|
||||||
_dialog->solvertype->setEnabled(enabled);
|
_dialog->solvertype->setEnabled(enabled);
|
||||||
@ -210,6 +213,9 @@ void SolverDialog::solver_stopped(bool converged) {
|
|||||||
// stop the solver and delete it
|
// stop the solver and delete it
|
||||||
if(_solver_worker!=nullptr) {
|
if(_solver_worker!=nullptr) {
|
||||||
_solver_worker->solver_stop();
|
_solver_worker->solver_stop();
|
||||||
|
if(converged) {
|
||||||
|
_solution = _solver_worker->getSolution();
|
||||||
|
}
|
||||||
_solver_worker = nullptr;
|
_solver_worker = nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -10,7 +10,7 @@
|
|||||||
#define SOLVER_DIALOG_H
|
#define SOLVER_DIALOG_H
|
||||||
#include <QDialog>
|
#include <QDialog>
|
||||||
#include <QThread>
|
#include <QThread>
|
||||||
|
#include "tasmet_types.h"
|
||||||
#include "solver.pb.h"
|
#include "solver.pb.h"
|
||||||
|
|
||||||
namespace pb {
|
namespace pb {
|
||||||
@ -20,7 +20,7 @@ namespace pb {
|
|||||||
namespace Ui {
|
namespace Ui {
|
||||||
class solver_dialog;
|
class solver_dialog;
|
||||||
}
|
}
|
||||||
|
class GradientNonlinearSystem;
|
||||||
class QCustomPlot;
|
class QCustomPlot;
|
||||||
class QCPGraph;
|
class QCPGraph;
|
||||||
class SolverWorker;
|
class SolverWorker;
|
||||||
@ -29,7 +29,6 @@ class SolverProgress;
|
|||||||
class SolverDialog: public QDialog {
|
class SolverDialog: public QDialog {
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
|
||||||
pb::System& _sys; // Reference to system
|
|
||||||
pb::SolverParams& _sparams;
|
pb::SolverParams& _sparams;
|
||||||
|
|
||||||
Ui::solver_dialog* _dialog;
|
Ui::solver_dialog* _dialog;
|
||||||
@ -41,14 +40,21 @@ class SolverDialog: public QDialog {
|
|||||||
|
|
||||||
SolverWorker* _solver_worker = nullptr;
|
SolverWorker* _solver_worker = nullptr;
|
||||||
|
|
||||||
|
const GradientNonlinearSystem& _sys;
|
||||||
|
|
||||||
|
/// Place where the final solution will be stored
|
||||||
|
vd _solution;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
SolverDialog(QWidget* parent,
|
SolverDialog(QWidget* parent,
|
||||||
pb::System& sys,
|
const GradientNonlinearSystem& sys,
|
||||||
pb::SolverParams& sparams);
|
pb::SolverParams& sparams);
|
||||||
|
|
||||||
~SolverDialog();
|
~SolverDialog();
|
||||||
|
|
||||||
|
const vd& getSolution() const { return _solution;};
|
||||||
|
|
||||||
public slots:
|
public slots:
|
||||||
void solver_progress(const SolverProgress&);
|
void solver_progress(const SolverProgress&);
|
||||||
private slots:
|
private slots:
|
||||||
@ -57,17 +63,23 @@ private slots:
|
|||||||
void solver_stopped(bool converged);
|
void solver_stopped(bool converged);
|
||||||
|
|
||||||
void on_solve_clicked();
|
void on_solve_clicked();
|
||||||
void on_singleiteration_clicked();
|
|
||||||
void on_stop_clicked();
|
void on_stop_clicked();
|
||||||
|
|
||||||
void on_funtol_textChanged() { changed();}
|
void on_funtol_textChanged() { changed();}
|
||||||
void on_reltol_textChanged() { changed();}
|
void on_reltol_textChanged() { changed();}
|
||||||
void on_solvertype_currentIndexChanged(int) { changed();}
|
void on_solvertype_currentIndexChanged(int) { changed();}
|
||||||
|
|
||||||
|
void on_buttons_accepted() {accept();}
|
||||||
|
void on_buttons_rejected() {reject();}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
// Called whenever the user changes input values
|
// Called whenever the user changes input values
|
||||||
void changed();
|
void changed();
|
||||||
void setEnabled(bool);
|
void setEnabled(bool);
|
||||||
void set(const pb::SolverParams&);
|
void set(const pb::SolverParams&);
|
||||||
|
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -13,143 +13,149 @@
|
|||||||
<property name="windowTitle">
|
<property name="windowTitle">
|
||||||
<string>TaSMET Solver</string>
|
<string>TaSMET Solver</string>
|
||||||
</property>
|
</property>
|
||||||
<layout class="QHBoxLayout" name="horizontalLayout_2">
|
<layout class="QVBoxLayout" name="verticalLayout_4">
|
||||||
<item>
|
<item>
|
||||||
<layout class="QVBoxLayout" name="verticalLayout_3">
|
<widget class="QWidget" name="widget" native="true">
|
||||||
<item>
|
<layout class="QHBoxLayout" name="horizontalLayout">
|
||||||
<widget class="QGroupBox" name="solversettings">
|
|
||||||
<property name="sizePolicy">
|
|
||||||
<sizepolicy hsizetype="Minimum" vsizetype="Preferred">
|
|
||||||
<horstretch>0</horstretch>
|
|
||||||
<verstretch>0</verstretch>
|
|
||||||
</sizepolicy>
|
|
||||||
</property>
|
|
||||||
<property name="title">
|
|
||||||
<string>Solver Settings</string>
|
|
||||||
</property>
|
|
||||||
<layout class="QGridLayout" name="gridLayout_4">
|
|
||||||
<item row="3" column="0">
|
|
||||||
<widget class="QLabel" name="label_13">
|
|
||||||
<property name="text">
|
|
||||||
<string>Solver type</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="3" column="1">
|
|
||||||
<widget class="QComboBox" name="solvertype"/>
|
|
||||||
</item>
|
|
||||||
<item row="2" column="1">
|
|
||||||
<widget class="QLineEdit" name="reltol">
|
|
||||||
<property name="sizePolicy">
|
|
||||||
<sizepolicy hsizetype="Minimum" vsizetype="Fixed">
|
|
||||||
<horstretch>0</horstretch>
|
|
||||||
<verstretch>0</verstretch>
|
|
||||||
</sizepolicy>
|
|
||||||
</property>
|
|
||||||
<property name="alignment">
|
|
||||||
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="2" column="0">
|
|
||||||
<widget class="QLabel" name="label_12">
|
|
||||||
<property name="text">
|
|
||||||
<string>Solution tolerance:</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="1" column="0">
|
|
||||||
<widget class="QLabel" name="label_8">
|
|
||||||
<property name="text">
|
|
||||||
<string>Residual tolerance:</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="1" column="1">
|
|
||||||
<widget class="QLineEdit" name="funtol">
|
|
||||||
<property name="sizePolicy">
|
|
||||||
<sizepolicy hsizetype="Minimum" vsizetype="Fixed">
|
|
||||||
<horstretch>0</horstretch>
|
|
||||||
<verstretch>0</verstretch>
|
|
||||||
</sizepolicy>
|
|
||||||
</property>
|
|
||||||
<property name="alignment">
|
|
||||||
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
</layout>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<widget class="QGroupBox" name="solve_gb">
|
|
||||||
<property name="sizePolicy">
|
|
||||||
<sizepolicy hsizetype="Minimum" vsizetype="Preferred">
|
|
||||||
<horstretch>0</horstretch>
|
|
||||||
<verstretch>0</verstretch>
|
|
||||||
</sizepolicy>
|
|
||||||
</property>
|
|
||||||
<property name="title">
|
|
||||||
<string>Solve!</string>
|
|
||||||
</property>
|
|
||||||
<layout class="QVBoxLayout" name="verticalLayout">
|
|
||||||
<item>
|
|
||||||
<widget class="QPushButton" name="solve">
|
|
||||||
<property name="text">
|
|
||||||
<string>Solve</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<widget class="QPushButton" name="stop">
|
|
||||||
<property name="text">
|
|
||||||
<string>Stop</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<widget class="QPushButton" name="singleiteration">
|
|
||||||
<property name="text">
|
|
||||||
<string>Single iteration</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
</layout>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<spacer name="verticalSpacer">
|
|
||||||
<property name="orientation">
|
|
||||||
<enum>Qt::Vertical</enum>
|
|
||||||
</property>
|
|
||||||
<property name="sizeHint" stdset="0">
|
|
||||||
<size>
|
|
||||||
<width>20</width>
|
|
||||||
<height>40</height>
|
|
||||||
</size>
|
|
||||||
</property>
|
|
||||||
</spacer>
|
|
||||||
</item>
|
|
||||||
</layout>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<widget class="QGroupBox" name="progress_gb">
|
|
||||||
<property name="sizePolicy">
|
|
||||||
<sizepolicy hsizetype="Expanding" vsizetype="Preferred">
|
|
||||||
<horstretch>0</horstretch>
|
|
||||||
<verstretch>0</verstretch>
|
|
||||||
</sizepolicy>
|
|
||||||
</property>
|
|
||||||
<property name="title">
|
|
||||||
<string>Progress</string>
|
|
||||||
</property>
|
|
||||||
<layout class="QVBoxLayout" name="verticalLayout_2">
|
|
||||||
<item>
|
<item>
|
||||||
<widget class="QCustomPlot" name="progress_plot" native="true"/>
|
<layout class="QVBoxLayout" name="verticalLayout_3">
|
||||||
|
<item>
|
||||||
|
<widget class="QGroupBox" name="solversettings">
|
||||||
|
<property name="sizePolicy">
|
||||||
|
<sizepolicy hsizetype="Minimum" vsizetype="Preferred">
|
||||||
|
<horstretch>0</horstretch>
|
||||||
|
<verstretch>0</verstretch>
|
||||||
|
</sizepolicy>
|
||||||
|
</property>
|
||||||
|
<property name="title">
|
||||||
|
<string>Solver Settings</string>
|
||||||
|
</property>
|
||||||
|
<layout class="QGridLayout" name="gridLayout_4">
|
||||||
|
<item row="3" column="0">
|
||||||
|
<widget class="QLabel" name="label_13">
|
||||||
|
<property name="text">
|
||||||
|
<string>Solver type</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="3" column="1">
|
||||||
|
<widget class="QComboBox" name="solvertype"/>
|
||||||
|
</item>
|
||||||
|
<item row="2" column="1">
|
||||||
|
<widget class="QLineEdit" name="reltol">
|
||||||
|
<property name="sizePolicy">
|
||||||
|
<sizepolicy hsizetype="Minimum" vsizetype="Fixed">
|
||||||
|
<horstretch>0</horstretch>
|
||||||
|
<verstretch>0</verstretch>
|
||||||
|
</sizepolicy>
|
||||||
|
</property>
|
||||||
|
<property name="alignment">
|
||||||
|
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="2" column="0">
|
||||||
|
<widget class="QLabel" name="label_12">
|
||||||
|
<property name="text">
|
||||||
|
<string>Solution tolerance:</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="1" column="0">
|
||||||
|
<widget class="QLabel" name="label_8">
|
||||||
|
<property name="text">
|
||||||
|
<string>Residual tolerance:</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="1" column="1">
|
||||||
|
<widget class="QLineEdit" name="funtol">
|
||||||
|
<property name="sizePolicy">
|
||||||
|
<sizepolicy hsizetype="Minimum" vsizetype="Fixed">
|
||||||
|
<horstretch>0</horstretch>
|
||||||
|
<verstretch>0</verstretch>
|
||||||
|
</sizepolicy>
|
||||||
|
</property>
|
||||||
|
<property name="alignment">
|
||||||
|
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QGroupBox" name="solve_gb">
|
||||||
|
<property name="sizePolicy">
|
||||||
|
<sizepolicy hsizetype="Minimum" vsizetype="Preferred">
|
||||||
|
<horstretch>0</horstretch>
|
||||||
|
<verstretch>0</verstretch>
|
||||||
|
</sizepolicy>
|
||||||
|
</property>
|
||||||
|
<property name="title">
|
||||||
|
<string>Solve!</string>
|
||||||
|
</property>
|
||||||
|
<layout class="QVBoxLayout" name="verticalLayout">
|
||||||
|
<item>
|
||||||
|
<widget class="QPushButton" name="solve">
|
||||||
|
<property name="text">
|
||||||
|
<string>Solve</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QPushButton" name="stop">
|
||||||
|
<property name="text">
|
||||||
|
<string>Stop</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<spacer name="verticalSpacer">
|
||||||
|
<property name="orientation">
|
||||||
|
<enum>Qt::Vertical</enum>
|
||||||
|
</property>
|
||||||
|
<property name="sizeHint" stdset="0">
|
||||||
|
<size>
|
||||||
|
<width>20</width>
|
||||||
|
<height>40</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
</spacer>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QGroupBox" name="progress_gb">
|
||||||
|
<property name="sizePolicy">
|
||||||
|
<sizepolicy hsizetype="Expanding" vsizetype="Preferred">
|
||||||
|
<horstretch>0</horstretch>
|
||||||
|
<verstretch>0</verstretch>
|
||||||
|
</sizepolicy>
|
||||||
|
</property>
|
||||||
|
<property name="title">
|
||||||
|
<string>Progress</string>
|
||||||
|
</property>
|
||||||
|
<layout class="QVBoxLayout" name="verticalLayout_2">
|
||||||
|
<item>
|
||||||
|
<widget class="QCustomPlot" name="progress_plot" native="true"/>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
</layout>
|
</layout>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QDialogButtonBox" name="buttons">
|
||||||
|
<property name="standardButtons">
|
||||||
|
<set>QDialogButtonBox::Cancel|QDialogButtonBox::Save</set>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
</layout>
|
</layout>
|
||||||
</widget>
|
</widget>
|
||||||
<customwidgets>
|
<customwidgets>
|
||||||
|
@ -9,22 +9,38 @@
|
|||||||
#include "solver_worker.h"
|
#include "solver_worker.h"
|
||||||
#include <functional>
|
#include <functional>
|
||||||
#include "tasmet_tracer.h"
|
#include "tasmet_tracer.h"
|
||||||
|
#include "solver.h"
|
||||||
#include "system.pb.h"
|
#include "system.pb.h"
|
||||||
#include "solver.pb.h"
|
#include "solver.pb.h"
|
||||||
|
|
||||||
#include <QThread>
|
#include <QThread>
|
||||||
|
|
||||||
|
// Solvers available
|
||||||
|
#include "newton_raphson.h"
|
||||||
|
#include "tasystem.h"
|
||||||
|
|
||||||
SolverWorker::SolverWorker(const pb::System& sys,const pb::SolverParams& sparams):
|
SolverWorker::SolverWorker(const GradientNonlinearSystem& sys,
|
||||||
|
const pb::SolverParams& sparams):
|
||||||
_run(false),
|
_run(false),
|
||||||
_reltol(sparams.reltol()),
|
_funtol(sparams.funtol()),
|
||||||
_funtol(sparams.funtol())
|
_reltol(sparams.reltol())
|
||||||
{
|
{
|
||||||
|
TRACE(15,"SolverWorker");
|
||||||
|
|
||||||
|
switch (sparams.solvertype()) {
|
||||||
|
case pb::NewtonRaphson: {
|
||||||
|
_solver = new NewtonRaphson(sys);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
tasmet_assert(false,"Not implemented solver type");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
SolverWorker::~SolverWorker(){
|
SolverWorker::~SolverWorker(){
|
||||||
TRACE(15,"~SolverWorker");
|
TRACE(15,"~SolverWorker");
|
||||||
|
if(_solver!=nullptr) delete _solver;
|
||||||
}
|
}
|
||||||
void SolverWorker::solver_stop() {
|
void SolverWorker::solver_stop() {
|
||||||
_run = false;
|
_run = false;
|
||||||
@ -39,23 +55,10 @@ void SolverWorker::solver_start() {
|
|||||||
progress_callback callback = std::bind(&SolverWorker::pg_callback,
|
progress_callback callback = std::bind(&SolverWorker::pg_callback,
|
||||||
this,_1);
|
this,_1);
|
||||||
|
|
||||||
SolverProgress p;
|
|
||||||
// For testing purposes
|
tasmet_assert(_solver!=nullptr,"Solver not initialized");
|
||||||
|
|
||||||
SolverAction action;
|
_solver->start(&callback);
|
||||||
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);
|
emit solver_stopped(_converged);
|
||||||
}
|
}
|
||||||
@ -66,11 +69,15 @@ SolverAction SolverWorker::pg_callback(SolverProgress pg) {
|
|||||||
|
|
||||||
emit progress(pg);
|
emit progress(pg);
|
||||||
|
|
||||||
|
if(pg.error) {
|
||||||
|
_converged = false;
|
||||||
|
return Stop;
|
||||||
|
}
|
||||||
if(pg.fun_err <= _funtol && pg.rel_err <= _reltol) {
|
if(pg.fun_err <= _funtol && pg.rel_err <= _reltol) {
|
||||||
_converged = true;
|
_converged = true;
|
||||||
return Stop;
|
return Stop;
|
||||||
}
|
}
|
||||||
|
|
||||||
return Continue;
|
return Continue;
|
||||||
|
|
||||||
|
|
||||||
|
@ -19,18 +19,28 @@ namespace pb{
|
|||||||
class SolverParams;
|
class SolverParams;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class TaSystem;
|
||||||
|
|
||||||
Q_DECLARE_METATYPE(SolverProgress);
|
Q_DECLARE_METATYPE(SolverProgress);
|
||||||
|
|
||||||
class SolverWorker: public QObject {
|
class SolverWorker: public QObject {
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
|
||||||
std::atomic<bool> _run;
|
std::atomic<bool> _run;
|
||||||
Solver<GradientNonlinearSystem,vd>* _solver;
|
Solver<GradientNonlinearSystem,vd>* _solver = nullptr;
|
||||||
bool _converged = false;
|
bool _converged = false;
|
||||||
d _funtol,_reltol;
|
d _funtol,_reltol;
|
||||||
public:
|
public:
|
||||||
SolverWorker(const pb::System& sys,const pb::SolverParams& sparams);
|
SolverWorker(const GradientNonlinearSystem& sys,
|
||||||
|
const pb::SolverParams& sparams);
|
||||||
|
|
||||||
~SolverWorker();
|
~SolverWorker();
|
||||||
|
|
||||||
|
vd getSolution() const { return _solver ? _solver->getSolution() : zeros<vd>(0);}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Stop the solver. Called when the user presses the `stop' button
|
||||||
|
*/
|
||||||
void solver_stop();
|
void solver_stop();
|
||||||
|
|
||||||
public slots:
|
public slots:
|
||||||
|
@ -40,7 +40,7 @@ int main(int argc, char *argv[]) {
|
|||||||
// This can be used to store files in the application. Very useful
|
// This can be used to store files in the application. Very useful
|
||||||
// when our application grows bigger
|
// when our application grows bigger
|
||||||
// Q_INIT_RESOURCE(application);
|
// Q_INIT_RESOURCE(application);
|
||||||
INITTRACE(15);
|
INITTRACE(16);
|
||||||
|
|
||||||
QApplication app(argc, argv);
|
QApplication app(argc, argv);
|
||||||
|
|
||||||
|
@ -9,7 +9,7 @@
|
|||||||
#include "newton_raphson.h"
|
#include "newton_raphson.h"
|
||||||
#include "tasmet_tracer.h"
|
#include "tasmet_tracer.h"
|
||||||
|
|
||||||
#define DEBUG_TASMET_SYSTEM
|
// #define DEBUG_TASMET_SYSTEM
|
||||||
|
|
||||||
void NewtonRaphson::start_implementation(GradientNonlinearSystem& system,
|
void NewtonRaphson::start_implementation(GradientNonlinearSystem& system,
|
||||||
progress_callback* callback) {
|
progress_callback* callback) {
|
||||||
@ -48,7 +48,15 @@ void NewtonRaphson::start_implementation(GradientNonlinearSystem& system,
|
|||||||
#endif // DEBUG_TASMET_SYSTEM
|
#endif // DEBUG_TASMET_SYSTEM
|
||||||
|
|
||||||
TRACE(15,"Solving system of eqs");
|
TRACE(15,"Solving system of eqs");
|
||||||
dx = -1*_dampfac*arma::spsolve(resjac.jacobian,resjac.residual,"superlu");
|
try {
|
||||||
|
dx = -1*_dampfac*arma::spsolve(resjac.jacobian,resjac.residual,"superlu");
|
||||||
|
}
|
||||||
|
catch(...) {
|
||||||
|
progress.error = true;
|
||||||
|
progress.err_msg = "Failed to solve linear system of equations";
|
||||||
|
(*callback)(progress);
|
||||||
|
return;
|
||||||
|
}
|
||||||
TRACE(15,"Solving system of eqs done");
|
TRACE(15,"Solving system of eqs done");
|
||||||
|
|
||||||
progress.rel_err = norm(dx);
|
progress.rel_err = norm(dx);
|
||||||
|
@ -32,6 +32,8 @@ struct SolverProgress
|
|||||||
Solver stops as an action of
|
Solver stops as an action of
|
||||||
itself. Probably due to an internal
|
itself. Probably due to an internal
|
||||||
error. */
|
error. */
|
||||||
|
string err_msg;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -71,8 +71,7 @@ TaSystem::TaSystem(const pb::System& sys):
|
|||||||
}
|
}
|
||||||
TaSystem::TaSystem(const TaSystem& o):
|
TaSystem::TaSystem(const TaSystem& o):
|
||||||
GlobalConf(o), // Share a ptr to the Global conf
|
GlobalConf(o), // Share a ptr to the Global conf
|
||||||
_gas(o._gas->copy()),
|
_gas(o._gas->copy())
|
||||||
_solution(o._solution)
|
|
||||||
{
|
{
|
||||||
TRACE(25,"TaSystem::TaSystem(TaSystem&) copy");
|
TRACE(25,"TaSystem::TaSystem(TaSystem&) copy");
|
||||||
|
|
||||||
@ -84,7 +83,11 @@ TaSystem::TaSystem(const TaSystem& o):
|
|||||||
if(!seg.second) throw TaSMETBadAlloc();
|
if(!seg.second) throw TaSMETBadAlloc();
|
||||||
}
|
}
|
||||||
|
|
||||||
initSolRes();
|
initSolRes(); // This empties the
|
||||||
|
// solution. Therefore we copy it
|
||||||
|
// after this phase.
|
||||||
|
|
||||||
|
_solution = o._solution;
|
||||||
|
|
||||||
}
|
}
|
||||||
void TaSystem::initSolRes() {
|
void TaSystem::initSolRes() {
|
||||||
@ -272,7 +275,6 @@ void TaSystem::residualJac(ResidualJac& resjac) const {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -295,6 +297,7 @@ void TaSystem::residualJac(ResidualJac& resjac) const {
|
|||||||
_residual(arbitrateMassEq)=mass - _mass;
|
_residual(arbitrateMassEq)=mass - _mass;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Store the Jacobian and the residual
|
||||||
resjac.jacobian = sdmat(triplets);
|
resjac.jacobian = sdmat(triplets);
|
||||||
resjac.residual = _residual;
|
resjac.residual = _residual;
|
||||||
|
|
||||||
@ -302,9 +305,20 @@ void TaSystem::residualJac(ResidualJac& resjac) const {
|
|||||||
vd TaSystem::getSolution() const {
|
vd TaSystem::getSolution() const {
|
||||||
return _solution;
|
return _solution;
|
||||||
}
|
}
|
||||||
|
void TaSystem::updateSolution(const vd& solution) {
|
||||||
|
|
||||||
|
if(_solution.size() == solution.size()) {
|
||||||
|
_solution = solution;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
throw TaSMETError("Solution vector size does not match.");
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
const SegPositionMapper& TaSystem::getSolution(const us seg_id) const {
|
const SegPositionMapper& TaSystem::getSolution(const us seg_id) const {
|
||||||
return _solution_dofs.at(seg_id);
|
return _solution_dofs.at(seg_id);
|
||||||
}
|
}
|
||||||
|
|
||||||
vus TaSystem::getNDofs() const {
|
vus TaSystem::getNDofs() const {
|
||||||
TRACE(0,"TaSystem::getNDofs()");
|
TRACE(0,"TaSystem::getNDofs()");
|
||||||
vus Ndofs(_segs.size());
|
vus Ndofs(_segs.size());
|
||||||
@ -481,7 +495,7 @@ void TaSystem::exportHDF5(const string& filename) const {
|
|||||||
|
|
||||||
seg_.second->exportHDF5(grp_id);
|
seg_.second->exportHDF5(grp_id);
|
||||||
|
|
||||||
|
// Close the group
|
||||||
H5Gclose(grp_id);
|
H5Gclose(grp_id);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -64,14 +64,24 @@ private:
|
|||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
void initSolRes();
|
void initSolRes();
|
||||||
public:
|
|
||||||
TaSystem(const TaSystem& o);
|
TaSystem(const TaSystem& o);
|
||||||
|
public:
|
||||||
|
|
||||||
TaSystem(const pb::System&);
|
TaSystem(const pb::System&);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
static TaSystem testSystem() {
|
/**
|
||||||
return TaSystem(pb::System::default_instance());
|
* Returns an empty TaSystem with default GlobalConf
|
||||||
|
* parameters. The caller of this function owns the object and is
|
||||||
|
* responsible for its destruction.
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* @return the TaSystem instance pointer.
|
||||||
|
*/
|
||||||
|
static TaSystem* testSystem() {
|
||||||
|
return new TaSystem(pb::System::default_instance());
|
||||||
}
|
}
|
||||||
const Gas& gas() const {return *_gas;}
|
const Gas& gas() const {return *_gas;}
|
||||||
|
|
||||||
@ -96,7 +106,7 @@ public:
|
|||||||
// Obtain the solution vector for the Segment with given id
|
// Obtain the solution vector for the Segment with given id
|
||||||
const SegPositionMapper& getSolution(const us seg_id) const;
|
const SegPositionMapper& getSolution(const us seg_id) const;
|
||||||
|
|
||||||
virtual void updateSolution(const vd& sol) {_solution = sol; } // Update the solution
|
virtual void updateSolution(const vd& sol);
|
||||||
|
|
||||||
// Change Nf in the system, while keeping the results.
|
// Change Nf in the system, while keeping the results.
|
||||||
void updateNf(us);
|
void updateNf(us);
|
||||||
|
Loading…
Reference in New Issue
Block a user