@@ -134,10 +134,9 @@ returning a vector `assign`:
134
134
135
135
``` julia
136
136
using ModiaBase
137
- M = 7 # Number of variables
138
- vActive = fill (true ,M)
137
+ vActive = fill (true ,7 )
139
138
vActive[5 ] = false # state C.v is known
140
- assign = matching (G, M , vActive)
139
+ assign = matching (G, 7 , vActive)
141
140
142
141
# assign = [2,6,3,1,0,5,4]
143
142
```
@@ -149,9 +148,10 @@ The meaning of vector `assign` is that
149
148
- etc.
150
149
151
150
152
- ### 1.4 Block Lower Triangular transformation
151
+ ### 1.4 Sorting
153
152
154
- In a follow-up step, equations are sorted and algebraic loops determined:
153
+ In a follow-up step, equations are sorted and algebraic loops determined
154
+ (= Block Lower Triangular transformation):
155
155
156
156
![ Incidence Matrix of sorted equations of Low Pass Filter] ( ../resources/images/LowPassFilterReduced_BLT.png )
157
157
@@ -176,6 +176,68 @@ The meaning is for example that the second BLT block consists of
176
176
equations 3,4,2,1 and these equations form an algebraic loop.
177
177
178
178
179
+ ### 1.5 Reducing sizes of equation systems
180
+
181
+ In a follow-up step, the sizes of equation systems are reduced by
182
+ variable substitution (= tearing). Applying [ ` ModiaBase.tearEquations! ` ] ( @ref ) to the
183
+ low pass filter circuit, reduces the dimension of BLT block 2 from size 4 to size 1
184
+ resulting in the following equation system:
185
+
186
+ ``` julia
187
+ # iteration variables (inputs): C.i
188
+ # residual variables (outputs): residual
189
+
190
+ R. v := R. R* C. i
191
+ R. i. v := - Ri. R* C. i
192
+ R. p. v := Ri. v + V. v
193
+ residual := R. v - R. p. v + C. v
194
+ ```
195
+
196
+
197
+ ### 1.6 Generation of AST
198
+
199
+ In a final step, the AST (Abstract Syntax Tree) of the model is
200
+ generated. Hereby, it is determined that the equation system of section 1.4 and 1.5
201
+ is linear in the iteration variable (` C.i ` ) and an AST is generated
202
+ to build-up a linear equation system ` A*C.i = b ` and solve this system numerically
203
+ with an LU decomposition whenever the AST is called (if the equation system has size 1,
204
+ a simple division is used instead of calling a linear equation solver). Applying
205
+ [ ` ModiaBase.getSortedAndSolvedAST ` ] ( @ref ) results basically in a function
206
+ ` getDerivatives ` that can be solved with the many ODE integrators of
207
+ [ DifferentialEquations.jl] ( https://github.com/SciML/DifferentialEquations.jl ) :
208
+
209
+ ``` julia
210
+ function getDerivatives (_der_x, _x, _m, _time):: Nothing
211
+ _m. time = ModiaLang. getValue (_time)
212
+ _m. nGetDerivatives += 1
213
+ instantiatedModel = _m
214
+ _p = _m. evaluatedParameters
215
+ _leq_mode = nothing
216
+ time = _time
217
+ var"C.v" = _x[1 ]
218
+ var"V.v" = (_p[:V ])[:V ]
219
+ begin
220
+ local var"C.i" , var"R.v" , var"Ri.v" , var"R.p.v"
221
+ _leq_mode = _m. linearEquations[1 ]
222
+ _leq_mode. mode = - 2
223
+ while ModiaBase. LinearEquationsIteration (_leq_mode, _m. isInitial, _m. time, _m. timer)
224
+ var"C.i" = _leq_mode. vTear_value[1 ]
225
+ var"R.v" = (_p[:R ])[:R ] * var"C.i"
226
+ var"Ri.v" = (_p[:Ri ])[:R ] * - var"C.i"
227
+ var"R.p.v" = var"Ri.v" + var"V.v"
228
+ _leq_mode. residual_value[1 ] = (var"R.v" + - 1 var"R.p.v" ) + var"C.v"
229
+ end
230
+ _leq_mode = nothing
231
+ end
232
+ var"der(C.v)" = var"C.i" / (_p[:C ])[:C ]
233
+ _der_x[1 ] = var"der(C.v)"
234
+ if _m. storeResult
235
+ ModiaLang. addToResult! (_m, _der_x, time, var"R.v" , var"R.p.v" , var"Ri.v" , var"C.i" , var"V.v" )
236
+ end
237
+ return nothing
238
+ end
239
+ ```
240
+
179
241
180
242
## 2. Singular DAEs (Higher Index DAEs)
181
243
0 commit comments