Skip to content

Commit e33883c

Browse files
authored
Cleanup jacobian index code (OpenModelica#13576)
1 parent 89d6008 commit e33883c

File tree

14 files changed

+151
-193
lines changed

14 files changed

+151
-193
lines changed

OMCompiler/Compiler/Template/CodegenC.tpl

Lines changed: 107 additions & 137 deletions
Large diffs are not rendered by default.

OMCompiler/SimulationRuntime/c/simulation/solver/gbode_main.c

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,6 @@ int gbodef_allocateData(DATA *data, threadData_t *threadData, SOLVER_INFO *solve
105105
gbData->gbfData = gbfData;
106106

107107
ANALYTIC_JACOBIAN *jacobian = NULL;
108-
analyticalJacobianColumn_func_ptr analyticalJacobianColumn = NULL;
109108
int i;
110109

111110
gbfData->nStates = gbData->nStates;
@@ -315,7 +314,6 @@ int gbode_allocateData(DATA *data, threadData_t *threadData, SOLVER_INFO *solver
315314
gbData->nStates = data->modelData->nStates;
316315

317316
ANALYTIC_JACOBIAN* jacobian = NULL;
318-
analyticalJacobianColumn_func_ptr analyticalJacobianColumn = NULL;
319317

320318
gbData->GM_method = getGB_method(FLAG_SR);
321319
gbData->tableau = initButcherTableau(gbData->GM_method, FLAG_SR_ERR);

OMCompiler/SimulationRuntime/c/simulation/solver/gbode_nls.c

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -202,7 +202,6 @@ NONLINEAR_SYSTEM_DATA* initRK_NLS_DATA(DATA* data, threadData_t* threadData, DAT
202202
struct dataSolver *solverData = (struct dataSolver*) calloc(1,sizeof(struct dataSolver));
203203

204204
NONLINEAR_SYSTEM_DATA* nlsData;
205-
analyticalJacobianColumn_func_ptr analyticalJacobianColumn;
206205

207206
nlsData = allocNlsDataGB(threadData, gbData->nlSystemSize);
208207
nlsData->equationIndex = -1;
@@ -310,7 +309,6 @@ NONLINEAR_SYSTEM_DATA* initRK_NLS_DATA_MR(DATA* data, threadData_t* threadData,
310309
struct dataSolver *solverData = (struct dataSolver*) calloc(1, sizeof(struct dataSolver));
311310

312311
NONLINEAR_SYSTEM_DATA* nlsData;
313-
analyticalJacobianColumn_func_ptr analyticalJacobianColumn;
314312

315313
nlsData = allocNlsDataGB(threadData, gbfData->nStates);
316314
nlsData->equationIndex = -1;

OMCompiler/SimulationRuntime/c/simulation/solver/kinsolSolver.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -645,7 +645,7 @@ int nlsSparseSymJac(N_Vector vecX, N_Vector vecFX, SUNMatrix Jac,
645645
}
646646
}
647647
/* Evaluate Jacobian column */
648-
((nlsData->analyticalJacobianColumn))(data, threadData, analyticJacobian, NULL);
648+
nlsData->analyticalJacobianColumn(data, threadData, analyticJacobian, NULL);
649649

650650
/* Save column in Jac and unset seed variables */
651651
for (ii = 0; ii < kinsolData->size; ii++) {

OMCompiler/SimulationRuntime/c/simulation/solver/linearSolverKlu.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,7 @@ static int getAnalyticalJacobian(DATA* data, threadData_t *threadData,
120120
{
121121
int i,ii,j,k,l;
122122

123-
LINEAR_SYSTEM_DATA* systemData = &(((DATA*)data)->simulationInfo->linearSystemData[sysNumber]);
123+
LINEAR_SYSTEM_DATA* systemData = &(data->simulationInfo->linearSystemData[sysNumber]);
124124

125125
const int index = systemData->jacobianIndex;
126126
ANALYTIC_JACOBIAN* jacobian = systemData->parDynamicData[omc_get_thread_num()].jacobian;
@@ -144,7 +144,7 @@ static int getAnalyticalJacobian(DATA* data, threadData_t *threadData,
144144
}
145145
}
146146

147-
((systemData->analyticalJacobianColumn))(data, threadData, jacobian, parentJacobian);
147+
systemData->analyticalJacobianColumn(data, threadData, jacobian, parentJacobian);
148148

149149
for(j = 0; j < jacobian->sizeCols; j++)
150150
{

OMCompiler/SimulationRuntime/c/simulation/solver/linearSolverLapack.c

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -108,8 +108,8 @@ int freeLapackData(void **voiddata)
108108
*/
109109
int getAnalyticalJacobianLapack(DATA* data, threadData_t *threadData, double* jac, int sysNumber)
110110
{
111-
int i,j,k,l,ii,currentSys = sysNumber;
112-
LINEAR_SYSTEM_DATA* systemData = &(((DATA*)data)->simulationInfo->linearSystemData[currentSys]);
111+
int i,j,k,l,ii;
112+
LINEAR_SYSTEM_DATA* systemData = &(data->simulationInfo->linearSystemData[sysNumber]);
113113

114114
const int index = systemData->jacobianIndex;
115115
ANALYTIC_JACOBIAN* jacobian = systemData->parDynamicData[omc_get_thread_num()].jacobian;
@@ -128,7 +128,7 @@ int getAnalyticalJacobianLapack(DATA* data, threadData_t *threadData, double* ja
128128
if(jacobian->sparsePattern->colorCols[ii]-1 == i)
129129
jacobian->seedVars[ii] = 1;
130130

131-
((systemData->analyticalJacobianColumn))(data, threadData, jacobian, parentJacobian);
131+
systemData->analyticalJacobianColumn(data, threadData, jacobian, parentJacobian);
132132

133133
for(j = 0; j < jacobian->sizeCols; j++) {
134134
if(jacobian->seedVars[j] == 1) {
@@ -155,9 +155,7 @@ int getAnalyticalJacobianLapack(DATA* data, threadData_t *threadData, double* ja
155155
*/
156156
static int wrapper_fvec_lapack(_omc_vector* x, _omc_vector* f, int* iflag, RESIDUAL_USERDATA* resUserData, int sysNumber)
157157
{
158-
int currentSys = sysNumber;
159-
160-
resUserData->data->simulationInfo->linearSystemData[currentSys].residualFunc(resUserData, x->data, f->data, iflag);
158+
resUserData->data->simulationInfo->linearSystemData[sysNumber].residualFunc(resUserData, x->data, f->data, iflag);
161159
return 0;
162160
}
163161

OMCompiler/SimulationRuntime/c/simulation/solver/linearSolverLis.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -149,7 +149,7 @@ void printLisMatrixCSR(LIS_MATRIX A, int n)
149149
int getAnalyticalJacobianLis(DATA* data, threadData_t *threadData, int sysNumber)
150150
{
151151
int i,j,k,l,ii;
152-
LINEAR_SYSTEM_DATA* systemData = &(((DATA*)data)->simulationInfo->linearSystemData[sysNumber]);
152+
LINEAR_SYSTEM_DATA* systemData = &(data->simulationInfo->linearSystemData[sysNumber]);
153153

154154
const int index = systemData->jacobianIndex;
155155
ANALYTIC_JACOBIAN* jacobian = systemData->parDynamicData[omc_get_thread_num()].jacobian;
@@ -160,7 +160,7 @@ int getAnalyticalJacobianLis(DATA* data, threadData_t *threadData, int sysNumber
160160

161161
for(i=0; i < jacobian->sizeRows; i++) {
162162
jacobian->seedVars[i] = 1;
163-
((systemData->analyticalJacobianColumn))(data, threadData, jacobian, parentJacobian);
163+
systemData->analyticalJacobianColumn(data, threadData, jacobian, parentJacobian);
164164

165165
for(j = 0; j < jacobian->sizeCols; j++) {
166166
if(jacobian->seedVars[j] == 1) {

OMCompiler/SimulationRuntime/c/simulation/solver/linearSolverTotalPivot.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -338,7 +338,7 @@ int freeTotalPivotData(void** voiddata)
338338
int getAnalyticalJacobianTotalPivot(DATA* data, threadData_t *threadData, double* jac, int sysNumber)
339339
{
340340
int i,j,k,l,ii;
341-
LINEAR_SYSTEM_DATA* systemData = &(((DATA*)data)->simulationInfo->linearSystemData[sysNumber]);
341+
LINEAR_SYSTEM_DATA* systemData = &(data->simulationInfo->linearSystemData[sysNumber]);
342342

343343
const int index = systemData->jacobianIndex;
344344

@@ -354,7 +354,7 @@ int getAnalyticalJacobianTotalPivot(DATA* data, threadData_t *threadData, double
354354
if(jacobian->sparsePattern->colorCols[ii]-1 == i)
355355
jacobian->seedVars[ii] = 1;
356356

357-
((systemData->analyticalJacobianColumn))(data, threadData, jacobian, parentJacobian);
357+
systemData->analyticalJacobianColumn(data, threadData, jacobian, parentJacobian);
358358

359359
for(j = 0; j < jacobian->sizeCols; j++)
360360
{

OMCompiler/SimulationRuntime/c/simulation/solver/linearSolverUmfpack.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -135,7 +135,7 @@ freeUmfPackData(void **voiddata)
135135
int getAnalyticalJacobianUmfPack(DATA* data, threadData_t *threadData, int sysNumber)
136136
{
137137
int i,ii,j,k,l;
138-
LINEAR_SYSTEM_DATA* systemData = &(((DATA*)data)->simulationInfo->linearSystemData[sysNumber]);
138+
LINEAR_SYSTEM_DATA* systemData = &(data->simulationInfo->linearSystemData[sysNumber]);
139139

140140
const int index = systemData->jacobianIndex;
141141
ANALYTIC_JACOBIAN* jacobian = systemData->parDynamicData[omc_get_thread_num()].jacobian;
@@ -148,7 +148,7 @@ int getAnalyticalJacobianUmfPack(DATA* data, threadData_t *threadData, int sysNu
148148
{
149149
jacobian->seedVars[i] = 1;
150150

151-
((systemData->analyticalJacobianColumn))(data, threadData, jacobian, parentJacobian);
151+
systemData->analyticalJacobianColumn(data, threadData, jacobian, parentJacobian);
152152

153153
for(j = 0; j < jacobian->sizeCols; j++)
154154
{

OMCompiler/SimulationRuntime/c/simulation/solver/newton_diagnostics.c

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -110,13 +110,7 @@ double** MatMult( unsigned rA, unsigned cArB, unsigned cB, double** A, double**
110110
double** getJacobian( DATA* data, threadData_t *threadData, unsigned sysNumber, unsigned m)
111111
{
112112
NONLINEAR_SYSTEM_DATA* systemData = &(data->simulationInfo->nonlinearSystemData[sysNumber]);
113-
ANALYTIC_JACOBIAN* jac = &(data->simulationInfo->analyticJacobians[systemData->jacobianIndex]);
114-
assertStreamPrint(NULL, NULL != jac, "NEWTON_DIAGNOSTICS: invalid jac-pointer.");
115-
assertStreamPrint(NULL, jac->availability != JACOBIAN_UNKNOWN, "NEWTON_DIAGNOSTICS: Jacobian availablity status is unknown.");
116-
assertStreamPrint(NULL, NULL != jac->seedVars, "NEWTON_DIAGNOSTICS: invalid seedVars-pointer.");
117-
assertStreamPrint(NULL, NULL != systemData, "NEWTON_DIAGNOSTICS: invalid systemData-pointer.");
118-
assertStreamPrint(NULL, NULL != systemData->analyticalJacobianColumn, "NEWTON_DIAGNOSTICS: invalid analyticJacobianColumn-pointer.");
119-
113+
ANALYTIC_JACOBIAN* jac = NULL;
120114
unsigned i, j;
121115

122116
// Allocate memory for fx (m * m matrix)
@@ -134,17 +128,23 @@ double** getJacobian( DATA* data, threadData_t *threadData, unsigned sysNumber,
134128
// ...
135129
// variable n: df_n/dv_1, df_2/dv_2, .... df_n/dv_n
136130

137-
for (j = 0; j < m; j++) {
138-
jac->seedVars[j] = 1.0;
131+
if (systemData->jacobianIndex != -1) {
132+
jac = &(data->simulationInfo->analyticJacobians[systemData->jacobianIndex]);
139133

140-
// Calculate values for one column of the Jacobian, output: df_1/dv_j, df_2/dv_j, .... df_n/dv_j
141-
systemData->analyticalJacobianColumn(data, threadData, jac, NULL);
134+
for (j = 0; j < m; j++) {
135+
jac->seedVars[j] = 1.0;
142136

143-
// Store values in column of Jacobian
144-
for (i = 0; i < m; i++)
145-
fx[i][j] = jac->resultVars[i];
137+
// Calculate values for one column of the Jacobian, output: df_1/dv_j, df_2/dv_j, .... df_n/dv_j
138+
systemData->analyticalJacobianColumn(data, threadData, jac, NULL);
139+
140+
// Store values in column of Jacobian
141+
for (i = 0; i < m; i++)
142+
fx[i][j] = jac->resultVars[i];
146143

147-
jac->seedVars[j] = 0.0;
144+
jac->seedVars[j] = 0.0;
145+
}
146+
} else {
147+
assertStreamPrint(NULL, FALSE, "NEWTON_DIAGNOSTICS: numeric jacobian not yet supported.");
148148
}
149149

150150
return fx;

0 commit comments

Comments
 (0)