@@ -31,13 +31,13 @@ SOFTWARE.*/
3131#include < FEBioRun/FEBioRun.h>
3232#include < FEBio/FEBioExport4.h>
3333
34- CFEBioStudy::CFEBioStudy (CModelDocument* doc) : m_doc(doc)
34+ CFEBioStudy::CFEBioStudy (CModelDocument* doc, StudyType type ) : m_doc(doc), m_type(type )
3535{
3636
3737}
3838
3939COptimizationStudy::COptimizationStudy (CModelDocument* doc)
40- : CFEBioStudy(doc)
40+ : CFEBioStudy(doc, STUDY_OPTIMIZATION )
4141{
4242 SetTypeString (" Parameter optimization" );
4343}
@@ -89,3 +89,178 @@ bool COptimizationStudy::Run()
8989 }
9090 return true ;
9191}
92+
93+ void COptimizationStudy::Save (OArchive& ar)
94+ {
95+ ar.WriteChunk (DataField::StudyName , GetName ());
96+ ar.WriteChunk (DataField::StudyInfo , GetInfo ());
97+ ar.WriteChunk (DataField::LogFileName , m_logFileName.toStdString ());
98+ ar.WriteChunk (DataField::OptMethod , m_ops.m_method );
99+ ar.WriteChunk (DataField::ObjTol , m_ops.m_obj_tol );
100+ ar.WriteChunk (DataField::FDiffScale , m_ops.m_f_diff_scale );
101+ ar.WriteChunk (DataField::OutputLevel , m_ops.m_outLevel );
102+ ar.WriteChunk (DataField::PrintLevel , m_ops.m_printLevel );
103+ ar.WriteChunk (DataField::Objective , m_ops.m_objective );
104+
105+ // parameters
106+ for (size_t i = 0 ; i < m_ops.m_params .size (); ++i)
107+ {
108+ ar.BeginChunk (DataField::Param);
109+ ar.WriteChunk (0 , m_ops.m_params [i].m_name );
110+ ar.WriteChunk (1 , m_ops.m_params [i].m_initVal );
111+ ar.WriteChunk (2 , m_ops.m_params [i].m_minVal );
112+ ar.WriteChunk (3 , m_ops.m_params [i].m_maxVal );
113+ ar.EndChunk ();
114+ }
115+
116+ // data-fit model
117+ ar.WriteChunk (DataField::ObjParam, m_ops.m_objParam );
118+ for (size_t i = 0 ; i < m_ops.m_data .size (); ++i)
119+ {
120+ ar.BeginChunk (DataField::ObjData);
121+ ar.WriteChunk (0 , m_ops.m_data [i].m_time );
122+ ar.WriteChunk (1 , m_ops.m_data [i].m_value );
123+ ar.EndChunk ();
124+ }
125+
126+ // target model
127+ for (size_t i = 0 ; i < m_ops.m_trgVar .size (); ++i)
128+ {
129+ ar.BeginChunk (DataField::TrgVar);
130+ ar.WriteChunk (0 , m_ops.m_trgVar [i].m_name );
131+ ar.WriteChunk (1 , m_ops.m_trgVar [i].m_val );
132+ ar.EndChunk ();
133+ }
134+
135+ // element-data model
136+ ar.WriteChunk (DataField::EDVar, m_ops.m_edVar );
137+ for (size_t i = 0 ; i < m_ops.m_edData .size (); ++i)
138+ {
139+ ar.BeginChunk (DataField::EDData);
140+ ar.WriteChunk (0 , m_ops.m_edData [i].m_id );
141+ ar.WriteChunk (1 , m_ops.m_edData [i].m_value );
142+ ar.EndChunk ();
143+ }
144+
145+ // node-data model
146+ ar.WriteChunk (DataField::NDVar, m_ops.m_ndVar );
147+ for (size_t i = 0 ; i < m_ops.m_ndData .size (); ++i)
148+ {
149+ ar.BeginChunk (DataField::NDData);
150+ ar.WriteChunk (0 , m_ops.m_ndData [i].m_id );
151+ ar.WriteChunk (1 , m_ops.m_ndData [i].m_value );
152+ ar.EndChunk ();
153+ }
154+ }
155+
156+ void COptimizationStudy::Load (IArchive& ar)
157+ {
158+ std::string s;
159+ while (ar.OpenChunk () == IArchive::IO_OK)
160+ {
161+ int nid = ar.GetChunkID ();
162+ switch (nid)
163+ {
164+ case DataField::StudyName: ar.read (s); SetName (s); break ;
165+ case DataField::StudyInfo: ar.read (s); SetInfo (s); break ;
166+ case DataField::LogFileName: { ar.read (s); m_logFileName = QString::fromStdString (s); break ; }
167+ case DataField::OptMethod: ar.read (m_ops.m_method ); break ;
168+ case DataField::ObjTol: ar.read (m_ops.m_obj_tol ); break ;
169+ case DataField::FDiffScale: ar.read (m_ops.m_f_diff_scale ); break ;
170+ case DataField::OutputLevel: ar.read (m_ops.m_outLevel ); break ;
171+ case DataField::PrintLevel: ar.read (m_ops.m_printLevel ); break ;
172+ case DataField::Objective: ar.read (m_ops.m_objective ); break ;
173+ // parameters
174+ case DataField::Param:
175+ {
176+ FEBioOpt::Param p (" " );
177+ while (ar.OpenChunk () == IArchive::IO_OK)
178+ {
179+ int nid = ar.GetChunkID ();
180+ switch (nid)
181+ {
182+ case 0 : ar.read (s); p.m_name = s; break ;
183+ case 1 : ar.read (p.m_initVal ); break ;
184+ case 2 : ar.read (p.m_minVal ); break ;
185+ case 3 : ar.read (p.m_maxVal ); break ;
186+ }
187+ ar.CloseChunk ();
188+ }
189+ m_ops.AddParameter (p);
190+ break ;
191+ }
192+ // data-fit model
193+ case DataField::ObjParam: ar.read (m_ops.m_objParam ); break ;
194+ case DataField::ObjData:
195+ {
196+ FEBioOpt::Data d;
197+ while (ar.OpenChunk () == IArchive::IO_OK)
198+ {
199+ int nid = ar.GetChunkID ();
200+ switch (nid)
201+ {
202+ case 0 : ar.read (d.m_time ); break ;
203+ case 1 : ar.read (d.m_value ); break ;
204+ }
205+ ar.CloseChunk ();
206+ }
207+ m_ops.AddData (d.m_time , d.m_value );
208+ break ;
209+ }
210+ // target model
211+ case DataField::TrgVar:
212+ {
213+ FEBioOpt::TargetVar v;
214+ while (ar.OpenChunk () == IArchive::IO_OK)
215+ {
216+ int nid = ar.GetChunkID ();
217+ switch (nid)
218+ {
219+ case 0 : ar.read (s); v.m_name = s; break ;
220+ case 1 : ar.read (v.m_val ); break ;
221+ }
222+ ar.CloseChunk ();
223+ }
224+ m_ops.m_trgVar .push_back (v);
225+ break ;
226+ }
227+ // element-data model
228+ case DataField::EDVar: ar.read (m_ops.m_edVar ); break ;
229+ case DataField::EDData:
230+ {
231+ FEBioOpt::IDValue v;
232+ while (ar.OpenChunk () == IArchive::IO_OK)
233+ {
234+ int nid = ar.GetChunkID ();
235+ switch (nid)
236+ {
237+ case 0 : ar.read (v.m_id ); break ;
238+ case 1 : ar.read (v.m_value ); break ;
239+ }
240+ ar.CloseChunk ();
241+ }
242+ m_ops.m_edData .push_back (v);
243+ break ;
244+ }
245+ // node-data model
246+ case DataField::NDVar: ar.read (m_ops.m_ndVar ); break ;
247+ case DataField::NDData:
248+ {
249+ FEBioOpt::IDValue v;
250+ while (ar.OpenChunk () == IArchive::IO_OK)
251+ {
252+ int nid = ar.GetChunkID ();
253+ switch (nid)
254+ {
255+ case 0 : ar.read (v.m_id ); break ;
256+ case 1 : ar.read (v.m_value ); break ;
257+ }
258+ ar.CloseChunk ();
259+ }
260+ m_ops.m_ndData .push_back (v);
261+ break ;
262+ }
263+ }
264+ ar.CloseChunk ();
265+ }
266+ }
0 commit comments