OMCompiler/SimulationRuntime/cpp/Core/System/SimVars.cpp
| 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 | /** @addtogroup coreSystem | ||
| 29 | * | ||
| 30 | * @{ | ||
| 31 | */ | ||
| 32 | #include <Core/ModelicaDefine.h> | ||
| 33 | #include <Core/Modelica.h> | ||
| 34 | |||
| 35 | #include <Core/System/FactoryExport.h> | ||
| 36 | #include <Core/System/SimVars.h> | ||
| 37 | |||
| 38 | /** | ||
| 39 | * Constructor for SimVars, stores all model variable in continuous block of memory | ||
| 40 | * @param dim_real number of all real variables (real algebraic vars,discrete algebraic vars, state vars, der state vars) | ||
| 41 | * @param dim_int number of all integer variables integer algebraic vars | ||
| 42 | * @param dim_bool number of all bool variables (boolean algebraic vars) | ||
| 43 | * @param dim_string number of all string variables (string algebraic vars) | ||
| 44 | * @param dim_pre_vars number of all pre variables (real algebraic vars,discrete algebraic vars, boolean algebraic vars, integer algebraic vars, state vars, der state vars) | ||
| 45 | * @param dim_state_vars number of all state variables | ||
| 46 | * @param state_index start index of state vector in real_vars list | ||
| 47 | */ | ||
| 48 | 43 | SimVars::SimVars(size_t dim_real, size_t dim_int, size_t dim_bool, size_t dim_string, size_t dim_pre_vars, size_t dim_state_vars, size_t state_index) | |
| 49 | { | ||
| 50 | 43 | create(dim_real, dim_int, dim_bool, dim_string, dim_pre_vars, dim_state_vars, state_index); | |
| 51 | 43 | } | |
| 52 | |||
| 53 | ✗ | SimVars::SimVars(SimVars& instance) | |
| 54 | { | ||
| 55 | ✗ | create(instance.getDimReal(), instance.getDimInt(), instance.getDimBool(), instance.getDimString(), instance.getDimPreVars(), instance.getDimStateVars(), instance.getStateVectorIndex()); | |
| 56 | ✗ | setRealVarsVector(instance.getRealVarsVector()); | |
| 57 | ✗ | setIntVarsVector(instance.getIntVarsVector()); | |
| 58 | ✗ | setBoolVarsVector(instance.getBoolVarsVector()); | |
| 59 | ✗ | setStringVarsVector(instance.getStringVarsVector()); | |
| 60 | ✗ | } | |
| 61 | |||
| 62 | 43 | void SimVars::create(size_t dim_real, size_t dim_int, size_t dim_bool, size_t dim_string, size_t dim_pre_vars, size_t dim_state_vars, size_t state_index) | |
| 63 | { | ||
| 64 | 43 | _dim_real = dim_real; | |
| 65 | 43 | _dim_int = dim_int; | |
| 66 | 43 | _dim_bool = dim_bool; | |
| 67 | 43 | _dim_string = dim_string; | |
| 68 | 43 | _dim_pre_vars = dim_pre_vars; | |
| 69 | 43 | _dim_z = dim_state_vars; | |
| 70 | 43 | _z_i = state_index; | |
| 71 | |||
| 72 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 43 times.
|
43 | if (_dim_real + _dim_int + _dim_bool > _dim_pre_vars) |
| 73 | ✗ | throw std::runtime_error("Wrong pre variable size"); | |
| 74 | //allocate memory for all model variables | ||
| 75 |
2/2✓ Branch 0 taken 9 times.
✓ Branch 1 taken 34 times.
|
43 | if (dim_string > 0) { |
| 76 |
3/4✓ Branch 0 taken 9 times.
✗ Branch 1 not taken.
✓ Branch 3 taken 57 times.
✓ Branch 4 taken 9 times.
|
66 | _string_vars = new string[dim_string]; |
| 77 |
2/2✓ Branch 1 taken 57 times.
✓ Branch 2 taken 9 times.
|
66 | _pre_string_vars = new string[dim_string]; |
| 78 | } | ||
| 79 | else { | ||
| 80 | 34 | _string_vars = NULL; | |
| 81 | 34 | _pre_string_vars = NULL; | |
| 82 | } | ||
| 83 |
2/2✓ Branch 0 taken 28 times.
✓ Branch 1 taken 15 times.
|
43 | if (dim_bool > 0) { |
| 84 | 28 | _bool_vars = (bool*)alignedMalloc(sizeof(bool) * dim_bool, 64); | |
| 85 | 28 | _pre_bool_vars = (bool*)alignedMalloc(sizeof(bool) * dim_bool, 64); | |
| 86 | } | ||
| 87 | else { | ||
| 88 | 15 | _bool_vars = NULL; | |
| 89 | 15 | _pre_bool_vars = NULL; | |
| 90 | } | ||
| 91 |
2/2✓ Branch 0 taken 24 times.
✓ Branch 1 taken 19 times.
|
43 | if (dim_int > 0) { |
| 92 | 24 | _int_vars = (int*)alignedMalloc(sizeof(int) * dim_int, 64); | |
| 93 | 24 | _pre_int_vars = (int*)alignedMalloc(sizeof(int) * dim_int, 64); | |
| 94 | } | ||
| 95 | else { | ||
| 96 | 19 | _int_vars = NULL; | |
| 97 | 19 | _pre_int_vars = NULL; | |
| 98 | } | ||
| 99 |
2/2✓ Branch 0 taken 42 times.
✓ Branch 1 taken 1 time.
|
43 | if (dim_real > 0) { |
| 100 | 42 | _real_vars = (double*)alignedMalloc(sizeof(double) * dim_real, 64); | |
| 101 | 42 | _pre_real_vars = (double*)alignedMalloc(sizeof(double) * dim_real, 64); | |
| 102 | } | ||
| 103 | else { | ||
| 104 | 1 | _real_vars = NULL; | |
| 105 | 1 | _pre_real_vars = NULL; | |
| 106 | } | ||
| 107 | |||
| 108 | //initialize all model variables | ||
| 109 |
2/2✓ Branch 0 taken 9 times.
✓ Branch 1 taken 34 times.
|
43 | if(dim_string > 0) |
| 110 | 18 | std::fill(_string_vars, _string_vars + dim_string, string()); | |
| 111 |
2/2✓ Branch 0 taken 28 times.
✓ Branch 1 taken 15 times.
|
43 | if (dim_bool > 0) |
| 112 | 28 | std::fill(_bool_vars, _bool_vars + dim_bool, false); | |
| 113 |
2/2✓ Branch 0 taken 24 times.
✓ Branch 1 taken 19 times.
|
43 | if (dim_int > 0) |
| 114 | 24 | std::fill(_int_vars, _int_vars + dim_int, 0); | |
| 115 |
2/2✓ Branch 0 taken 42 times.
✓ Branch 1 taken 1 time.
|
43 | if (dim_real > 0) |
| 116 | 42 | std::fill(_real_vars, _real_vars + dim_real, 0.0); | |
| 117 | 43 | } | |
| 118 | |||
| 119 | 86 | SimVars::~SimVars() | |
| 120 | { | ||
| 121 |
2/2✓ Branch 0 taken 42 times.
✓ Branch 1 taken 1 time.
|
43 | if(_pre_real_vars) |
| 122 | 42 | alignedFree(_pre_real_vars); | |
| 123 |
2/2✓ Branch 0 taken 42 times.
✓ Branch 1 taken 1 time.
|
43 | if(_real_vars) |
| 124 | 42 | alignedFree(_real_vars); | |
| 125 |
2/2✓ Branch 0 taken 24 times.
✓ Branch 1 taken 19 times.
|
43 | if(_pre_int_vars) |
| 126 | 24 | alignedFree(_pre_int_vars); | |
| 127 |
2/2✓ Branch 0 taken 24 times.
✓ Branch 1 taken 19 times.
|
43 | if(_int_vars) |
| 128 | 24 | alignedFree(_int_vars); | |
| 129 |
2/2✓ Branch 0 taken 28 times.
✓ Branch 1 taken 15 times.
|
43 | if(_pre_bool_vars) |
| 130 | 28 | alignedFree(_pre_bool_vars); | |
| 131 |
2/2✓ Branch 0 taken 28 times.
✓ Branch 1 taken 15 times.
|
43 | if(_bool_vars) |
| 132 | 28 | alignedFree(_bool_vars); | |
| 133 |
2/2✓ Branch 0 taken 9 times.
✓ Branch 1 taken 34 times.
|
43 | if(_string_vars) |
| 134 |
4/4✓ Branch 0 taken 57 times.
✓ Branch 1 taken 9 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 55 times.
|
66 | delete [] _string_vars; |
| 135 |
2/2✓ Branch 0 taken 9 times.
✓ Branch 1 taken 34 times.
|
43 | if(_pre_string_vars) |
| 136 |
4/4✓ Branch 0 taken 57 times.
✓ Branch 1 taken 9 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 55 times.
|
66 | delete [] _pre_string_vars; |
| 137 | 86 | } | |
| 138 | |||
| 139 | ✗ | ISimVars* SimVars::clone() | |
| 140 | { | ||
| 141 | ✗ | return new SimVars(*this); | |
| 142 | } | ||
| 143 | |||
| 144 | //see: http://stackoverflow.com/questions/12504776/aligned-malloc-in-c | ||
| 145 | 188 | void* SimVars::alignedMalloc(size_t required_bytes, size_t alignment) | |
| 146 | { | ||
| 147 | void *p1; | ||
| 148 | void **p2; | ||
| 149 | |||
| 150 | 188 | size_t offset = alignment - 1 + sizeof(void*); | |
| 151 | 188 | p1 = malloc(required_bytes + offset); | |
| 152 | 188 | p2=(void**)(((size_t)(p1)+offset)&~(alignment-1)); | |
| 153 | 188 | p2[-1]=p1; | |
| 154 | 188 | return p2; | |
| 155 | } | ||
| 156 | |||
| 157 | 188 | void SimVars::alignedFree(void* p) | |
| 158 | { | ||
| 159 | 188 | void* p1 = ((void**)p)[-1]; // get the pointer to the buffer we allocated | |
| 160 | 188 | free( p1 ); | |
| 161 | 188 | } | |
| 162 | |||
| 163 | /** | ||
| 164 | * \brief Initialize scalar real model variables in simvars memory | ||
| 165 | * \param [in] i index in simvars memory | ||
| 166 | * \return simvar variable | ||
| 167 | */ | ||
| 168 | 1151 | double& SimVars::initRealVar(size_t i) | |
| 169 | { | ||
| 170 |
1/2✓ Branch 0 taken 1151 times.
✗ Branch 1 not taken.
|
1151 | if (i < _dim_real) |
| 171 | 1151 | return _real_vars[i]; | |
| 172 | else | ||
| 173 | ✗ | throw std::runtime_error("Wrong variable index"); | |
| 174 | } | ||
| 175 | /** | ||
| 176 | * \brief Initialize scalar integer model variables in simvars memory | ||
| 177 | * \param [in] i index in simvars memory | ||
| 178 | * \return simvar variable | ||
| 179 | */ | ||
| 180 | 73 | int& SimVars::initIntVar(size_t i) | |
| 181 | { | ||
| 182 |
1/2✓ Branch 0 taken 73 times.
✗ Branch 1 not taken.
|
73 | if (i < _dim_int) |
| 183 | 73 | return _int_vars[i]; | |
| 184 | else | ||
| 185 | ✗ | throw std::runtime_error("Wrong variable index"); | |
| 186 | } | ||
| 187 | /** | ||
| 188 | * \brief Initialize scalar boolean model variables in simvars memory | ||
| 189 | * \param [in] i index in simvars memory | ||
| 190 | * \return simvar variable | ||
| 191 | */ | ||
| 192 | 134 | bool& SimVars::initBoolVar(size_t i) | |
| 193 | { | ||
| 194 |
1/2✓ Branch 0 taken 134 times.
✗ Branch 1 not taken.
|
134 | if (i < _dim_bool) |
| 195 | 134 | return _bool_vars[i]; | |
| 196 | else | ||
| 197 | ✗ | throw std::runtime_error("Wrong variable index"); | |
| 198 | } | ||
| 199 | /** | ||
| 200 | * \brief read scalar real model variables from simvars memory | ||
| 201 | * \param [in] i index in simvars memory | ||
| 202 | * \return simvar variable | ||
| 203 | */ | ||
| 204 | 1955 | const double& SimVars::getRealVar(size_t i) | |
| 205 | { | ||
| 206 |
1/2✓ Branch 0 taken 1955 times.
✗ Branch 1 not taken.
|
1955 | if (i < _dim_real) |
| 207 | 1955 | return _real_vars[i]; | |
| 208 | else | ||
| 209 | ✗ | throw std::runtime_error("Wrong variable index"); | |
| 210 | } | ||
| 211 | /** | ||
| 212 | * \brief read scalar integer model variables from simvars memory | ||
| 213 | * \param [in] i index in simvars memory | ||
| 214 | * \return simvar variable | ||
| 215 | */ | ||
| 216 | 867 | const int& SimVars::getIntVar(size_t i) | |
| 217 | { | ||
| 218 |
1/2✓ Branch 0 taken 867 times.
✗ Branch 1 not taken.
|
867 | if (i < _dim_int) |
| 219 | 867 | return _int_vars[i]; | |
| 220 | else | ||
| 221 | ✗ | throw std::runtime_error("Wrong variable index"); | |
| 222 | } | ||
| 223 | /** | ||
| 224 | * \brief Read scalar boolean model variables from simvars memory | ||
| 225 | * \param [in] i index in simvars memory | ||
| 226 | * \return simvar variable | ||
| 227 | */ | ||
| 228 | 928 | const bool& SimVars::getBoolVar(size_t i) | |
| 229 | { | ||
| 230 |
1/2✓ Branch 0 taken 928 times.
✗ Branch 1 not taken.
|
928 | if (i < _dim_bool) |
| 231 | 928 | return _bool_vars[i]; | |
| 232 | else | ||
| 233 | ✗ | throw std::runtime_error("Wrong variable index"); | |
| 234 | } | ||
| 235 | ✗ | const std::string& SimVars::getStringVar(size_t i) | |
| 236 | { | ||
| 237 | ✗ | if (i < _dim_string) | |
| 238 | ✗ | return _string_vars[i]; | |
| 239 | else | ||
| 240 | ✗ | throw std::runtime_error("Wrong variable index"); | |
| 241 | } | ||
| 242 | |||
| 243 | ✗ | string& SimVars::initStringVar(size_t i) | |
| 244 | { | ||
| 245 | ✗ | if (i < _dim_string) | |
| 246 | ✗ | return _string_vars[i]; | |
| 247 | else | ||
| 248 | ✗ | throw std::runtime_error("Wrong variable index"); | |
| 249 | } | ||
| 250 | |||
| 251 | /** | ||
| 252 | * \brief returns state vector of size dim_z | ||
| 253 | * \return Return_Description | ||
| 254 | * \details pointer to the state variable vector | ||
| 255 | */ | ||
| 256 | 43 | double* SimVars::getStateVector() | |
| 257 | { | ||
| 258 |
1/2✓ Branch 0 taken 43 times.
✗ Branch 1 not taken.
|
43 | if (_z_i + _dim_z <= _dim_real) |
| 259 |
2/2✓ Branch 0 taken 42 times.
✓ Branch 1 taken 1 time.
|
43 | return _dim_real > 0 ? &_real_vars[_z_i] : NULL; |
| 260 | else | ||
| 261 | ✗ | throw std::runtime_error("Wrong state vars start index"); | |
| 262 | } | ||
| 263 | /** | ||
| 264 | * \brief returns der state vector of size dim_z | ||
| 265 | * \return pointer to the der state variable vector | ||
| 266 | * \details Details | ||
| 267 | */ | ||
| 268 | 83 | double* SimVars::getDerStateVector() | |
| 269 | { | ||
| 270 |
1/2✓ Branch 0 taken 83 times.
✗ Branch 1 not taken.
|
83 | if (_z_i + 2*_dim_z <= _dim_real) |
| 271 |
2/2✓ Branch 0 taken 81 times.
✓ Branch 1 taken 2 times.
|
83 | return _dim_real > 0 ? &_real_vars[_z_i + _dim_z] : NULL; |
| 272 | else | ||
| 273 | ✗ | throw std::runtime_error("Wrong der state vars start index"); | |
| 274 | } | ||
| 275 | /** | ||
| 276 | * \brief returns real vars vector of size dim_real | ||
| 277 | * \return pointer to the real variable vector | ||
| 278 | * \details Details | ||
| 279 | */ | ||
| 280 | 84 | double* SimVars::getRealVarsVector() const | |
| 281 | { | ||
| 282 |
2/2✓ Branch 0 taken 2 times.
✓ Branch 1 taken 82 times.
|
84 | if(!_real_vars) |
| 283 | 2 | return NULL; | |
| 284 | return _real_vars; | ||
| 285 | } | ||
| 286 | /** | ||
| 287 | * \brief returns int vars vector of size dim_int | ||
| 288 | * \return pointer to the integer variable vector | ||
| 289 | * \details Details | ||
| 290 | */ | ||
| 291 | 83 | int* SimVars::getIntVarsVector() const | |
| 292 | { | ||
| 293 |
2/2✓ Branch 0 taken 36 times.
✓ Branch 1 taken 47 times.
|
83 | if(!_int_vars) |
| 294 | 36 | return NULL; | |
| 295 | return _int_vars; | ||
| 296 | } | ||
| 297 | /** | ||
| 298 | * \brief returns bool vars vector of size dim_bool | ||
| 299 | * \return pointer to the bool variable vector | ||
| 300 | * \details Details | ||
| 301 | */ | ||
| 302 | 83 | bool* SimVars::getBoolVarsVector() const | |
| 303 | { | ||
| 304 |
2/2✓ Branch 0 taken 28 times.
✓ Branch 1 taken 55 times.
|
83 | if(!_bool_vars) |
| 305 | 28 | return NULL; | |
| 306 | return _bool_vars; | ||
| 307 | } | ||
| 308 | |||
| 309 | 83 | string* SimVars::getStringVarsVector() const | |
| 310 | { | ||
| 311 |
2/2✓ Branch 0 taken 65 times.
✓ Branch 1 taken 18 times.
|
83 | if(!_string_vars) |
| 312 | 65 | return NULL; | |
| 313 | return _string_vars; | ||
| 314 | } | ||
| 315 | |||
| 316 | /** | ||
| 317 | * \brief set real vars vector of size dim_real | ||
| 318 | * \param [in] vars new real vars | ||
| 319 | * \details Details | ||
| 320 | */ | ||
| 321 | ✗ | void SimVars::setRealVarsVector(const double* vars) | |
| 322 | { | ||
| 323 | ✗ | std::copy(vars, vars + _dim_real, _real_vars); | |
| 324 | ✗ | } | |
| 325 | /** | ||
| 326 | * \brief set int vars vector of size dim_int | ||
| 327 | * \param [in] vars new int vars | ||
| 328 | * \details Details | ||
| 329 | */ | ||
| 330 | ✗ | void SimVars::setIntVarsVector(const int* vars) | |
| 331 | { | ||
| 332 | ✗ | std::copy(vars, vars + _dim_int, _int_vars); | |
| 333 | ✗ | } | |
| 334 | /** | ||
| 335 | * \brief set bool vars vector of size dim_bool | ||
| 336 | * \param [in] vars new boolean vars | ||
| 337 | * \details Details | ||
| 338 | */ | ||
| 339 | ✗ | void SimVars::setBoolVarsVector(const bool* vars) | |
| 340 | { | ||
| 341 | ✗ | std::copy(vars, vars + _dim_bool, _bool_vars); | |
| 342 | ✗ | } | |
| 343 | |||
| 344 | ✗ | void SimVars::setStringVarsVector(const string* vars) | |
| 345 | { | ||
| 346 | ✗ | std::copy(vars, vars + _dim_string, _string_vars); | |
| 347 | ✗ | } | |
| 348 | |||
| 349 | /**\brief initialize real model array variable in simvars memory | ||
| 350 | * \param [in] size size of real array | ||
| 351 | * \param [in] start_index index in simvars array | ||
| 352 | * \return pointer to real array in simvars array | ||
| 353 | * \details Details | ||
| 354 | */ | ||
| 355 | ✗ | double* SimVars::initRealArrayVar(size_t size, size_t start_index) | |
| 356 | { | ||
| 357 | ✗ | size_t length = start_index + (size - 1); | |
| 358 | ✗ | if (length <= _dim_real) | |
| 359 | { | ||
| 360 | ✗ | double* data = &_real_vars[start_index]; | |
| 361 | ✗ | return data; | |
| 362 | } | ||
| 363 | else | ||
| 364 | ✗ | throw std::runtime_error("Wrong array size"); | |
| 365 | } | ||
| 366 | /**\brief initialize int model array variable in simvars memory | ||
| 367 | * \param [in] size size of real array | ||
| 368 | * \param [in] start_index index in simvars array | ||
| 369 | * \return pointer to real array in simvars array | ||
| 370 | * \details Details | ||
| 371 | */ | ||
| 372 | ✗ | int* SimVars::initIntArrayVar(size_t size, size_t start_index) | |
| 373 | { | ||
| 374 | ✗ | size_t length = start_index + (size - 1); | |
| 375 | ✗ | if (length <= _dim_int) | |
| 376 | { | ||
| 377 | ✗ | int* data = &_int_vars[start_index]; | |
| 378 | ✗ | return data; | |
| 379 | } | ||
| 380 | else | ||
| 381 | ✗ | throw std::runtime_error("Wrong array size"); | |
| 382 | } | ||
| 383 | |||
| 384 | /**\brief initialize bool model array variable in simvars memory | ||
| 385 | * \param [in] size size of real array | ||
| 386 | * \param [in] start_index index in simvars array | ||
| 387 | * \return pointer to real array in simvars array | ||
| 388 | * \details Details | ||
| 389 | */ | ||
| 390 | ✗ | bool* SimVars::initBoolArrayVar(size_t size, size_t start_index) | |
| 391 | { | ||
| 392 | ✗ | size_t length = start_index + (size - 1); | |
| 393 | ✗ | if (length <= _dim_bool) | |
| 394 | { | ||
| 395 | ✗ | bool* data = &_bool_vars[start_index]; | |
| 396 | ✗ | return data; | |
| 397 | } | ||
| 398 | else | ||
| 399 | ✗ | throw std::runtime_error("Wrong array size"); | |
| 400 | } | ||
| 401 | |||
| 402 | ✗ | string* SimVars::initStringArrayVar(size_t size, size_t start_index) | |
| 403 | { | ||
| 404 | ✗ | size_t length = start_index + (size - 1); | |
| 405 | ✗ | if (length <= _dim_string) | |
| 406 | { | ||
| 407 | ✗ | string* data = &_string_vars[start_index]; | |
| 408 | ✗ | return data; | |
| 409 | } | ||
| 410 | else | ||
| 411 | ✗ | throw std::runtime_error("Wrong array size"); | |
| 412 | } | ||
| 413 | |||
| 414 | /**\brief initializes real model alias array variable in simvars memory | ||
| 415 | * \param [in] indices indices of orginal variables in simvars memory | ||
| 416 | * \param [in] n size of alias array | ||
| 417 | * \param [out] ref_data pointer array to original array elements in simvars memory | ||
| 418 | * \details Details | ||
| 419 | */ | ||
| 420 | 200 | void SimVars::initRealAliasArray(int indices[], size_t n, double* ref_data[]) | |
| 421 | { | ||
| 422 | 833 | std::transform(indices,indices+n,ref_data,[this](int i) { return this->getRealVarPtr(i); }); | |
| 423 | 200 | } | |
| 424 | |||
| 425 | 200 | void SimVars::initRealAliasArray(std::vector<int> indices, double* ref_data[]) | |
| 426 | { | ||
| 427 | 200 | initRealAliasArray(&indices[0], indices.size(), ref_data); | |
| 428 | 200 | } | |
| 429 | |||
| 430 | /**\brief initializes int model alias array variable in simvars memory | ||
| 431 | * \param [in] indices indices of original variables in simvars memory | ||
| 432 | * \param [in] n size of alias array | ||
| 433 | * \param [out] ref_data pointer array to original array elements in simvars memory | ||
| 434 | * \details Details | ||
| 435 | */ | ||
| 436 | 64 | void SimVars::initIntAliasArray(int indices[], size_t n, int* ref_data[]) | |
| 437 | { | ||
| 438 | 208 | std::transform(indices,indices+n,ref_data,[this](int i) { return this->getIntVarPtr(i); }); | |
| 439 | 64 | } | |
| 440 | |||
| 441 | 64 | void SimVars::initIntAliasArray(std::vector<int> indices, int* ref_data[]) | |
| 442 | { | ||
| 443 | 64 | initIntAliasArray(&indices[0], indices.size(), ref_data); | |
| 444 | 64 | } | |
| 445 | |||
| 446 | /**\brief initializes bool model alias array variable in simvars memory | ||
| 447 | * \param [in] indices indices of original variables in simvars memory | ||
| 448 | * \param [in] n size of alias array | ||
| 449 | * \param [out] ref_data pointer array to original array elements in simvars memory | ||
| 450 | * \details Details | ||
| 451 | */ | ||
| 452 | 10 | void SimVars::initBoolAliasArray(int indices[], size_t n, bool* ref_data[]) | |
| 453 | { | ||
| 454 | 32 | std::transform(indices,indices+n,ref_data,[this](int i) { return this->getBoolVarPtr(i); }); | |
| 455 | 10 | } | |
| 456 | |||
| 457 | 10 | void SimVars::initBoolAliasArray(std::vector<int> indices, bool* ref_data[]) | |
| 458 | { | ||
| 459 | 10 | initBoolAliasArray(&indices[0], indices.size(), ref_data); | |
| 460 | 10 | } | |
| 461 | |||
| 462 | ✗ | void SimVars::initStringAliasArray(int indices[], size_t n, string* ref_data[]) | |
| 463 | { | ||
| 464 | ✗ | std::transform(indices,indices+n,ref_data,[this](int i) { return this->getStringVarPtr(i); }); | |
| 465 | ✗ | } | |
| 466 | |||
| 467 | ✗ | void SimVars::initStringAliasArray(std::vector<int> indices, string* ref_data[]) | |
| 468 | { | ||
| 469 | ✗ | initStringAliasArray(&indices[0], indices.size(), ref_data); | |
| 470 | ✗ | } | |
| 471 | |||
| 472 | /** | ||
| 473 | * \brief Copies all real,int,bool variables to the pre-variables list | ||
| 474 | * \details Details | ||
| 475 | */ | ||
| 476 | 336757 | void SimVars::savePreVariables() | |
| 477 | { | ||
| 478 |
2/2✓ Branch 0 taken 336176 times.
✓ Branch 1 taken 581 times.
|
336757 | if(_dim_real>0) |
| 479 |
1/2✓ Branch 0 taken 336176 times.
✗ Branch 1 not taken.
|
336176 | std::copy(_real_vars, _real_vars + _dim_real, _pre_real_vars); |
| 480 |
2/2✓ Branch 0 taken 39089 times.
✓ Branch 1 taken 297668 times.
|
336757 | if(_dim_int>0) |
| 481 |
1/2✓ Branch 0 taken 39089 times.
✗ Branch 1 not taken.
|
39089 | std::copy(_int_vars, _int_vars + _dim_int, _pre_int_vars); |
| 482 |
2/2✓ Branch 0 taken 332175 times.
✓ Branch 1 taken 4582 times.
|
336757 | if (_dim_bool > 0) |
| 483 |
1/2✓ Branch 0 taken 332175 times.
✗ Branch 1 not taken.
|
332175 | std::copy(_bool_vars, _bool_vars + _dim_bool, _pre_bool_vars); |
| 484 |
2/2✓ Branch 0 taken 19070 times.
✓ Branch 1 taken 317687 times.
|
336757 | if (_dim_string > 0) |
| 485 | 19070 | std::copy(_string_vars, _string_vars + _dim_string, _pre_string_vars); | |
| 486 | 336757 | } | |
| 487 | /** | ||
| 488 | * \brief Initializes access to pre variables | ||
| 489 | * \details Details | ||
| 490 | */ | ||
| 491 | 43 | void SimVars::initPreVariables() | |
| 492 | { | ||
| 493 | // nothing needs to be done, exploiting contiguous vars storage | ||
| 494 | 43 | } | |
| 495 | |||
| 496 | 3557935 | double& SimVars::getPreVar(const double& var) | |
| 497 | { | ||
| 498 | 3557935 | size_t i = &var - _real_vars; | |
| 499 | 3557935 | return _pre_real_vars[i]; | |
| 500 | } | ||
| 501 | |||
| 502 | 182107 | int& SimVars::getPreVar(const int& var) | |
| 503 | { | ||
| 504 | 182107 | size_t i = &var - _int_vars; | |
| 505 | 182107 | return _pre_int_vars[i]; | |
| 506 | } | ||
| 507 | |||
| 508 | 184293 | bool& SimVars::getPreVar(const bool& var) | |
| 509 | { | ||
| 510 | 184293 | size_t i = &var - _bool_vars; | |
| 511 | 184293 | return _pre_bool_vars[i]; | |
| 512 | } | ||
| 513 | |||
| 514 | ✗ | std::string& SimVars::getPreVar(const std::string& var) | |
| 515 | { | ||
| 516 | ✗ | size_t i = &var - _string_vars; | |
| 517 | ✗ | return _pre_string_vars[i]; | |
| 518 | } | ||
| 519 | |||
| 520 | ✗ | WrapArray<double> SimVars::getPreArr(const BaseArray<double>& arr) | |
| 521 | { | ||
| 522 | ✗ | size_t i = arr.getData() - _real_vars; | |
| 523 | ✗ | return WrapArray<double>(_pre_real_vars + i, arr.getNumElems()); | |
| 524 | } | ||
| 525 | |||
| 526 | 204 | WrapArray<int> SimVars::getPreArr(const BaseArray<int>& arr) | |
| 527 | { | ||
| 528 | 204 | size_t i = arr.getData() - _int_vars; | |
| 529 | 204 | return WrapArray<int>(_pre_int_vars + i, arr.getNumElems()); | |
| 530 | } | ||
| 531 | |||
| 532 | ✗ | WrapArray<bool> SimVars::getPreArr(const BaseArray<bool>& arr) | |
| 533 | { | ||
| 534 | ✗ | size_t i = arr.getData() - _bool_vars; | |
| 535 | ✗ | return WrapArray<bool>(_pre_bool_vars + i, arr.getNumElems()); | |
| 536 | } | ||
| 537 | |||
| 538 | ✗ | WrapArray<std::string> SimVars::getPreArr(const BaseArray<std::string>& arr) | |
| 539 | { | ||
| 540 | ✗ | size_t i = arr.getData() - _string_vars; | |
| 541 | ✗ | return WrapArray<std::string>(_pre_string_vars + i, arr.getNumElems()); | |
| 542 | } | ||
| 543 | |||
| 544 | /**\brief returns a pointer to a real simvar variable in simvar array | ||
| 545 | * \param [in] i index of simvar in simvar array | ||
| 546 | * \return pointer to simvar | ||
| 547 | * \details Details | ||
| 548 | */ | ||
| 549 | 633 | double* SimVars::getRealVarPtr(size_t i) | |
| 550 | { | ||
| 551 |
1/2✓ Branch 0 taken 633 times.
✗ Branch 1 not taken.
|
633 | if(i<_dim_real) |
| 552 | 633 | return &_real_vars[i]; | |
| 553 | else | ||
| 554 | ✗ | throw std::runtime_error("Wrong variable index"); | |
| 555 | } | ||
| 556 | /**\brief returns a pointer to a int simvar variable in simvar array | ||
| 557 | * \param [in] i index of simvar in simvar array | ||
| 558 | * \return pointer to simvar | ||
| 559 | * \details Details | ||
| 560 | */ | ||
| 561 | 144 | int* SimVars::getIntVarPtr(size_t i) | |
| 562 | { | ||
| 563 |
1/2✓ Branch 0 taken 144 times.
✗ Branch 1 not taken.
|
144 | if(i<_dim_int) |
| 564 | 144 | return &_int_vars[i]; | |
| 565 | else | ||
| 566 | ✗ | throw std::runtime_error("Wrong variable index"); | |
| 567 | } | ||
| 568 | |||
| 569 | /**\brief returns a pointer to a bool simvar variable in simvar array | ||
| 570 | * \param [in] i index of simvar in simvar array | ||
| 571 | * \return pointer to simvar | ||
| 572 | * \details Details | ||
| 573 | */ | ||
| 574 | 22 | bool* SimVars::getBoolVarPtr(size_t i) | |
| 575 | { | ||
| 576 |
1/2✓ Branch 0 taken 22 times.
✗ Branch 1 not taken.
|
22 | if(i<_dim_bool) |
| 577 | 22 | return &_bool_vars[i]; | |
| 578 | else | ||
| 579 | ✗ | throw std::runtime_error("Wrong variable index"); | |
| 580 | } | ||
| 581 | |||
| 582 | ✗ | string* SimVars::getStringVarPtr(size_t i) | |
| 583 | { | ||
| 584 | ✗ | if(i<_dim_string) | |
| 585 | ✗ | return &_string_vars[i]; | |
| 586 | else | ||
| 587 | ✗ | throw std::runtime_error("Wrong variable index"); | |
| 588 | } | ||
| 589 | |||
| 590 | ✗ | size_t SimVars::getDimString() const | |
| 591 | { | ||
| 592 | ✗ | return _dim_string; | |
| 593 | } | ||
| 594 | |||
| 595 | ✗ | size_t SimVars::getDimBool() const | |
| 596 | { | ||
| 597 | ✗ | return _dim_bool; | |
| 598 | } | ||
| 599 | |||
| 600 | ✗ | size_t SimVars::getDimInt() const | |
| 601 | { | ||
| 602 | ✗ | return _dim_int; | |
| 603 | } | ||
| 604 | |||
| 605 | ✗ | size_t SimVars::getDimPreVars() const | |
| 606 | { | ||
| 607 | ✗ | return _dim_pre_vars; | |
| 608 | } | ||
| 609 | |||
| 610 | ✗ | size_t SimVars::getDimReal() const | |
| 611 | { | ||
| 612 | ✗ | return _dim_real; | |
| 613 | } | ||
| 614 | |||
| 615 | 40 | size_t SimVars::getDimStateVars() const | |
| 616 | { | ||
| 617 | 40 | return _dim_z; | |
| 618 | } | ||
| 619 | |||
| 620 | ✗ | size_t SimVars::getStateVectorIndex() const | |
| 621 | { | ||
| 622 | ✗ | return _z_i; | |
| 623 | } | ||
| 624 | /** @} */ // end of coreSystem | ||
| 625 |