4848 * NULL if not available.
4949 * @param sparsePattern Pointer to sparsity pattern of Jacobian.
5050 */
51- void initAnalyticJacobian (ANALYTIC_JACOBIAN * jacobian , unsigned int sizeCols , unsigned int sizeRows , unsigned int sizeTmpVars , int (* constantEqns )(void * data , threadData_t * threadData , void * thisJacobian , void * parentJacobian ), SPARSE_PATTERN * sparsePattern ) {
51+ void initJacobian (JACOBIAN * jacobian , unsigned int sizeCols , unsigned int sizeRows , unsigned int sizeTmpVars , jacobianColumn_func_ptr evalColumn , jacobianColumn_func_ptr constantEqns , SPARSE_PATTERN * sparsePattern )
52+ {
5253 jacobian -> sizeCols = sizeCols ;
5354 jacobian -> sizeRows = sizeRows ;
5455 jacobian -> sizeTmpVars = sizeTmpVars ;
5556 jacobian -> seedVars = (modelica_real * ) calloc (sizeCols , sizeof (modelica_real ));
5657 jacobian -> resultVars = (modelica_real * ) calloc (sizeRows , sizeof (modelica_real ));
5758 jacobian -> tmpVars = (modelica_real * ) calloc (sizeTmpVars , sizeof (modelica_real ));
59+ jacobian -> evalColumn = evalColumn ;
5860 jacobian -> constantEqns = constantEqns ;
5961 jacobian -> sparsePattern = sparsePattern ;
6062 jacobian -> availability = JACOBIAN_UNKNOWN ;
@@ -67,16 +69,18 @@ void initAnalyticJacobian(ANALYTIC_JACOBIAN* jacobian, unsigned int sizeCols, un
6769 * Sparsity pattern is not copied, only the pointer to it.
6870 *
6971 * @param source Jacobian that should be copied.
70- * @return ANALYTIC_JACOBIAN* Copy of source.
72+ * @return JACOBIAN* Copy of source.
7173 */
72- ANALYTIC_JACOBIAN * copyAnalyticJacobian (ANALYTIC_JACOBIAN * source ) {
73- ANALYTIC_JACOBIAN * jacobian = (ANALYTIC_JACOBIAN * ) malloc (sizeof (ANALYTIC_JACOBIAN ));
74- initAnalyticJacobian (jacobian ,
75- source -> sizeCols ,
76- source -> sizeRows ,
77- source -> sizeTmpVars ,
78- source -> constantEqns ,
79- source -> sparsePattern );
74+ JACOBIAN * copyJacobian (JACOBIAN * source )
75+ {
76+ JACOBIAN * jacobian = (JACOBIAN * ) malloc (sizeof (JACOBIAN ));
77+ initJacobian (jacobian ,
78+ source -> sizeCols ,
79+ source -> sizeRows ,
80+ source -> sizeTmpVars ,
81+ source -> evalColumn ,
82+ source -> constantEqns ,
83+ source -> sparsePattern );
8084
8185 return jacobian ;
8286}
@@ -88,7 +92,8 @@ ANALYTIC_JACOBIAN* copyAnalyticJacobian(ANALYTIC_JACOBIAN* source) {
8892 *
8993 * @param jac Pointer to Jacobian.
9094 */
91- void freeAnalyticJacobian (ANALYTIC_JACOBIAN * jac ) {
95+ void freeJacobian (JACOBIAN * jac )
96+ {
9297 if (jac == NULL ) {
9398 return ;
9499 }
@@ -99,6 +104,53 @@ void freeAnalyticJacobian(ANALYTIC_JACOBIAN *jac) {
99104 free (jac -> sparsePattern ); jac -> sparsePattern = NULL ;
100105}
101106
107+ /*! \fn evalJacobian
108+ *
109+ * compute entries of Jacobian
110+ * uses coloring (from sparsity pattern) if available
111+ *
112+ * \param [ref] [data]
113+ * \param [ref] [threadData]
114+ * \param [ref] [jacobian] Pointer to Jacobian
115+ * \param [out] [jac] Contains jacobian values on exit, column-major
116+ */
117+ void evalJacobian (DATA * data , threadData_t * threadData , JACOBIAN * jacobian , JACOBIAN * parentJacobian , modelica_real * jac )
118+ {
119+ int i ,j ,k ,l ,ii ;
120+ const SPARSE_PATTERN * sp = jacobian -> sparsePattern ;
121+
122+ memset (jac , 0.0 , (jacobian -> sizeRows ) * (jacobian -> sizeCols ) * sizeof (modelica_real ));
123+
124+ /* evaluate constant equations of Jacobian */
125+ if (jacobian -> constantEqns != NULL ) {
126+ jacobian -> constantEqns (data , threadData , jacobian , parentJacobian );
127+ }
128+
129+ /* evaluate Jacobian */
130+ for (i = 0 ; i < sp -> maxColors ; i ++ ) {
131+ /* activate seed variable for the corresponding color */
132+ for (j = 0 ; j < jacobian -> sizeCols ; j ++ )
133+ if (sp -> colorCols [j ]- 1 == i )
134+ jacobian -> seedVars [j ] = 1.0 ;
135+
136+ /* evaluate Jacobian column */
137+ jacobian -> evalColumn (data , threadData , jacobian , parentJacobian );
138+
139+ for (j = 0 ; j < jacobian -> sizeCols ; j ++ ) {
140+ if (sp -> colorCols [j ]- 1 == i ) {
141+ for (ii = sp -> leadindex [j ]; ii < sp -> leadindex [j + 1 ]; ii ++ ) {
142+ l = sp -> index [ii ];
143+ k = j * jacobian -> sizeRows + l ;
144+ jac [k ] = jacobian -> resultVars [l ]; //* solverData->xScaling[j];
145+ }
146+ /* de-activate seed variable for the corresponding color */
147+ jacobian -> seedVars [j ] = 0.0 ;
148+ }
149+ }
150+ }
151+ }
152+
153+
102154/**
103155 * @brief Allocate memory for sparsity pattern.
104156 *
@@ -108,7 +160,8 @@ void freeAnalyticJacobian(ANALYTIC_JACOBIAN *jac) {
108160 * @param maxColors Maximum number of colors of Matrix.
109161 * @return SPARSE_PATTERN* Pointer ot allocated sparsity pattern of Matrix.
110162 */
111- SPARSE_PATTERN * allocSparsePattern (unsigned int n_leadIndex , unsigned int numberOfNonZeros , unsigned int maxColors ) {
163+ SPARSE_PATTERN * allocSparsePattern (unsigned int n_leadIndex , unsigned int numberOfNonZeros , unsigned int maxColors )
164+ {
112165 SPARSE_PATTERN * sparsePattern = (SPARSE_PATTERN * ) malloc (sizeof (SPARSE_PATTERN ));
113166 sparsePattern -> leadindex = (unsigned int * ) malloc ((n_leadIndex + 1 )* sizeof (unsigned int ));
114167 sparsePattern -> index = (unsigned int * ) malloc (numberOfNonZeros * sizeof (unsigned int ));
@@ -125,7 +178,8 @@ SPARSE_PATTERN* allocSparsePattern(unsigned int n_leadIndex, unsigned int number
125178 *
126179 * @param spp Pointer to sparsity pattern
127180 */
128- void freeSparsePattern (SPARSE_PATTERN * spp ) {
181+ void freeSparsePattern (SPARSE_PATTERN * spp )
182+ {
129183 if (spp != NULL ) {
130184 free (spp -> index ); spp -> index = NULL ;
131185 free (spp -> colorCols ); spp -> colorCols = NULL ;
@@ -141,7 +195,8 @@ void freeSparsePattern(SPARSE_PATTERN *spp) {
141195 * @param filename String for the filename.
142196 * @return FILE* Pointer to sparsity pattern stream.
143197 */
144- FILE * openSparsePatternFile (DATA * data , threadData_t * threadData , const char * filename ) {
198+ FILE * openSparsePatternFile (DATA * data , threadData_t * threadData , const char * filename )
199+ {
145200 FILE * pFile ;
146201 const char * fullPath = NULL ;
147202
@@ -168,7 +223,8 @@ FILE * openSparsePatternFile(DATA* data, threadData_t *threadData, const char* f
168223 * @param color Current color index.
169224 * @param length Number of columns in color `color`.
170225 */
171- void readSparsePatternColor (threadData_t * threadData , FILE * pFile , unsigned int * colorCols , unsigned int color , unsigned int length , unsigned int maxIndex ) {
226+ void readSparsePatternColor (threadData_t * threadData , FILE * pFile , unsigned int * colorCols , unsigned int color , unsigned int length , unsigned int maxIndex )
227+ {
172228 unsigned int i , index ;
173229 size_t count ;
174230
@@ -192,7 +248,8 @@ void readSparsePatternColor(threadData_t* threadData, FILE * pFile, unsigned int
192248 * @param flagValue Flag value of FLAG_JACOBIAN. Can be NULL.
193249 * @return JACOBIAN_METHOD Returns jacobian method that is availble.
194250 */
195- JACOBIAN_METHOD setJacobianMethod (threadData_t * threadData , JACOBIAN_AVAILABILITY availability , const char * flagValue ){
251+ JACOBIAN_METHOD setJacobianMethod (threadData_t * threadData , JACOBIAN_AVAILABILITY availability , const char * flagValue )
252+ {
196253 JACOBIAN_METHOD jacobianMethod = JAC_UNKNOWN ;
197254 assertStreamPrint (threadData , availability != JACOBIAN_UNKNOWN , "Jacobian availablity status is unknown." );
198255
@@ -205,7 +262,7 @@ JACOBIAN_METHOD setJacobianMethod(threadData_t* threadData, JACOBIAN_AVAILABILIT
205262 }
206263 }
207264 // Error case
208- if (jacobianMethod == JAC_UNKNOWN ){
265+ if (jacobianMethod == JAC_UNKNOWN ) {
209266 errorStreamPrint (OMC_LOG_STDOUT , 0 , "Unknown value `%s` for flag `-jacobian`" , flagValue );
210267 infoStreamPrint (OMC_LOG_STDOUT , 1 , "Available options are" );
211268 for (int method = 1 ; method < JAC_MAX ; method ++ ) {
@@ -271,7 +328,8 @@ JACOBIAN_METHOD setJacobianMethod(threadData_t* threadData, JACOBIAN_AVAILABILIT
271328 return jacobianMethod ;
272329}
273330
274- void freeNonlinearPattern (NONLINEAR_PATTERN * nlp ) {
331+ void freeNonlinearPattern (NONLINEAR_PATTERN * nlp )
332+ {
275333 if (nlp != NULL ) {
276334 free (nlp -> indexVar ); nlp -> indexVar = NULL ;
277335 free (nlp -> indexEqn ); nlp -> indexEqn = NULL ;
@@ -280,19 +338,20 @@ void freeNonlinearPattern(NONLINEAR_PATTERN *nlp) {
280338 }
281339}
282340
283- unsigned int * getNonlinearPatternCol (NONLINEAR_PATTERN * nlp , int var_idx ){
341+ unsigned int * getNonlinearPatternCol (NONLINEAR_PATTERN * nlp , int var_idx )
342+ {
284343 unsigned int idx_start = nlp -> indexVar [var_idx ];
285344 unsigned int idx_stop ;
286- if (var_idx == nlp -> numberOfVars ){
345+ if (var_idx == nlp -> numberOfVars ) {
287346 idx_stop = nlp -> numberOfNonlinear ;
288- }else {
347+ } else {
289348 idx_stop = nlp -> indexVar [var_idx + 1 ];
290349 }
291350
292351 unsigned int * col = (unsigned int * ) malloc ((idx_stop - idx_start + 1 )* sizeof (unsigned int ));
293352
294353 int index = 0 ;
295- for (int i = idx_start ; i < idx_stop + 1 ; i ++ ){
354+ for (int i = idx_start ; i < idx_stop + 1 ; i ++ ) {
296355 col [index ] = nlp -> columns [i ];
297356 index ++ ;
298357 }
@@ -305,12 +364,13 @@ unsigned int* getNonlinearPatternCol(NONLINEAR_PATTERN *nlp, int var_idx){
305364 return col ;
306365}
307366
308- unsigned int * getNonlinearPatternRow (NONLINEAR_PATTERN * nlp , int eqn_idx ){
367+ unsigned int * getNonlinearPatternRow (NONLINEAR_PATTERN * nlp , int eqn_idx )
368+ {
309369 unsigned int idx_start = nlp -> indexEqn [eqn_idx ];
310370 unsigned int idx_stop ;
311- if (eqn_idx == nlp -> numberOfEqns ){
371+ if (eqn_idx == nlp -> numberOfEqns ) {
312372 idx_stop = nlp -> numberOfNonlinear ;
313- }else {
373+ } else {
314374 idx_stop = nlp -> indexEqn [eqn_idx + 1 ];
315375 }
316376 //printf(" eqn_idx = %d\n", eqn_idx);
@@ -319,7 +379,7 @@ unsigned int* getNonlinearPatternRow(NONLINEAR_PATTERN *nlp, int eqn_idx){
319379 unsigned int * row = (unsigned int * ) malloc ((idx_stop - idx_start + 1 )* sizeof (unsigned int ));
320380
321381 int index = 0 ;
322- for (int i = idx_start ; i < idx_stop + 1 ; i ++ ){
382+ for (int i = idx_start ; i < idx_stop + 1 ; i ++ ) {
323383 row [index ] = nlp -> rows [i ];
324384 //printf(" row[index] = row[%d] = %d\n", index, row[index]);
325385 index ++ ;
0 commit comments