Skip to content

Commit 3381133

Browse files
author
Peter Aronsson
committed
Added generation of initial values in simcodegen
git-svn-id: https://openmodelica.org/svn/OpenModelica/trunk@1483 f25d12d1-65f4-0310-ae8a-bbce733d8d8e
1 parent 6670b37 commit 3381133

File tree

2 files changed

+153
-1
lines changed

2 files changed

+153
-1
lines changed

modeq/main.rml

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -515,7 +515,9 @@ relation simcodegen: (Absyn.Path, (* classname *)
515515
Absyn.path_string(classname) => cname_str &
516516
print cname_str & print "\n" &
517517
Util.string_append_list([cname_str,".cpp"]) => filename &
518-
SimCodegen.generate_residual_code(indexed_dae',ass1,ass2,m,mt,comps,classname,filename)
518+
Util.string_append_list([cname_str,"_init.txt"]) => init_filename &
519+
SimCodegen.generate_residual_code(indexed_dae',ass1,ass2,m,mt,comps,classname,filename) &
520+
SimCodegen.generate_init_data(indexed_dae',classname,init_filename,0.0,1.0,0.0001)
519521
--------------------
520522
simcodegen(classname,dae,ass1,ass2,m,mt,comps)
521523

modeq/simcodegen.rml

Lines changed: 150 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,9 @@ relation generate_residual_code: (DAELow.DAELow,
5151

5252
relation generate_ode_code: (DAELow.DAELow, Absyn.Path, string) => ()
5353

54+
relation generate_init_data: (DAELow.DAELow, Absyn.Path(* classname *),
55+
string,real,real,real) => ()
56+
5457
relation print_exp_cpp_str : Exp.Exp => string
5558

5659
relation cref_modelica_str : Exp.ComponentRef => string
@@ -62,6 +65,7 @@ with "util.rml"
6265
with "rtopts.rml"
6366
with "debug.rml"
6467
with "system.rml"
68+
with "values.rml"
6569

6670
(** relation generate_residual_code
6771
** Outputs simulation code from a DAELow suitable for connection to DASSL.
@@ -106,6 +110,152 @@ relation generate_ode_code: (DAELow.DAELow, Absyn.Path, string) => () =
106110

107111
end
108112

113+
114+
(** relation generate_init_data
115+
** This relation generates initial values for the simulation
116+
** by investigating values of variables
117+
**)
118+
relation generate_init_data: (DAELow.DAELow, Absyn.Path(* classname *),
119+
string,real,real,real)
120+
=> () =
121+
122+
rule real_string(start) => start_str &
123+
real_string(stop) => stop_str &
124+
real_string(step) => step_str &
125+
DAELow.calculate_sizes(dae) => (nx,ny,np) &
126+
int_string(nx) => nx_str &
127+
int_string(ny) => ny_str &
128+
int_string(np) => np_str &
129+
generate_init_data2(dae,nx,ny,np) => init_str &
130+
Util.string_append_list([start_str, " // start value\n",
131+
stop_str, " // stop value\n",
132+
step_str, " // step value\n",
133+
nx_str, " // n states\n",
134+
ny_str, " // n alg vars\n",
135+
np_str, " //n parameters\n",
136+
init_str]) => str &
137+
System.write_file(filename,str)
138+
--------------------------
139+
generate_init_data(dae,class,filename,start,stop,step)
140+
141+
rule print "-generate_init_data failed\n"
142+
------------------------------------
143+
generate_init_data(_,_,_,_,_,_) => fail
144+
end
145+
146+
(** relation: generate_init_data2
147+
** Helper relation to generate_init_data
148+
** Generates init data for states, variables and parameters.
149+
**)
150+
relation generate_init_data2:(DAELow.DAELow,int(*nx*),int(*ny*),int(*np*)) => string =
151+
152+
rule DAELow.var_list(vars) => var_lst &
153+
DAELow.var_list(knvars) => knvar_lst &
154+
array_create(nx,"") => nxarr &
155+
array_create(nx,"0.0") => nxdarr &
156+
array_create(ny,"") => nyarr &
157+
array_create(np,"") => nparr &
158+
generate_init_data3(var_lst,nxarr,nxdarr,nyarr,nparr)
159+
=>(nxarr',nxdarr',nyarr',nparr') &
160+
generate_init_data3(knvar_lst,nxarr',nxdarr',nyarr',nparr')
161+
=>(nxarr'',nxdarr'',nyarr'',nparr'') &
162+
array_list(nxarr'') => nx_lst &
163+
array_list(nxdarr'') => nxd_lst &
164+
array_list(nyarr'') => ny_lst &
165+
array_list(nparr'') => np_lst &
166+
Util.list_flatten([nx_lst,nxd_lst,ny_lst,np_lst]) => whole_lst &
167+
Util.string_delimit_list(whole_lst,"\n") => res
168+
-----------------------------
169+
generate_init_data2(DAELow.DAELOW(vars,knvars,_,_,initeqn,alg),nx,ny,np) => res
170+
171+
end
172+
173+
relation print_exp_str_opt: Exp.Exp option => string =
174+
175+
axiom print_exp_str_opt NONE => "0.0"
176+
177+
rule Exp.print_exp_str e => str
178+
--------------------------
179+
print_exp_str_opt SOME(e) => str
180+
end
181+
182+
relation generate_init_data3:(DAELow.Var list,
183+
string array,
184+
string array,
185+
string array,
186+
string array)
187+
=> (string array,
188+
string array,
189+
string array,
190+
string array) =
191+
192+
axiom generate_init_data3([],nxarr,nxdarr,nyarr,nparr)
193+
=> (nxarr,nxdarr,nyarr,nparr)
194+
195+
rule print_exp_str_opt(value) => v &
196+
Util.string_append_list([v, " // ",origname]) => str &
197+
array_setnth(nyarr,indx,str) => nyarr &
198+
generate_init_data3(rest,nxarr,nxdarr,nyarr,nparr)
199+
=> (nxarr,nxdarr,nyarr,nparr)
200+
--------------------
201+
generate_init_data3(DAELow.VAR(cr,DAELow.VARIABLE,_,_,_,_,
202+
_,value,indx,origname,_)::rest,
203+
nxarr,nxdarr,nyarr,nparr)
204+
=> (nxarr,nxdarr,nyarr,nparr)
205+
206+
rule print_exp_str_opt(value) => v &
207+
Util.string_append_list([v, " // ",origname]) => str &
208+
array_setnth(nxarr,indx,str) => nxarr &
209+
generate_init_data3(rest,nxarr,nxdarr,nyarr,nparr)
210+
=> (nxarr,nxdarr,nyarr,nparr)
211+
--------------------
212+
generate_init_data3(DAELow.VAR(_,DAELow.STATE,_,_,_,_,_,value,indx,origname,_)::rest,nxarr,nxdarr,nyarr,nparr)
213+
=> (nxarr,nxdarr,nyarr,nparr)
214+
215+
rule print_exp_str_opt(value) => v &
216+
Util.string_append_list([v, " // ",origname]) => str &
217+
array_setnth(nyarr,indx,str) => nyarr &
218+
generate_init_data3(rest,nxarr,nxdarr,nyarr,nparr)
219+
=> (nxarr,nxdarr,nyarr,nparr)
220+
--------------------
221+
generate_init_data3(DAELow.VAR(_,DAELow.DUMMY_DER,_,_,_,_,_,value,indx,origname,_)::rest,nxarr,nxdarr,nyarr,nparr)
222+
=> (nxarr,nxdarr,nyarr,nparr)
223+
224+
rule print_exp_str_opt(value) => v &
225+
Util.string_append_list([v, " // ",origname]) => str &
226+
array_setnth(nyarr,indx,str) => nyarr &
227+
generate_init_data3(rest,nxarr,nxdarr,nyarr,nparr)
228+
=> (nxarr,nxdarr,nyarr,nparr)
229+
--------------------
230+
generate_init_data3(DAELow.VAR(_,DAELow.DUMMY_STATE,_,_,_,_,
231+
_,value,indx,origname,_)::rest,
232+
nxarr,nxdarr,nyarr,nparr)
233+
=> (nxarr,nxdarr,nyarr,nparr)
234+
235+
rule Values.val_string(value) => v &
236+
Util.string_append_list([v, " // ",origname]) => str &
237+
array_setnth(nparr,indx,str) => nparr &
238+
generate_init_data3(rest,nxarr,nxdarr,nyarr,nparr)
239+
=> (nxarr,nxdarr,nyarr,nparr)
240+
--------------------
241+
generate_init_data3(DAELow.VAR(_,DAELow.PARAM,_,_,_,SOME(value),_,
242+
_,indx,origname,_)::rest,
243+
nxarr,nxdarr,nyarr,nparr)
244+
=> (nxarr,nxdarr,nyarr,nparr)
245+
246+
rule Util.string_append_list(["0.0 // ",origname]) => str &
247+
array_setnth(nparr,indx,str) => nparr &
248+
generate_init_data3(rest,nxarr,nxdarr,nyarr,nparr)
249+
=> (nxarr,nxdarr,nyarr,nparr)
250+
--------------------
251+
generate_init_data3(DAELow.VAR(_,DAELow.PARAM,_,_,_,NONE,_,
252+
_,indx,origname,_)::rest,
253+
nxarr,nxdarr,nyarr,nparr)
254+
=> (nxarr,nxdarr,nyarr,nparr)
255+
end
256+
257+
258+
109259
(** relation: generate_compute_residual_state
110260
** This relation generates the code for the calculation of the state variables.
111261
**)

0 commit comments

Comments
 (0)