Skip to content
This repository was archived by the owner on May 18, 2019. It is now read-only.

Commit 2749b17

Browse files
qichenghuaOpenModelica-Hudson
authored andcommitted
fix ticket:4213, added scaling of linear systems back again
1 parent 40f96b8 commit 2749b17

File tree

4 files changed

+46
-1
lines changed

4 files changed

+46
-1
lines changed

SimulationRuntime/cpp/Include/Solver/Dgesv/DgesvSolver.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ class DgesvSolver : public IAlgLoopSolver
4949
*_y_new, //stores new solution
5050
*_b, ///< right hand side
5151
*_A, ///coefficients of linear system
52-
*_zeroVec; ///zero vector
52+
*_zeroVec, ///zero vector
53+
*_fNominal;
5354
};
5455
/** @} */ // end of solverLinearSolver

SimulationRuntime/cpp/Include/Solver/LinearSolver/LinearSolver.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,8 @@ class LinearSolver : public IAlgLoopSolver
6666
int* _Ap;
6767
double* _Ax;
6868
int _nonzeros;
69+
#else
70+
double *_fNominal;// klu scales the matrix entries already
6971
#endif
7072

7173
};

SimulationRuntime/cpp/Solver/Dgesv/DgesvSolver.cpp

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ DgesvSolver::DgesvSolver(ILinearAlgLoop* algLoop, ILinSolverSettings* settings)
3131
, _zeroVec (NULL)
3232
, _iterationStatus (CONTINUE)
3333
, _firstCall (true)
34+
, _fNominal (NULL)
3435
{
3536
}
3637

@@ -44,6 +45,7 @@ DgesvSolver::~DgesvSolver()
4445
if(_A) delete [] _A;
4546
if(_ihelpArray) delete [] _ihelpArray;
4647
if(_zeroVec) delete [] _zeroVec;
48+
if (_fNominal) delete [] _fNominal;
4749
}
4850

4951
void DgesvSolver::initialize()
@@ -70,6 +72,7 @@ void DgesvSolver::initialize()
7072
if(_A) delete [] _A;
7173
if(_ihelpArray) delete [] _ihelpArray;
7274
if(_zeroVec) delete [] _zeroVec;
75+
if (_fNominal) delete [] _fNominal;
7376

7477
_y = new double[_dimSys];
7578
_y0 = new double[_dimSys];
@@ -79,6 +82,7 @@ void DgesvSolver::initialize()
7982
_A = new double[_dimSys*_dimSys];
8083
_ihelpArray = new long int[_dimSys];
8184
_zeroVec = new double[_dimSys];
85+
_fNominal = new double[_dimSys];
8286

8387
_algLoop->getReal(_y);
8488
_algLoop->getReal(_y0);
@@ -120,6 +124,18 @@ void DgesvSolver::solve()
120124

121125
memcpy(_A, Atemp, _dimSys*_dimSys*sizeof(double));
122126

127+
128+
for (int j = 0, idx = 0; j < _dimSys; j++)
129+
for (int i = 0; i < _dimSys; i++, idx++)
130+
_fNominal[i] = std::max(std::abs(Atemp[idx]), _fNominal[i]);
131+
132+
for (int j = 0, idx = 0; j < _dimSys; j++)
133+
for (int i = 0; i < _dimSys; i++, idx++)
134+
_A[idx] /= _fNominal[i];
135+
136+
for (int i = 0; i < _dimSys; i++)
137+
_b[i] /= _fNominal[i];
138+
123139
dgesv_(&_dimSys,&dimRHS,_A,&_dimSys,_ihelpArray,_b,&_dimSys,&irtrn);
124140

125141
if (irtrn != 0){

SimulationRuntime/cpp/Solver/LinearSolver/LinearSolver.cpp

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ LinearSolver::LinearSolver(ILinearAlgLoop* algLoop, ILinSolverSettings* settings
4747
, _firstCall (true)
4848
, _scale (NULL)
4949
, _generateoutput (false)
50+
, _fNominal (NULL)
5051
{
5152
_sparse = _algLoop->getUseSparseFormat();
5253
}
@@ -63,6 +64,7 @@ LinearSolver::~LinearSolver()
6364
if (_jhelpArray) delete[] _jhelpArray;
6465
if(_zeroVec) delete [] _zeroVec;
6566
if (_scale) delete[] _scale;
67+
if (_fNominal) delete [] _fNominal;
6668

6769
#if defined(klu)
6870
if(_sparse == true)
@@ -109,6 +111,7 @@ void LinearSolver::initialize()
109111
if (_jhelpArray) delete[] _jhelpArray;
110112
if(_zeroVec) delete [] _zeroVec;
111113
if (_scale) delete[] _scale;
114+
if (_fNominal) delete [] _fNominal;
112115

113116
_y = new double[_dimSys];
114117
_y0 = new double[_dimSys];
@@ -120,6 +123,7 @@ void LinearSolver::initialize()
120123
_jhelpArray = new long int[_dimSys];
121124
_zeroVec = new double[_dimSys];
122125
_scale = new double[_dimSys];
126+
_fNominal = new double[_dimSys];
123127

124128
_algLoop->getReal(_y);
125129
_algLoop->getReal(_y0);
@@ -204,6 +208,28 @@ void LinearSolver::solve()
204208

205209
memcpy(_A, Atemp, _dimSys*_dimSys*sizeof(double));
206210

211+
for (int j = 0, idx = 0; j < _dimSys; j++){
212+
for (int i = 0; i < _dimSys; i++, idx++){
213+
_fNominal[i] = std::max(std::abs(Atemp[idx]), _fNominal[i]);
214+
}
215+
}
216+
217+
for (int i=0;i<_dimSys;i++){
218+
if (_fNominal[i]==0.0){
219+
_fNominal[i]==1.0;// if the row contains only zeros, there is no need to scale that row.
220+
}
221+
}
222+
223+
224+
for (int j = 0, idx = 0; j < _dimSys; j++)
225+
for (int i = 0; i < _dimSys; i++, idx++)
226+
_A[idx] /= _fNominal[i];
227+
228+
for (int i = 0; i < _dimSys; i++)
229+
_b[i] /= _fNominal[i];
230+
231+
232+
207233
if(_generateoutput){
208234
std::cout << std::endl;
209235
std::cout << "We solve a linear system with coefficient matrix" << std::endl;

0 commit comments

Comments
 (0)