Linux GNU 11.4.0 Code Coverage Report


Directory: ./
Coverage: low: ≥ 0% medium: ≥ 75.0% high: ≥ 90.0%
Coverage Exec / Excl / Total
Lines: 0.0% 0 / 0 / 251
Functions: 0.0% 0 / 0 / 45
Branches: 0.0% 0 / 0 / 180

OMCompiler/SimulationRuntime/c/simulation/solver/omc_math.c
Line Branch Exec Source
1 /*
2 * This file belongs to the OpenModelica Run-Time System
3 *
4 * Copyright (c) 1998-2026, Open Source Modelica Consortium (OSMC), c/o Linköpings
5 * universitet, Department of Computer and Information Science, SE-58183 Linköping, Sweden. All rights
6 * reserved.
7 *
8 * THIS PROGRAM IS PROVIDED UNDER THE TERMS OF THE BSD NEW LICENSE OR THE
9 * AGPL VERSION 3 LICENSE OR THE OSMC PUBLIC LICENSE (OSMC-PL) VERSION 1.8. ANY
10 * USE, REPRODUCTION OR DISTRIBUTION OF THIS PROGRAM CONSTITUTES RECIPIENT'S
11 * ACCEPTANCE OF THE BSD NEW LICENSE OR THE OSMC PUBLIC LICENSE OR THE AGPL
12 * VERSION 3, ACCORDING TO RECIPIENTS CHOICE.
13 *
14 * The OpenModelica software and the OSMC (Open Source Modelica Consortium) Public License
15 * (OSMC-PL) are obtained from OSMC, either from the above address, from the URLs:
16 * http://www.openmodelica.org or https://github.com/OpenModelica/ or
17 * http://www.ida.liu.se/projects/OpenModelica, and in the OpenModelica distribution. GNU
18 * AGPL version 3 is obtained from: https://www.gnu.org/licenses/licenses.html#GPL. The BSD NEW
19 * License is obtained from: http://www.opensource.org/licenses/BSD-3-Clause.
20 *
21 * This program is distributed WITHOUT ANY WARRANTY; without even the implied warranty of
22 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, EXCEPT AS EXPRESSLY
23 * SET FORTH IN THE BY RECIPIENT SELECTED SUBSIDIARY LICENSE CONDITIONS OF
24 * OSMC-PL.
25 *
26 */
27
28 /*! \file omc_math.c
29 */
30
31 #include <string.h> /* memcpy */
32 #include <math.h>
33
34 #include "../../util/omc_error.h"
35 #include "omc_math.h"
36 #include "../simulation_info_json.h"
37
38 /*! \fn _omc_vector* _omc_allocateVectorData(_omc_size size)
39 *
40 * allocate _omc_vector and memory of size rows for data
41 *
42 * \param [in] [size] Number of elements
43 */
44 ✗ _omc_vector* _omc_allocateVectorData(const _omc_size size) {
45 _omc_vector* vec = NULL;
46 _omc_scalar* data = NULL;
47
48 ✗ assertStreamPrint(NULL, size > 0, "size needs to be greater zero");
49
50 ✗ vec = (_omc_vector*) malloc(sizeof(_omc_vector));
51 ✗ assertStreamPrint(NULL, NULL != vec, "out of memory");
52
53 ✗ data = (_omc_scalar*) malloc(size * sizeof(_omc_scalar));
54 ✗ assertStreamPrint(NULL, NULL != data, "out of memory");
55
56 ✗ vec->size = size;
57 ✗ vec->data = data;
58
59 ✗ return vec;
60 }
61
62 /*! \fn void _omc_deallocateVectorData(_omc_vector* vec)
63 *
64 * free memory in data
65 *
66 * \param [ref] [vec] !TODO: DESCRIBE ME!
67 */
68 ✗ void _omc_deallocateVectorData(_omc_vector* vec) {
69 ✗ free(vec->data);
70 ✗ free(vec);
71 ✗ }
72
73 /*! \fn _omc_vector* _omc_createVector(_omc_size size, _omc_scalar* data)
74 *
75 * creates a _omc_vector with a data of _omc_vector
76 *
77 * \param [in] [size] size of the vector
78 * \param [ref] [data] !TODO: DESCRIBE ME!
79 */
80 ✗ _omc_vector* _omc_createVector(const _omc_size size, _omc_scalar* data) {
81 _omc_vector* vec = NULL;
82 ✗ assertStreamPrint(NULL, size > 0, "size needs to be greater zero");
83
84 ✗ vec = (_omc_vector*) malloc(sizeof(_omc_vector));
85 ✗ assertStreamPrint(NULL, NULL != vec, "out of memory");
86
87 ✗ vec->size = size;
88 ✗ vec->data = data;
89
90 ✗ return vec;
91 }
92
93 /*! \fn void _omc_destroyVector(_omc_vector* vec)
94 *
95 * free _omc_vector
96 *
97 * \param [ref] [vec] !TODO: DESCRIBE ME!
98 */
99 ✗ void _omc_destroyVector(_omc_vector* vec) {
100 ✗ free(vec);
101 ✗ }
102
103 /*! \fn void _omc_copyVector(_omc_vector* dest, const _omc_vector* src)
104 *
105 * creates a new _omc_vector by coping all data
106 *
107 * \param [out] [dest] the destination vector, which need already be allocated
108 * \param [in] [src] the original vector
109 */
110 ✗ void _omc_copyVector(_omc_vector* dest, const _omc_vector* src)
111 {
112 ✗ assertStreamPrint(NULL, dest->size == src->size, "sizes of the vector need to be equal");
113 ✗ memcpy(dest->data, src->data, sizeof(_omc_scalar) * dest->size);
114 ✗ }
115
116 /*! \fn _omc_matrix* _omc_allocateMatrixData(_omc_size rows, _omc_size cols)
117 *
118 * allocate _omc_matrix and memory of size rows*cols for data
119 *
120 * \param [in] [rows] Number of rows
121 * \param [in] [cols] Number of cols
122 */
123 ✗ _omc_matrix* _omc_allocateMatrixData(const _omc_size rows, const _omc_size cols)
124 {
125 _omc_matrix* mat = NULL;
126 _omc_scalar* data = NULL;
127 ✗ assertStreamPrint(NULL, rows > 0, "size of rows need greater zero");
128 ✗ assertStreamPrint(NULL, cols > 0, "size of cols need greater zero");
129
130 ✗ mat = (_omc_matrix*) malloc(sizeof(_omc_matrix));
131 ✗ assertStreamPrint(NULL, NULL != mat, "out of memory");
132
133 ✗ data = (_omc_scalar*) malloc(rows * cols * sizeof(_omc_scalar));
134 assertStreamPrint(NULL, NULL != mat, "data out of memory");
135
136 ✗ mat->rows = rows;
137 ✗ mat->cols = cols;
138 ✗ mat->data = data;
139
140 ✗ return mat;
141 }
142
143 /*! \fn void _omc_deallocateMatrixData(_omc_matrix* mat)
144 *
145 * free memory in data
146 *
147 * \param [ref] [mat] !TODO: DESCRIBE ME!
148 */
149 ✗ void _omc_deallocateMatrixData(_omc_matrix* mat)
150 {
151 ✗ free(mat->data);
152 ✗ free(mat);
153 ✗ }
154
155 /*! \fn _omc_matrix* _omc_createMatrix(_omc_size rows, _omc_size cols, _omc_scalar* data)
156 *
157 * creates a _omc_matrix with a data of _omc_matrix
158 *
159 * \param [in] [rows] Number of rows
160 * \param [in] [cols] Number of cols
161 * \param [ref] [data] !TODO: DESCRIBE ME!
162 */
163 ✗ _omc_matrix* _omc_createMatrix(const _omc_size rows, const _omc_size cols, _omc_scalar* data)
164 {
165 _omc_matrix* mat = NULL;
166 ✗ assertStreamPrint(NULL, rows > 0, "size of rows need greater zero");
167 ✗ assertStreamPrint(NULL, cols > 0, "size of cols need greater zero");
168
169 ✗ mat = (_omc_matrix*) malloc(sizeof(_omc_matrix));
170 ✗ assertStreamPrint(NULL, NULL != mat, "out of memory");
171
172 ✗ mat->rows = rows;
173 ✗ mat->cols = cols;
174 ✗ mat->data = data;
175
176 ✗ return mat;
177 }
178
179 /*! \fn void _omc_destroyMatrix(_omc_matrix* mat)
180 *
181 * free _omc_matrix
182 *
183 * \param [ref] [mat] !TODO: DESCRIBE ME!
184 */
185 ✗ void _omc_destroyMatrix(_omc_matrix* mat)
186 {
187 ✗ free(mat);
188 ✗ }
189
190 /*! \fn _omc_matrix* _omc_copyMatrix(_omc_matrix* mat1)
191 *
192 * creates a new _omc_matrix by coping all data
193 *
194 * \param [in] [mat1] the original matrix
195 */
196 ✗ _omc_matrix* _omc_copyMatrix(_omc_matrix* mat1)
197 {
198 ✗ _omc_matrix* mat = _omc_allocateMatrixData(mat1->rows, mat1->cols);
199 ✗ memcpy(mat->data, mat1->data, sizeof(_omc_scalar) * _omc_getMatrixSize(mat1));
200 ✗ return mat;
201 }
202
203 /*! \fn _omc_scalar* _omc_getVectorData(_omc_vector* vec)
204 *
205 * get data of _omc_vector
206 *
207 * \param [ref] [vec] !TODO: DESCRIBE ME!
208 */
209 ✗ _omc_scalar* _omc_getVectorData(_omc_vector* vec)
210 {
211 ✗ return vec->data;
212 }
213
214 /*! \fn _omc_size _omc_getVectorSize(_omc_vector* vec)
215 *
216 * get size of _omc_vector
217 *
218 * \param [ref] [vec] !TODO: DESCRIBE ME!
219 */
220 ✗ _omc_size _omc_getVectorSize(_omc_vector* vec)
221 {
222 ✗ return vec->size;
223 }
224
225 /*! \fn _omc_scalar _omc_getVectorElement(_omc_vector* vec, _omc_size i)
226 *
227 * get i-th element of _omc_vector
228 *
229 * \param [ref] [vec] !TODO: DESCRIBE ME!
230 * \param [in] [i] element
231 */
232 ✗ _omc_scalar _omc_getVectorElement(_omc_vector* vec, const _omc_size i)
233 {
234 assertStreamPrint(NULL, 0 <= i, "index out of bounds: %d", (int)i);
235 ✗ assertStreamPrint(NULL, i < vec->size, "_omc_vector size %d smaller than %d", (int)vec->size, (int)i);
236 ✗ return vec->data[i];
237 }
238
239 /*! \fn void _omc_setVectorElement(_omc_vector* vec, _omc_size i, _omc_scalar s)
240 *
241 * set i-th element of _omc_vector
242 *
243 * \param [ref] [vec] !TODO: DESCRIBE ME!
244 * \param [in] [i] element
245 * \param [in] [s] !TODO: DESCRIBE ME!
246 */
247 ✗ void _omc_setVectorElement(_omc_vector* vec, const _omc_size i, const _omc_scalar s)
248 {
249 assertStreamPrint(NULL, 0 <= i, "index out of bounds: %d", (int)i);
250 ✗ assertStreamPrint(NULL, i < vec->size, "_omc_vector size %d smaller than %d", (int)vec->size, (int)i);
251 ✗ vec->data[i] = s;
252 ✗ }
253
254 /*! \fn _omc_scalar* _omc_setVectorData(_omc_vector* vec, _omc_scalar* data)
255 *
256 * replaces data of _omc_vector and return the old one
257 *
258 * \param [ref] [vec] !TODO: DESCRIBE ME!
259 * \param [ref] [data*] !TODO: DESCRIBE ME!
260 */
261 ✗ _omc_scalar* _omc_setVectorData(_omc_vector* vec, _omc_scalar* data)
262 {
263 ✗ _omc_scalar* output = vec->data;
264 ✗ vec->data = data;
265 ✗ return output;
266 }
267
268 /*! \fn _omc_scalar* _omc_getMatrixData(_omc_matrix* mat)
269 *
270 * get data of _omc_matrix
271 *
272 * \param [ref] [mat] !TODO: DESCRIBE ME!
273 */
274 ✗ _omc_scalar* _omc_getMatrixData(_omc_matrix* mat)
275 {
276 ✗ return mat->data;
277 }
278
279 /*! \fn _omc_size _omc_getMatrixRows(_omc_matrix* mat)
280 *
281 * get rows size of _omc_matrix
282 *
283 * \param [ref] [mat] !TODO: DESCRIBE ME!
284 */
285 ✗ _omc_size _omc_getMatrixRows(_omc_matrix* mat)
286 {
287 ✗ return mat->rows;
288 }
289
290 /*! \fn _omc_size _omc_getMatrixCols(_omc_matrix* mat)
291 *
292 * get cols size of _omc_matrix
293 *
294 * \param [ref] [mat] !TODO: DESCRIBE ME!
295 */
296 ✗ _omc_size _omc_getMatrixCols(_omc_matrix* mat)
297 {
298 ✗ return mat->cols;
299 }
300
301 /*! \fn _omc_size _omc_getMatrixSize(_omc_matrix* mat)
302 *
303 * get size of _omc_matrix
304 *
305 * \param [ref] [mat] !TODO: DESCRIBE ME!
306 */
307 ✗ _omc_size _omc_getMatrixSize(_omc_matrix* mat)
308 {
309 ✗ return mat->rows * mat->cols;
310 }
311
312 /*! \fn _omc_scalar _omc_getMatrixElement(_omc_matrix* mat, _omc_size i, _omc_size j)
313 *
314 * get (i,j)-th element of _omc_matrix
315 *
316 * \param [ref] [_omc_matrix] !TODO: DESCRIBE ME!
317 * \param [in] [_omc_size] rows
318 * \param [in] [_omc_size] cols
319 */
320 ✗ _omc_scalar _omc_getMatrixElement(_omc_matrix* mat, const _omc_size i, const _omc_size j)
321 {
322 assertStreamPrint(NULL, 0 <= i, "index i out of bounds: %d", (int)i);
323 assertStreamPrint(NULL, 0 <= j, "index j out of bounds: %d", (int)j);
324 ✗ assertStreamPrint(NULL, i < mat->rows, "_omc_matrix rows(%d) too small for %d", (int)mat->rows, (int)i);
325 ✗ assertStreamPrint(NULL, j < mat->cols, "_omc_matrix cols(%d) too small for %d", (int)mat->cols, (int)j);
326 ✗ return mat->data[i + j * mat->cols];
327 }
328
329 /*! \fn void _omc_setMatrixElement(_omc_matrix* mat, _omc_size i, _omc_size j, _omc_scalar s)
330 *
331 * set i-th element of _omc_matrix
332 *
333 * \param [ref] [mat] !TODO: DESCRIBE ME!
334 * \param [in] [i] rows
335 * \param [in] [j] cols
336 * \param [in] [s] !TODO: DESCRIBE ME!
337 */
338 ✗ void _omc_setMatrixElement(_omc_matrix* mat, const _omc_size i, const _omc_size j, _omc_scalar s)
339 {
340 ✗ assertStreamPrint(NULL, i < mat->rows, "_omc_matrix rows(%d) too small for %d", (int)mat->rows, (int)i);
341 ✗ assertStreamPrint(NULL, j < mat->cols, "_omc_matrix cols(%d) too small for %d", (int)mat->cols, (int)j);
342 ✗ mat->data[i + j * mat->cols] = s;
343 ✗ }
344
345 /*! \fn _omc_scalar* _omc_setMatrixData(_omc_matrix* mat, _omc_scalar* data)
346 *
347 * get data of _omc_matrix
348 *
349 * \param [ref] [mat] !TODO: DESCRIBE ME!
350 * \param [in] [data] !TODO: DESCRIBE ME!
351 */
352 ✗ _omc_scalar* _omc_setMatrixData(_omc_matrix* mat, _omc_scalar* data)
353 {
354 ✗ _omc_scalar* output = mat->data;
355 ✗ mat->data = data;
356 ✗ return output;
357 }
358
359
360 /*! \fn _omc_vector* _omc_fillVector(_omc_vector* vec, _omc_scalar s)
361 *
362 * fill all elements of _omc_vector by s
363 *
364 * \param [ref] [vec] !TODO: DESCRIBE ME!
365 * \param [in] [s] !TODO: DESCRIBE ME!
366 */
367 ✗ _omc_vector* _omc_fillVector(_omc_vector* vec, _omc_scalar s)
368 {
369 _omc_size i;
370
371 ✗ assertStreamPrint(NULL, NULL != vec->data, "_omc_vector data is NULL pointer");
372 ✗ for (i = 0; i < vec->size; ++i)
373 {
374 ✗ vec->data[i] = s;
375 }
376
377 ✗ return vec;
378 }
379
380 /*! \fn _omc_vector* _omc_negateVector(_omc_vector* vec)
381 *
382 * negate all elements of _omc_vector
383 *
384 * \param [ref] [_omc_vector] !TODO: DESCRIBE ME!
385 */
386 ✗ _omc_vector* _omc_negateVector(_omc_vector* vec)
387 {
388 _omc_size i;
389
390 ✗ assertStreamPrint(NULL, NULL != vec->data, "_omc_vector data is NULL pointer");
391 ✗ for (i = 0; i < vec->size; ++i)
392 {
393 ✗ vec->data[i] = -vec->data[i];
394 }
395
396 ✗ return vec;
397 }
398
399 /*! \fn _omc_vector* _omc_multiplyScalarVector(_omc_vector* vec, _omc_scalar s)
400 *
401 * multiply all elements of _omc_vector by s
402 *
403 * \param [ref] [vec] !TODO: DESCRIBE ME!
404 * \param [in] [s] !TODO: DESCRIBE ME!
405 */
406 ✗ _omc_vector* _omc_multiplyScalarVector(_omc_vector* vec, _omc_scalar s)
407 {
408 _omc_size i;
409
410 ✗ assertStreamPrint(NULL, NULL != vec->data, "_omc_vector data is NULL pointer");
411 ✗ for (i = 0; i < vec->size; ++i)
412 {
413 ✗ vec->data[i] *= s;
414 }
415
416 ✗ return vec;
417 }
418
419 /*! \fn _omc_vector* _omc_addVector(_omc_vector* dest, _omc_vector* src)
420 *
421 * addition of two vectors to the first one
422 *
423 * \param [ref] [dest] !TODO: DESCRIBE ME!
424 * \param [ref] [src] !TODO: DESCRIBE ME!
425 */
426 ✗ _omc_vector* _omc_addVector(_omc_vector* dest, const _omc_vector* src)
427 {
428 _omc_size i;
429 ✗ assertStreamPrint(NULL, dest->size == src->size,
430 "Vectors have not the same size %d != %d", (int)dest->size, (int)src->size);
431 ✗ assertStreamPrint(NULL, NULL != dest->data, "vector1 data is NULL pointer");
432 ✗ assertStreamPrint(NULL, NULL != src->data, "vector2 data is NULL pointer");
433 ✗ for (i = 0; i < dest->size; ++i) {
434 ✗ dest->data[i] += src->data[i];
435 }
436
437 ✗ return dest;
438 }
439
440 /*! \fn _omc_vector* _omc_subVector(_omc_vector* dest, const _omc_vector* src)
441 *
442 * subtraction of two vectors to the first one
443 *
444 * \param [ref] [dest] !TODO: DESCRIBE ME!
445 * \param [ref] [src] !TODO: DESCRIBE ME!
446 */
447 ✗ _omc_vector* _omc_subVector(_omc_vector* dest, const _omc_vector* src)
448 {
449 _omc_size i;
450 ✗ assertStreamPrint(NULL, src->size == dest->size, "Vectors have not the same size %d != %d", (int)src->size, (int)dest->size);
451 ✗ assertStreamPrint(NULL, NULL != dest->data, "vector1 data is NULL pointer");
452 ✗ assertStreamPrint(NULL, NULL != src->data, "vector2 data is NULL pointer");
453 ✗ for (i = 0; i < dest->size; ++i)
454 {
455 ✗ dest->data[i] -= src->data[i];
456 }
457
458 ✗ return dest;
459 }
460
461 /*! \fn _omc_vector* _omc_addVectorVector(_omc_vector dest, const _omc_vector* vec1, const _omc_vector* vec2)
462 *
463 * addition of two vectors in a third one
464 *
465 * \param [ref] [dest] !TODO: DESCRIBE ME!
466 * \param [ref] [vec1] !TODO: DESCRIBE ME!
467 * \param [ref] [vec2] !TODO: DESCRIBE ME!
468 */
469 ✗ _omc_vector* _omc_addVectorVector(_omc_vector* dest, const _omc_vector* vec1, const _omc_vector* vec2)
470 {
471 _omc_size i;
472 ✗ assertStreamPrint(NULL, vec1->size == vec2->size && dest->size == vec1->size,
473 "Vectors have not the same size %d != %d != %d", (int)dest->size, (int)vec1->size, (int)vec2->size);
474 ✗ assertStreamPrint(NULL, NULL != vec1->data, "vector1 data is NULL pointer");
475 ✗ assertStreamPrint(NULL, NULL != vec2->data, "vector2 data is NULL pointer");
476 ✗ assertStreamPrint(NULL, NULL != dest->data, "destination data is NULL pointer");
477 ✗ for (i = 0; i < vec1->size; ++i) {
478 ✗ dest->data[i] = vec1->data[i] + vec2->data[i];
479 }
480
481 ✗ return dest;
482 }
483
484 /*! \fn _omc_vector* _omc_subVectorVector(_omc_vector* dest, const _omc_vector* vec1, const _omc_vector* vec2)
485 *
486 * subtraction of vec2 from vec1 in a third one
487 *
488 * \param [ref] [dest] !TODO: DESCRIBE ME!
489 * \param [ref] [vec1] !TODO: DESCRIBE ME!
490 * \param [ref] [vec2] !TODO: DESCRIBE ME!
491 */
492 ✗ _omc_vector* _omc_subVectorVector(_omc_vector* dest, const _omc_vector* vec1, const _omc_vector* vec2)
493 {
494 _omc_size i;
495 ✗ assertStreamPrint(NULL, vec1->size == vec2->size && dest->size == vec1->size,
496 "Vectors have not the same size %d != %d", (int)vec1->size, (int)vec2->size);
497 ✗ assertStreamPrint(NULL, NULL != vec1->data, "vector1 data is NULL pointer");
498 ✗ assertStreamPrint(NULL, NULL != vec2->data, "vector2 data is NULL pointer");
499 ✗ assertStreamPrint(NULL, NULL != dest->data, "destination data is NULL pointer");
500 ✗ for (i = 0; i < vec1->size; ++i)
501 {
502 ✗ dest->data[i] = vec1->data[i] - vec2->data[i];
503 }
504
505 ✗ return dest;
506 }
507
508 /*! \fn _omc_scalar _omc_scalarProduct(_omc_vector* vec1, _omc_vector* vec2)
509 *
510 * _omc_vector multiplication of two vectors
511 *
512 * \param [ref] [vec1] !TODO: DESCRIBE ME!
513 * \param [ref] [vec2] !TODO: DESCRIBE ME!
514 */
515 ✗ _omc_scalar _omc_scalarProduct(const _omc_vector* vec1, const _omc_vector* vec2)
516 {
517 _omc_size i;
518 ✗ _omc_size m = vec1->size, n = vec2->size;
519 _omc_scalar result = 0;
520 ✗ assertStreamPrint(NULL, m == n, "Vectors size doesn't match to multiply %d != %d ", (int)m, (int)n);
521 ✗ assertStreamPrint(NULL, NULL != vec1->data, "vector1 data is NULL pointer");
522 ✗ assertStreamPrint(NULL, NULL != vec2->data, "vector2 data is NULL pointer");
523 ✗ for (i = 0; i < n; ++i)
524 {
525 ✗ result += vec1->data[i] * vec2->data[i];
526 }
527
528 ✗ return result;
529 }
530
531 /*! \fn _omc_scalar _omc_sumVector(_omc_vector* vec)
532 *
533 * calculates the sum of all elements of the vector
534 *
535 * \param [ref] [_omc_vector] !TODO: DESCRIBE ME!
536 */
537 ✗ _omc_scalar _omc_sumVector(const _omc_vector* vec) {
538 _omc_size i;
539 _omc_scalar sum = 0;
540 ✗ assertStreamPrint(NULL, NULL != vec->data, "vector data is NULL pointer");
541 ✗ for (i = 0; i < vec->size; ++i)
542 {
543 ✗ sum += vec->data[i];
544 }
545
546 ✗ return sum;
547 }
548
549 /*! \fn _omc_matrix* _omc_fillMatrix(_omc_matrix* mat, _omc_scalar s)
550 *
551 * fill all elements of _omc_matrix by s
552 *
553 * \param [ref] [mat] !TODO: DESCRIBE ME!
554 * \param [in] [s] !TODO: DESCRIBE ME!
555 */
556 ✗ _omc_matrix* _omc_fillMatrix(_omc_matrix* mat, _omc_scalar s) {
557 _omc_size i;
558 ✗ _omc_size size = mat->rows * mat->cols;
559 ✗ assertStreamPrint(NULL, NULL != mat->data, "_omc_matrix data is NULL pointer");
560 ✗ for (i = 0; i < size; ++i) {
561 ✗ mat->data[i] = s;
562 }
563
564 ✗ return mat;
565 }
566
567 /*! \fn _omc_matrix* _omc_fillIndentityMatrix(_omc_matrix* mat)
568 *
569 * fill identity _omc_matrix
570 *
571 * \param [ref] [mat] !TODO: DESCRIBE ME!
572 */
573 ✗ _omc_matrix* _omc_fillIndentityMatrix(_omc_matrix* mat)
574 {
575 _omc_size i, min;
576 ✗ assertStreamPrint(NULL, NULL != mat->data, "_omc_matrix data is NULL pointer");
577 ✗ mat = _omc_fillMatrix(mat, 0);
578 ✗ min = mat->rows <= mat->cols ? mat->rows : mat->cols;
579 ✗ for (i = 0; i < min; ++i)
580 {
581 ✗ _omc_setMatrixElement(mat, i, i, 1.0);
582 }
583
584 ✗ return mat;
585 }
586
587 /*! \fn _omc_matrix* _omc_negateMatrix(_omc_matrix* mat)
588 *
589 * negate all elements of _omc_matrix
590 *
591 * \param [ref] [mat] !TODO: DESCRIBE ME!
592 */
593 ✗ _omc_matrix* _omc_negateMatrix(_omc_matrix* mat)
594 {
595 ✗ _omc_size i, size = mat->rows * mat->cols;
596 ✗ assertStreamPrint(NULL, NULL != mat->data, "_omc_matrix data is NULL pointer");
597 ✗ for (i = 0; i < size; ++i) {
598 ✗ mat->data[i] = -mat->data[i];
599 }
600
601 ✗ return mat;
602 }
603
604 /*! \fn _omc_matrix* _omc_multiplyScalarMatrix(_omc_matrix* mat, _omc_scalar s)
605 *
606 * multiply all elements of _omc_matrix by s
607 *
608 * \param [ref] [mat] !TODO: DESCRIBE ME!
609 * \param [in] [s] !TODO: DESCRIBE ME!
610 */
611 ✗ _omc_matrix* _omc_multiplyScalarMatrix(_omc_matrix* mat, _omc_scalar s)
612 {
613 ✗ _omc_size i, size = mat->rows * mat->cols;
614 ✗ assertStreamPrint(NULL, NULL != mat->data, "_omc_matrix data is NULL pointer");
615 ✗ for (i = 0; i < size; ++i)
616 {
617 ✗ mat->data[i] *= s;
618 }
619
620 ✗ return mat;
621 }
622
623 /*! \fn _omc_matrix* _omc_addMatrixMatrix(_omc_matrix* mat1, _omc_matrix* mat2)
624 *
625 * addition of two matrixs to the first one
626 *
627 * \param [ref] [mat1] !TODO: DESCRIBE ME!
628 * \param [ref] [mat2] !TODO: DESCRIBE ME!
629 */
630 ✗ _omc_matrix* _omc_addMatrixMatrix(_omc_matrix* mat1, _omc_matrix* mat2)
631 {
632 _omc_size i, j;
633 ✗ assertStreamPrint(NULL, mat1->rows == mat2->rows && mat1->cols == mat2->cols,
634 "matrixes have not the same size ((%d,%d)!=(%d,%d))",
635 (int)mat1->rows, (int)mat1->cols, (int)mat2->rows, (int)mat2->cols);
636 ✗ assertStreamPrint(NULL, NULL != mat1->data, "matrix1 data is NULL pointer");
637 ✗ assertStreamPrint(NULL, NULL != mat2->data, "matrix2 data is NULL pointer");
638 ✗ for (i = 0; i < mat1->rows; ++i) {
639 ✗ for (j = 0; j < mat1->cols; ++j) {
640 ✗ _omc_setMatrixElement(mat1, i, j,
641 ✗ _omc_getMatrixElement(mat1, i, j)
642 ✗ + _omc_getMatrixElement(mat2, i, j));
643 }
644 }
645
646 ✗ return mat1;
647 }
648
649 /*! \fn _omc_matrix* _omc_subtractMatrixMatrix(_omc_matrix* mat1, _omc_matrix* mat2)
650 *
651 * subtraction of two matrixs to the first one
652 *
653 * \param [ref] [mat1] !TODO: DESCRIBE ME!
654 * \param [ref] [mat2] !TODO: DESCRIBE ME!
655 */
656 ✗ _omc_matrix* _omc_subtractMatrixMatrix(_omc_matrix* mat1, _omc_matrix* mat2)
657 {
658 _omc_size i, j;
659 ✗ assertStreamPrint(NULL, mat1->rows == mat2->rows && mat1->cols == mat2->cols,
660 "matrixes have not the same size ((%d,%d)!=(%d,%d))",
661 (int)mat1->rows, (int)mat1->cols, (int)mat2->rows, (int)mat2->cols);
662 ✗ assertStreamPrint(NULL, NULL != mat1->data, "matrix1 data is NULL pointer");
663 ✗ assertStreamPrint(NULL, NULL != mat2->data, "matrix2 data is NULL pointer");
664 ✗ for (i = 0; i < mat1->rows; ++i) {
665 ✗ for (j = 0; j < mat1->cols; ++j) {
666 ✗ _omc_setMatrixElement(mat1, i, j,
667 ✗ _omc_getMatrixElement(mat1, i, j)
668 ✗ - _omc_getMatrixElement(mat2, i, j));
669 }
670 }
671
672 ✗ return mat1;
673 }
674
675 /*! \fn _omc_matrix* _omc_multiplyMatrixMatrix(_omc_matrix* mat1, _omc_matrix* mat2)
676 *
677 * _omc_matrix multiplication of two matrixes into matrix one
678 *
679 * \param [ref] [mat1] !TODO: DESCRIBE ME!
680 * \param [ref] [mat2] !TODO: DESCRIBE ME!
681 */
682 ✗ _omc_matrix* _omc_multiplyMatrixMatrix(_omc_matrix* mat1, _omc_matrix* mat2)
683 {
684 _omc_size i, j, k;
685 ✗ _omc_size l = mat1->rows, m = mat1->cols, n = mat2->cols;
686 ✗ assertStreamPrint(NULL, mat1->cols == mat2->rows,
687 "matrixes size doesn't match to multiply"
688 "(%d!=%d)", (int)mat1->cols, (int)mat2->rows);
689 ✗ assertStreamPrint(NULL, NULL != mat1->data, "matrix1 data is NULL pointer");
690 ✗ assertStreamPrint(NULL, NULL != mat2->data, "matrix2 data is NULL pointer");
691 ✗ for (i = 0; i < l; ++i) {
692 ✗ for (j = 0; j < n; ++j) {
693 ✗ for (k = 0; k < m; ++k) {
694 ✗ _omc_setMatrixElement(mat1, i, j,
695 ✗ _omc_getMatrixElement(mat1, i, k)
696 ✗ * _omc_getMatrixElement(mat2, k, j));
697 }
698 }
699 }
700
701 ✗ return mat1;
702 }
703
704 /**
705 * @brief Print vector and equation info to stream.
706 *
707 * @param vec Vector.
708 * @param name Name of vector.
709 * @param stream Log stream.
710 * @param eqnInfo Information about equation
711 */
712 ✗ void _omc_printVectorWithEquationInfo(_omc_vector* vec, const char* name, const enum OMC_LOG_STREAM stream, EQUATION_INFO eqnInfo)
713 {
714 _omc_size i;
715
716 ✗ if (!OMC_ACTIVE_STREAM(stream))
717 return;
718
719 ✗ assertStreamPrint(NULL, NULL != vec->data, "Vector data is NULL pointer");
720
721 ✗ infoStreamPrint(stream, 1, "%s", name);
722 ✗ for (i = 0; i < vec->size; ++i)
723 {
724 ✗ infoStreamPrint(stream, 0, "[%3d] %-40s = %20.12g", (int)i+1, eqnInfo.vars[i], vec->data[i]);
725 }
726 ✗ messageClose(stream);
727 }
728
729 /**
730 * @brief Print vector to stream.
731 *
732 * @param vec Vector.
733 * @param name Name of vector.
734 * @param stream Log stream.
735 */
736 ✗ void _omc_printVector(_omc_vector* vec, const char* name, const enum OMC_LOG_STREAM stream)
737 {
738 _omc_size i;
739
740 ✗ if (!OMC_ACTIVE_STREAM(stream))
741 return;
742
743 ✗ assertStreamPrint(NULL, NULL != vec->data, "Vector data is NULL pointer");
744
745 ✗ infoStreamPrint(stream, 1, "%s", name);
746 ✗ for (i = 0; i < vec->size; ++i)
747 {
748 ✗ infoStreamPrint(stream, 0, "[%2d] %20.12g", (int)i+1, vec->data[i]);
749 }
750 ✗ messageClose(stream);
751 }
752
753 /**
754 * @brief Print matrix to stream.
755 *
756 * @param mat Matrix.
757 * @param name Name of matrix.
758 * @param stream Log stream.
759 */
760 ✗ void _omc_printMatrix(_omc_matrix* mat, const char* name, const enum OMC_LOG_STREAM stream) {
761 ✗ if (OMC_ACTIVE_STREAM(stream))
762 {
763 _omc_size i, j;
764 ✗ char *buffer = (char*)malloc(sizeof(char)*mat->cols*20);
765
766 ✗ assertStreamPrint(NULL, NULL != mat->data, "matrix data is NULL pointer");
767
768 ✗ infoStreamPrint(stream, 1, "%s", name);
769 ✗ for (i = 0; i < mat->rows; ++i)
770 {
771 char *p = buffer;
772 ✗ for (j = 0; j < mat->cols; ++j)
773 {
774 ✗ p += sprintf(p, "%10g ", _omc_getMatrixElement(mat, i, j));
775 }
776 ✗ infoStreamPrint(stream, 0, "%s", buffer);
777 }
778 ✗ messageClose(stream);
779 ✗ free(buffer);
780 }
781 ✗ }
782
783 /**
784 * @brief Euclidean vector norm.
785 *
786 * ||x||_2 := sqrt(x_1^2 + ... + x_n^2)
787 *
788 * @param vec OMC vector.
789 * @return _omc_scalar Vector norm.
790 */
791 ✗ _omc_scalar _omc_euclideanVectorNorm(const _omc_vector* vec)
792 {
793 ✗ return _omc_gen_euclideanVectorNorm(vec->data, vec->size);
794 }
795
796 /**
797 * @brief Euclidean vector norm.
798 *
799 * ||x||_2 := sqrt(x_1^2 + ... + x_n^2)
800 *
801 * @param vec_data Array with vector.
802 * @param vec_size Length of array vec_data.
803 * @return _omc_scalar Vector norm.
804 */
805 ✗ _omc_scalar _omc_gen_euclideanVectorNorm(const _omc_scalar* vec_data, const _omc_size vec_size)
806 {
807 _omc_size i;
808 _omc_scalar result = 0;
809 ✗ assertStreamPrint(NULL, vec_size > 0, "Vector size is greater than zero");
810 ✗ assertStreamPrint(NULL, NULL != vec_data, "Vector data is NULL pointer");
811 ✗ for (i = 0; i < vec_size; i++) {
812 ✗ result += vec_data[i]*vec_data[i];
813 }
814
815 ✗ return sqrt(result);
816 }
817
818 /**
819 * @brief Maximum / Infinity vector norm.
820 *
821 * ||x||_max := max(|x_1|, ..., |x_n|)
822 *
823 * @param vec OMC vector.
824 * @return _omc_scalar Vector norm.
825 */
826 ✗ _omc_scalar _omc_maximumVectorNorm(const _omc_vector* vec)
827 {
828 ✗ return _omc_gen_maximumVectorNorm(vec->data, vec->size);
829 }
830
831 /**
832 * @brief Maximum / Infinity vector norm.
833 *
834 * ||x||_max := max(|x_1|, ..., |x_n|)
835 *
836 * @param vec_data Array with vector.
837 * @param vec_size Length of array vec_data.
838 * @return _omc_scalar Vector norm.
839 */
840 ✗ _omc_scalar _omc_gen_maximumVectorNorm(const _omc_scalar* vec_data, const _omc_size vec_size) {
841 _omc_size i;
842 _omc_scalar norm;
843 ✗ assertStreamPrint(NULL, vec_size > 0, "Vector size is greater the zero");
844 ✗ assertStreamPrint(NULL, NULL != vec_data, "Vector data is NULL pointer");
845 ✗ norm = fabs(vec_data[0]);
846 ✗ for (i = 1; i < vec_size; i++)
847 {
848 ✗ norm = fmax(fabs(vec_data[i]), norm);
849 }
850
851 ✗ return norm;
852 }
853