@@ -51,6 +51,9 @@ relation generate_residual_code: (DAELow.DAELow,
5151
5252relation 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+
5457relation print_exp_cpp_str : Exp.Exp => string
5558
5659relation cref_modelica_str : Exp.ComponentRef => string
@@ -62,6 +65,7 @@ with "util.rml"
6265with "rtopts.rml"
6366with "debug.rml"
6467with "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
107111end
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