matrixop1.h 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501
  1. #ifndef MATRIXOP1_H
  2. #define MATRIXOP1_H
  3. /* * Declarations of matrix functions in Dymola
  4. *
  5. * Copyright (C) 1997-2001 Dynasim AB.
  6. * All rights reserved.
  7. *
  8. * Author: Hans Olsson Dynasim AB, 1999
  9. * Version: 1.4, 1999-09-24*/
  10. /* */
  11. #include <math.h>
  12. /* To make functions and variables static to allow several S-function blocks
  13. for real-time targets */
  14. #if !defined(DYMOLA_STATIC)
  15. #if defined(__cplusplus)
  16. #define DYMOLA_STATIC extern
  17. #elif defined(RT) && !defined(DYM2DS)
  18. #define DYMOLA_STATIC static
  19. #else
  20. #define DYMOLA_STATIC
  21. #endif
  22. #endif
  23. #if !defined(DYMOLA_STATIC2)
  24. #if defined(__cplusplus)
  25. #define DYMOLA_STATIC2 extern
  26. #elif defined(RT) && !defined(DYM2DS)
  27. #define DYMOLA_STATIC2 static
  28. #else
  29. #define DYMOLA_STATIC2 extern
  30. #endif
  31. #endif
  32. struct ExternalTable_ {
  33. void*obj_;
  34. void (*destructor_)(void*);
  35. };
  36. DYMOLA_STATIC struct ExternalTable_* DymosimGetExternalObject();
  37. #define externalTable_ DymosimGetExternalObject()
  38. #if defined(Matlab5) || defined(Matlab51) || defined(SimStruct) || defined(DYM2DS) || defined(FMU_SOURCE_CODE_EXPORT)
  39. #if !defined(DynSimStruct)
  40. #define DynSimStruct 1
  41. /* Needed for dsutil.h in Modelica mode. */
  42. #endif
  43. #endif
  44. #define Modelica
  45. #include <stddef.h>
  46. #include <stdarg.h>
  47. #include <math.h>
  48. #include "dsblock.h"
  49. #include "f2c.h"
  50. #ifndef DYN_MarkObject
  51. #define DYN_MarkObject
  52. typedef double Real;
  53. #if defined(DYM2CCUR)
  54. typedef int Integer;
  55. #else
  56. typedef int Integer;
  57. #endif
  58. typedef const char* String;
  59. typedef Integer SizeType;
  60. struct BufferObject {Real *Realbuffer;Integer *Integerbuffer;SizeType* Sizebuffer;String* Stringbuffer;};
  61. struct MarkObject {struct BufferObject place,mark;};
  62. #endif
  63. #if defined(RT)
  64. DYMOLA_STATIC2 Real Realbuffer[
  65. #ifndef DYNREALBUFFER
  66. 500000
  67. #else
  68. DYNREALBUFFER
  69. #endif
  70. ];
  71. DYMOLA_STATIC2 Integer Integerbuffer[50000];
  72. DYMOLA_STATIC2 SizeType Sizebuffer[50000];
  73. DYMOLA_STATIC2 String Stringbuffer[10000];
  74. DYMOLA_STATIC2 char simplestring[100000];
  75. DYMOLA_STATIC2 Real RealbufferNon[
  76. #ifndef DYNREALBUFFER
  77. 70000
  78. #else
  79. DYNREALBUFFER/10
  80. #endif
  81. ];
  82. DYMOLA_STATIC2 Integer IntegerbufferNon[50000];
  83. DYMOLA_STATIC2 SizeType SizebufferNon[50000];
  84. DYMOLA_STATIC2 String StringbufferNon[10000];
  85. DYMOLA_STATIC2 char simplestringNon[1000];
  86. DYMOLA_STATIC Real* EndRealbufferNon=RealbufferNon+sizeof(RealbufferNon)/sizeof(*RealbufferNon);
  87. DYMOLA_STATIC Integer* EndIntegerbufferNon=IntegerbufferNon+sizeof(IntegerbufferNon)/sizeof(*IntegerbufferNon);
  88. DYMOLA_STATIC SizeType* EndSizebufferNon=SizebufferNon+sizeof(SizebufferNon)/sizeof(*SizebufferNon);
  89. DYMOLA_STATIC String* EndStringbufferNon=StringbufferNon+sizeof(StringbufferNon)/sizeof(*StringbufferNon);
  90. DYMOLA_STATIC char* EndsimplestringNon=simplestringNon+sizeof(simplestringNon)/sizeof(*simplestringNon);
  91. #if (defined(_OPENMP) && !defined(DISABLE_DYMOLA_OPENMP))
  92. DYMOLA_STATIC Real* EndRealbuffer=0;
  93. #pragma omp threadprivate(EndRealbuffer)
  94. DYMOLA_STATIC Integer* EndIntegerbuffer=0;
  95. #pragma omp threadprivate(EndIntegerbuffer)
  96. DYMOLA_STATIC SizeType* EndSizebuffer=0;
  97. #pragma omp threadprivate(EndSizebuffer)
  98. DYMOLA_STATIC String* EndStringbuffer=0;
  99. #pragma omp threadprivate(EndStringbuffer)
  100. DYMOLA_STATIC char* Endsimplestring=0;
  101. #pragma omp threadprivate(Endsimplestring)
  102. DYMOLA_STATIC Real* EndRealbuffer2=Realbuffer+sizeof(Realbuffer)/sizeof(*Realbuffer);
  103. DYMOLA_STATIC Integer* EndIntegerbuffer2=Integerbuffer+sizeof(Integerbuffer)/sizeof(*Integerbuffer);
  104. DYMOLA_STATIC SizeType* EndSizebuffer2=Sizebuffer+sizeof(Sizebuffer)/sizeof(*Sizebuffer);
  105. DYMOLA_STATIC String* EndStringbuffer2=Stringbuffer+sizeof(Stringbuffer)/sizeof(*Stringbuffer);
  106. DYMOLA_STATIC char* Endsimplestring2=simplestring+sizeof(simplestring)/sizeof(*simplestring);
  107. #else
  108. DYMOLA_STATIC Real* EndRealbuffer=Realbuffer+sizeof(Realbuffer)/sizeof(*Realbuffer);
  109. DYMOLA_STATIC Integer* EndIntegerbuffer=Integerbuffer+sizeof(Integerbuffer)/sizeof(*Integerbuffer);
  110. DYMOLA_STATIC SizeType* EndSizebuffer=Sizebuffer+sizeof(Sizebuffer)/sizeof(*Sizebuffer);
  111. DYMOLA_STATIC String* EndStringbuffer=Stringbuffer+sizeof(Stringbuffer)/sizeof(*Stringbuffer);
  112. DYMOLA_STATIC char* Endsimplestring=simplestring+sizeof(simplestring)/sizeof(*simplestring);
  113. #endif
  114. #else
  115. DYMOLA_STATIC2 Real Realbuffer[];
  116. DYMOLA_STATIC2 Integer Integerbuffer[];
  117. DYMOLA_STATIC2 SizeType Sizebuffer[];
  118. DYMOLA_STATIC2 String Stringbuffer[];
  119. DYMOLA_STATIC2 char simplestring[];
  120. DYMOLA_STATIC2 Real* EndRealbuffer;
  121. DYMOLA_STATIC2 Integer* EndIntegerbuffer;
  122. DYMOLA_STATIC2 SizeType* EndSizebuffer;
  123. DYMOLA_STATIC2 String* EndStringbuffer;
  124. DYMOLA_STATIC2 char* Endsimplestring;
  125. DYMOLA_STATIC2 Real RealbufferNon[];
  126. DYMOLA_STATIC2 Integer IntegerbufferNon[];
  127. DYMOLA_STATIC2 SizeType SizebufferNon[];
  128. DYMOLA_STATIC2 String StringbufferNon[];
  129. DYMOLA_STATIC2 char simplestringNon[];
  130. DYMOLA_STATIC2 Real* EndRealbufferNon;
  131. DYMOLA_STATIC2 Integer* EndIntegerbufferNon;
  132. DYMOLA_STATIC2 SizeType* EndSizebufferNon;
  133. DYMOLA_STATIC2 String* EndStringbufferNon;
  134. DYMOLA_STATIC2 char* EndsimplestringNon;
  135. #endif
  136. #ifndef __cplusplus
  137. typedef struct BufferObject BufferObject;
  138. typedef struct MarkObject MarkObject;
  139. #endif
  140. /* Memory allocation */
  141. DYMOLA_STATIC MarkObject PushMark(void);
  142. DYMOLA_STATIC void RePushMark(MarkObject*);
  143. DYMOLA_STATIC void Release(); /* Release: used after each matrix assignment in the function */
  144. DYMOLA_STATIC void PopMark(MarkObject oldMark);/* At the end of the function */
  145. DYMOLA_STATIC void PopMarkMarks();/* Major pop, e.g. at end of intgegration */
  146. DYMOLA_STATIC char* GetStringMark();
  147. DYMOLA_STATIC void SetStringMark(char*);
  148. DYMOLA_STATIC const char* SqueezeString(const char*s, char*startMark);
  149. /* Data structure for arrays of arbitrary dimension, stored in Fortran Style. */
  150. /* Adressing of individual elements start at 1 */
  151. typedef struct IntegerArray {
  152. SizeType ndims; /* Length of dims */
  153. SizeType *dims; /* A.dims[i-1]=size(a,i) */
  154. Integer *data;
  155. } IntegerArray;
  156. typedef struct RealArray {
  157. SizeType ndims;
  158. SizeType *dims;
  159. Real *data;
  160. } RealArray;
  161. typedef struct StringArray {
  162. SizeType ndims;
  163. SizeType *dims;
  164. String *data;
  165. } StringArray;
  166. /* Each argument is tagged by Subtag */
  167. enum Subtag {
  168. Colon, /* Corresponds to a[:] */
  169. Range, /* Corresponds to a[f:t] (two Integer arguments)*/
  170. RangeRange, /* Corresponds to a[f:s:t] (three Integer arguments) */
  171. Vector, /* Corresponds to a[v] where v is IntegerArray (actually vector) (one IntegerArray argument) */
  172. Index, /* Correspons to a[i] where i is an Integer (one Integer argument) */
  173. EndMark /* End of the argument list */
  174. };
  175. /* Start of common routines */
  176. DYMOLA_STATIC RealArray RealNonTemporary(SizeType ndims,...);
  177. DYMOLA_STATIC IntegerArray IntegerNonTemporary(SizeType ndims,...);
  178. DYMOLA_STATIC StringArray StringNonTemporary(SizeType ndims,...);
  179. DYMOLA_STATIC SizeType FindIndex(SizeType ndims,SizeType*dims,va_list ap);
  180. DYMOLA_STATIC SizeType *SizeTemp(SizeType r);
  181. DYMOLA_STATIC RealArray RealMatch(const RealArray a);
  182. DYMOLA_STATIC IntegerArray IntegerMatch(const IntegerArray a);
  183. DYMOLA_STATIC StringArray StringMatch(const StringArray a);
  184. /* Construct array from sizes, using variable number of arguments */
  185. DYMOLA_STATIC RealArray RealTemporary(SizeType ndims,...);
  186. /* Special cases for vectors and matrices (most often used) */
  187. DYMOLA_STATIC RealArray RealTemporaryMatrix(SizeType r,SizeType c);
  188. DYMOLA_STATIC RealArray RealTemporaryVector(SizeType r);
  189. /* Assignment */
  190. DYMOLA_STATIC void RealAssign(RealArray a,const RealArray b);
  191. /* Indexing to set/get elements */
  192. DYMOLA_STATIC void* RecordElement(const RealArray a,...);
  193. DYMOLA_STATIC Real RealElement(const RealArray a,...);
  194. /* Sizes */
  195. DYMOLA_STATIC Integer RealSize(const RealArray a,SizeType i);
  196. DYMOLA_STATIC IntegerArray RealSizes(const RealArray a);
  197. /* Set element, note that val is prior to the index list. */
  198. DYMOLA_STATIC void SetRealElement(Real val,RealArray a,...);
  199. /* For debug write out */
  200. DYMOLA_STATIC void RealWrite(const RealArray a);
  201. /* Construct Arrays from other arrays */
  202. DYMOLA_STATIC RealArray RealArrayArray(SizeType narg,RealArray first,...);
  203. /* Construct arrays from scalars */
  204. DYMOLA_STATIC RealArray RealScalarArray(SizeType narg,...);
  205. /* Construct from Record Arrays */
  206. DYMOLA_STATIC RealArray RecordArrayRealSlice(const RealArray a,size_t off);
  207. DYMOLA_STATIC RealArray RecordArrayRealArraySlice(const RealArray a,size_t off);
  208. /* Concatenate along dimensions 'along' (1..ndims) and given nargs arguments */
  209. DYMOLA_STATIC RealArray RealCat(SizeType along,SizeType nargs,RealArray first,...);
  210. /* The helper in Modelica */
  211. DYMOLA_STATIC RealArray RealPromote(const RealArray a,SizeType n);
  212. DYMOLA_STATIC RealArray RealPromoteScalar(const Real x,SizeType n);
  213. /* Use as: RealGetSub(a,Colon,Index,3,Range,3,4,EndMark)=a[:,3,3:4] */
  214. DYMOLA_STATIC RealArray RealGetSub(const RealArray a,...);
  215. DYMOLA_STATIC void RealPutSub(const RealArray a,RealArray out,...);
  216. /* For each operation Op(...) we create a temporary result res */
  217. /* and call OpAssign(res,...) */
  218. /* The operations Op(...) are convenient and used in the code */
  219. /* Fill */
  220. DYMOLA_STATIC RealArray RealFillAssign(RealArray res,const Real t);
  221. DYMOLA_STATIC RealArray RealFill(const Real t,SizeType ndims,...);
  222. DYMOLA_STATIC RealArray RealFillArray(const RealArray a,SizeType ndims,...);
  223. DYMOLA_STATIC Real Realscalar(const RealArray a);
  224. /* Matrix operations not limited to numeric matrices */
  225. DYMOLA_STATIC RealArray Realvector(const RealArray a);
  226. DYMOLA_STATIC RealArray Realmatrix(const RealArray a);
  227. DYMOLA_STATIC RealArray Realtranspose(const RealArray a);
  228. DYMOLA_STATIC RealArray Realouterproduct(const RealArray a,const RealArray b);
  229. DYMOLA_STATIC RealArray Realsymmetric(const RealArray a);
  230. /* End of common routines for String*/
  231. /* Basic operations, add, subtract, scale*/
  232. /* For each operation Op(...) we create a temporary result res */
  233. /* and call OpAssign(res,...) */
  234. /* The operations Op(...) are convenient and used in the code */
  235. DYMOLA_STATIC RealArray RealAddAssign(RealArray res,const RealArray a,const RealArray b);
  236. DYMOLA_STATIC RealArray RealAdd(const RealArray a,const RealArray b);
  237. DYMOLA_STATIC RealArray RealSubtractAssign(RealArray res,const RealArray a,const RealArray b);
  238. DYMOLA_STATIC RealArray RealSubtract(const RealArray a,const RealArray b);
  239. DYMOLA_STATIC RealArray RealScaleAssign(RealArray res,const RealArray a,const Real t);
  240. DYMOLA_STATIC RealArray RealScale(const RealArray a,const Real t);
  241. DYMOLA_STATIC RealArray RealMinusAssign(RealArray res,const RealArray a);
  242. DYMOLA_STATIC RealArray RealMinus(const RealArray a);
  243. /* sum, max, min, and product */
  244. DYMOLA_STATIC Real Realsum(const RealArray a);
  245. DYMOLA_STATIC Real RealAbssum(const RealArray a);
  246. DYMOLA_STATIC Real RealAbssumDiff(const RealArray a,const RealArray b);
  247. DYMOLA_STATIC Real Realmax(const RealArray a);
  248. DYMOLA_STATIC Real Realmin(const RealArray a);
  249. DYMOLA_STATIC Real Realproduct(const RealArray a);
  250. DYMOLA_STATIC RealArray Realdiagonal(const RealArray a);
  251. DYMOLA_STATIC RealArray Realcross(const RealArray x,const RealArray y);
  252. DYMOLA_STATIC RealArray Realskew(const RealArray x);
  253. /* Multiply */
  254. DYMOLA_STATIC RealArray RealMultiplyMMAssign(RealArray res,
  255. const RealArray a,const RealArray b);
  256. DYMOLA_STATIC RealArray RealMultiplyMVAssign(RealArray res,const RealArray a,const RealArray b);
  257. DYMOLA_STATIC RealArray RealMultiplyVMAssign(RealArray res,const RealArray a,const RealArray b);
  258. DYMOLA_STATIC Real RealMultiplyVV(const RealArray a,const RealArray b);
  259. DYMOLA_STATIC RealArray RealMultiplyMM(const RealArray a,const RealArray b);
  260. DYMOLA_STATIC RealArray RealMultiplyMV(const RealArray a,const RealArray b);
  261. DYMOLA_STATIC RealArray RealMultiplyVM(const RealArray a,const RealArray b);
  262. DYMOLA_STATIC RealArray RealIdentity(SizeType n);
  263. DYMOLA_STATIC RealArray RealPow(const RealArray a,const Integer n);
  264. /* For from:stride:to */
  265. DYMOLA_STATIC RealArray RealRange(const Real from,const Real to,const Real stride);
  266. /* End of common routines with Integer */
  267. /* Unique routines */
  268. DYMOLA_STATIC RealArray linspace(const Real from,const Real to,const Integer n);
  269. /* Go from IntegerArray to RealArray */
  270. DYMOLA_STATIC RealArray RealConvertInteger(const IntegerArray a);
  271. DYMOLA_STATIC IntegerArray IntegerConvertReal(const RealArray a);
  272. DYMOLA_STATIC RealArray RealScaleDiv(const RealArray a,const Real t);
  273. /* Routines for Integer */
  274. /* Create Array-temporaries given the dimensions */
  275. /* Construct array from sizes, using variable number of arguments */
  276. DYMOLA_STATIC IntegerArray IntegerTemporary(SizeType ndims,...);
  277. /* Special cases for vectors and matrices (most often used) */
  278. DYMOLA_STATIC IntegerArray IntegerTemporaryMatrix(SizeType r,SizeType c);
  279. DYMOLA_STATIC IntegerArray IntegerTemporaryVector(SizeType r);
  280. /* Assignment */
  281. DYMOLA_STATIC void IntegerAssign(IntegerArray a,const IntegerArray b);
  282. /* Indexing to set/get elements */
  283. DYMOLA_STATIC Integer IntegerElement(const IntegerArray a,...);
  284. /* Sizes */
  285. DYMOLA_STATIC Integer IntegerSize(const IntegerArray a,SizeType i);
  286. DYMOLA_STATIC IntegerArray IntegerSizes(const IntegerArray a);
  287. /* Set element, note that val is prior to the index list. */
  288. DYMOLA_STATIC void SetIntegerElement(Integer val,IntegerArray a,...);
  289. /* For debug write out */
  290. DYMOLA_STATIC void IntegerWrite(const IntegerArray a);
  291. /* Construct Arrays from other arrays */
  292. DYMOLA_STATIC IntegerArray IntegerArrayArray(SizeType narg,IntegerArray first,...);
  293. /* Construct arrays from scalars */
  294. DYMOLA_STATIC IntegerArray IntegerScalarArray(SizeType narg,...);
  295. /* Construct from Record Arrays */
  296. DYMOLA_STATIC IntegerArray RecordArrayIntegerSlice(const RealArray a,size_t off);
  297. DYMOLA_STATIC IntegerArray RecordArrayIntegerArraySlice(const RealArray a,size_t off);
  298. /* Concatenate along dimensions 'along' (1..ndims) and given nargs arguments */
  299. DYMOLA_STATIC IntegerArray IntegerCat(SizeType along,SizeType nargs,IntegerArray first,...);
  300. /* The helper in Modelica */
  301. DYMOLA_STATIC IntegerArray IntegerPromote(const IntegerArray a,SizeType n);
  302. DYMOLA_STATIC IntegerArray IntegerPromoteScalar(const Integer x,SizeType n);
  303. /* Use as: IntegerGetSub(a,Colon,Index,3,Range,3,4,EndMark)=a[:,3,3:4] */
  304. DYMOLA_STATIC IntegerArray IntegerGetSub(const IntegerArray a,...);
  305. /* Use as IntegerPutSub(a, out,Index,3,Colon,Range,3,4) yields out[3,:,3:4]=a; */
  306. DYMOLA_STATIC void IntegerPutSub(const IntegerArray a,IntegerArray out,...);
  307. /* For each operation Op(...) we create a temporary result res */
  308. /* and call OpAssign(res,...) */
  309. /* The operations Op(...) are convenient and used in the code */
  310. /* Fill */
  311. DYMOLA_STATIC IntegerArray IntegerFillAssign(IntegerArray res,const Integer t);
  312. DYMOLA_STATIC IntegerArray IntegerFill(const Integer t,SizeType ndims,...);
  313. DYMOLA_STATIC IntegerArray IntegerFillArray(const IntegerArray a,SizeType ndims,...);
  314. DYMOLA_STATIC Integer Integerscalar(const IntegerArray a);
  315. /* Matrix operations not limited to numeric matrices */
  316. DYMOLA_STATIC IntegerArray Integervector(const IntegerArray a);
  317. DYMOLA_STATIC IntegerArray Integermatrix(const IntegerArray a);
  318. DYMOLA_STATIC IntegerArray Integertranspose(const IntegerArray a);
  319. DYMOLA_STATIC IntegerArray Integerouterproduct(const IntegerArray a,const IntegerArray b);
  320. DYMOLA_STATIC IntegerArray Integersymmetric(const IntegerArray a);
  321. /* End of common routines for String*/
  322. /* Basic operations, add, subtract, scale*/
  323. /* For each operation Op(...) we create a temporary result res */
  324. /* and call OpAssign(res,...) */
  325. /* The operations Op(...) are convenient and used in the code */
  326. DYMOLA_STATIC IntegerArray IntegerAddAssign(IntegerArray res,const IntegerArray a,const IntegerArray b);
  327. DYMOLA_STATIC IntegerArray IntegerAdd(const IntegerArray a,const IntegerArray b);
  328. DYMOLA_STATIC IntegerArray IntegerSubtractAssign(IntegerArray res,const IntegerArray a,const IntegerArray b);
  329. DYMOLA_STATIC IntegerArray IntegerSubtract(const IntegerArray a,const IntegerArray b);
  330. DYMOLA_STATIC IntegerArray IntegerScaleAssign(IntegerArray res,const IntegerArray a,const Integer t);
  331. DYMOLA_STATIC IntegerArray IntegerScale(const IntegerArray a,const Integer t);
  332. DYMOLA_STATIC IntegerArray IntegerMinusAssign(IntegerArray res,const IntegerArray a);
  333. DYMOLA_STATIC IntegerArray IntegerMinus(const IntegerArray a);
  334. /* sum, max, min, and product */
  335. DYMOLA_STATIC Integer Integersum(const IntegerArray a);
  336. DYMOLA_STATIC Integer IntegerAbssum(const IntegerArray a);
  337. DYMOLA_STATIC Integer Integermax(const IntegerArray a);
  338. DYMOLA_STATIC Integer Integermin(const IntegerArray a);
  339. DYMOLA_STATIC Integer Integerproduct(const IntegerArray a);
  340. DYMOLA_STATIC IntegerArray Integerdiagonal(const IntegerArray a);
  341. DYMOLA_STATIC IntegerArray Integercross(const IntegerArray x,const IntegerArray y);
  342. DYMOLA_STATIC IntegerArray Integerskew(const IntegerArray x);
  343. /* Multiply */
  344. DYMOLA_STATIC IntegerArray IntegerMultiplyMMAssign(IntegerArray res,
  345. const IntegerArray a,const IntegerArray b);
  346. DYMOLA_STATIC IntegerArray IntegerMultiplyMVAssign(IntegerArray res,const IntegerArray a,const IntegerArray b);
  347. DYMOLA_STATIC IntegerArray IntegerMultiplyVMAssign(IntegerArray res,const IntegerArray a,const IntegerArray b);
  348. DYMOLA_STATIC Integer IntegerMultiplyVV(const IntegerArray a,const IntegerArray b);
  349. DYMOLA_STATIC IntegerArray IntegerMultiplyMM(const IntegerArray a,const IntegerArray b);
  350. DYMOLA_STATIC IntegerArray IntegerMultiplyMV(const IntegerArray a,const IntegerArray b);
  351. DYMOLA_STATIC IntegerArray IntegerMultiplyVM(const IntegerArray a,const IntegerArray b);
  352. DYMOLA_STATIC IntegerArray IntegerIdentity(SizeType n);
  353. DYMOLA_STATIC IntegerArray IntegerPow(const IntegerArray a,const Integer n);
  354. /* For from:stride:to */
  355. DYMOLA_STATIC IntegerArray IntegerRange(const Integer from,const Integer to,const Integer stride);
  356. /* Create Array-temporaries given the dimensions */
  357. /* Construct array from sizes, using variable number of arguments */
  358. DYMOLA_STATIC StringArray StringTemporary(SizeType ndims,...);
  359. /* Special cases for vectors and matrices (most often used) */
  360. DYMOLA_STATIC StringArray StringTemporaryMatrix(SizeType r,SizeType c);
  361. DYMOLA_STATIC StringArray StringTemporaryVector(SizeType r);
  362. /* Assignment */
  363. DYMOLA_STATIC void StringAssign(StringArray a,const StringArray b);
  364. /* Indexing to set/get elements */
  365. DYMOLA_STATIC const char* StringElement(const StringArray a,...);
  366. /* Sizes */
  367. DYMOLA_STATIC Integer StringSize(const StringArray a,SizeType i);
  368. DYMOLA_STATIC IntegerArray StringSizes(const StringArray a);
  369. /* Set element, note that val is prior to the index list. */
  370. DYMOLA_STATIC void SetStringElement(const char* val,StringArray a,...);
  371. /* For debug write out */
  372. DYMOLA_STATIC void StringWrite(const StringArray a);
  373. /* Construct Arrays from other arrays */
  374. DYMOLA_STATIC StringArray StringArrayArray(SizeType narg,StringArray first,...);
  375. /* Construct arrays from scalars */
  376. DYMOLA_STATIC StringArray StringScalarArray(SizeType narg,...);
  377. /* Construct from Record Arrays */
  378. DYMOLA_STATIC StringArray RecordArrayStringSlice(const RealArray a,size_t off);
  379. DYMOLA_STATIC StringArray RecordArrayStringArraySlice(const RealArray a,size_t off);
  380. /* Concatenate along dimensions 'along' (1..ndims) and given nargs arguments */
  381. DYMOLA_STATIC StringArray StringCat(SizeType along,SizeType nargs,StringArray first,...);
  382. /* The helper in Modelica */
  383. DYMOLA_STATIC StringArray StringPromote(const StringArray a,SizeType n);
  384. DYMOLA_STATIC StringArray StringPromoteScalar(const char* x,SizeType n);
  385. /* Actual put of submatrix */
  386. /* Use as: StringGetSub(a,Colon,Index,3,Range,3,4,EndMark)=a[:,3,3:4] */
  387. DYMOLA_STATIC StringArray StringGetSub(const StringArray a,...);
  388. /* Use as StringPutSub(a, out,Index,3,Colon,Range,3,4) yields out[3,:,3:4]=a; */
  389. DYMOLA_STATIC void StringPutSub(const StringArray a,StringArray out,...);
  390. DYMOLA_STATIC StringArray StringCopy(const StringArray a);
  391. /* For each operation Op(...) we create a temporary result res */
  392. /* and call OpAssign(res,...) */
  393. /* The operations Op(...) are convenient and used in the code */
  394. /* Fill */
  395. DYMOLA_STATIC StringArray StringFillAssign(StringArray res,const char* t);
  396. DYMOLA_STATIC StringArray StringFill(const char* t,SizeType ndims,...);
  397. DYMOLA_STATIC StringArray StringFillArray(const StringArray a,SizeType ndims,...);
  398. DYMOLA_STATIC const char* Stringscalar(const StringArray a);
  399. /* Matrix operations not limited to numeric matrices */
  400. DYMOLA_STATIC StringArray Stringvector(const StringArray a);
  401. DYMOLA_STATIC StringArray Stringmatrix(const StringArray a);
  402. DYMOLA_STATIC StringArray Stringtranspose(const StringArray a);
  403. DYMOLA_STATIC StringArray Stringsymmetric(const StringArray a);
  404. /* End of common routines for String*/
  405. static IntegerArray identity(Integer n) {return IntegerIdentity(n);}
  406. static Integer real2integer(Real x) {return (Integer)(floor(x));}
  407. DYMOLA_STATIC Integer VectorWhenHandle(IntegerArray cond,IntegerArray eval,IntegerArray evalnew,Integer Event,Integer*AnyEvent);
  408. DYMOLA_STATIC SizeType RealNrElements(const RealArray a);
  409. DYMOLA_STATIC SizeType IntegerNrElements(const IntegerArray);
  410. DYMOLA_STATIC SizeType StringNrElements(const StringArray);
  411. /* Convert between C and Fortran storage */
  412. DYMOLA_STATIC RealArray RealSwitchMajor(const RealArray);
  413. DYMOLA_STATIC IntegerArray IntegerSwitchMajor(const IntegerArray);
  414. DYMOLA_STATIC StringArray StringSwitchMajor(const StringArray);
  415. DYMOLA_STATIC void RealSwitchMajorAssign(RealArray,const RealArray);
  416. DYMOLA_STATIC void IntegerSwitchMajorAssign(IntegerArray,const IntegerArray);
  417. DYMOLA_STATIC void StringSwitchMajorAssign(StringArray,const StringArray);
  418. DYMOLA_STATIC RealArray readMatrix(const char*fil,const char*matnam,Integer m,Integer n);
  419. DYMOLA_STATIC IntegerArray readMatrixSize(const char*fil,const char*matnam);
  420. DYMOLA_STATIC StringArray readMATmatrices_M(const char*fil);
  421. DYMOLA_STATIC Integer writeMatrix(const char*fil,const char*matnam,const RealArray mat,int append);
  422. DYMOLA_STATIC Real RealReadScalar(const char*fil,const char*matnam);
  423. DYMOLA_STATIC RealArray RealReadArray(const char*fil,const char*matnam,Integer ndims);
  424. DYMOLA_STATIC Integer IntegerReadScalar(const char*fil,const char*matnam);
  425. DYMOLA_STATIC IntegerArray IntegerReadArray(const char*fil,const char*matnam,Integer ndims);
  426. DYMOLA_STATIC String StringReadScalar(const char*fil,const char*matnam);
  427. DYMOLA_STATIC StringArray StringReadArray(const char*fil,const char*matnam,Integer ndims);
  428. DYMOLA_STATIC RealArray RealLeading(int,int,RealArray);
  429. DYMOLA_STATIC IntegerArray IntegerLeading(int,int,IntegerArray);
  430. DYMOLA_STATIC StringArray StringLeading(int,int,StringArray);
  431. DYMOLA_STATIC void writeArrays(const char*fileName,int nargs,...);
  432. DYMOLA_STATIC char* StringAllocate(SizeType len);
  433. DYMOLA_STATIC String StringAdd(String a,String b);
  434. DYMOLA_STATIC String Real2String(Real x,Integer precision,Integer minwidth);
  435. DYMOLA_STATIC String Integer2String(Integer x,Integer precision,Integer minwidth);
  436. DYMOLA_STATIC String Real2String3(Real x,Integer leftJustified,Integer minwidth,Integer precision);
  437. DYMOLA_STATIC String Real2String2(Real x,Integer leftJustified,Integer minwidth);
  438. DYMOLA_STATIC String Integer2String2(Integer x,Integer leftJustified,Integer minwidth);
  439. DYMOLA_STATIC String Boolean2String2(Integer x,Integer leftJustified,Integer minwidth);
  440. DYMOLA_STATIC String Real2StringFormat(Real x,String s);
  441. DYMOLA_STATIC void CopySlice(Real*x,RealArray y);
  442. DYMOLA_STATIC RealArray RealTemporaryDense(Real*d,SizeType ndims,...);
  443. DYMOLA_STATIC IntegerArray IntegerTemporaryDense(Real*d,SizeType ndims,...);
  444. DYMOLA_STATIC IntegerArray IntegerTemporaryDenseOrig(Integer*d,SizeType ndims,...);
  445. DYMOLA_STATIC StringArray StringTemporaryDense(String*d,SizeType ndims,...);
  446. DYMOLA_STATIC RealArray RealInverse(const RealArray A);
  447. DYMOLA_STATIC IntegerArray NOTArray(const IntegerArray);
  448. DYMOLA_STATIC IntegerArray ANDArray(const IntegerArray,const IntegerArray);
  449. DYMOLA_STATIC IntegerArray ORArray(const IntegerArray,const IntegerArray);
  450. DYMOLA_STATIC String ConvertToNonTempString(String s);
  451. DYMOLA_STATIC StringArray ConvertToNonTempStringArray(StringArray s);
  452. LIBDS_API int dymli2_(int* sysnr, int *fact, double *a, int* lda, int *n,double* b, double *Time, int *Event, int* PrintEvent, double* dwork, int* iwork, int *factor, int* ierr);
  453. #endif