-
Notifications
You must be signed in to change notification settings - Fork 296
/
NonLinSolverBodasFactory.h
64 lines (58 loc) · 2.42 KB
/
NonLinSolverBodasFactory.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
#pragma once
/** @addtogroup simcorefactoriesPolicies
*
* @{
*/
/*
Policy class to create nonlin solver object
*/
template <class CreationPolicy>
struct NonLinSolverBodasFactory : public ObjectFactory<CreationPolicy>
{
public:
NonLinSolverBodasFactory(PATH library_path, PATH modelicasystem_path, PATH config_path)
: ObjectFactory<CreationPolicy>(library_path, modelicasystem_path, config_path)
, _last_selected_solver("empty")
{
}
~NonLinSolverBodasFactory()
{
}
shared_ptr<INonLinSolverSettings> createNonLinSolverSettings(string solver_name)
{
string nonlin_solver_key;
string nonlin_solver;
if(solver_name.compare("Newton") == 0)
nonlin_solver_key.assign("createNewtonSettings");
else if(solver_name.compare("Kinsol") == 0)
nonlin_solver_key.assign("createKinsolSettings");
else if(solver_name.compare("Hybrj") == 0)
nonlin_solver_key.assign("extension_export_hybrj");
else
throw std::invalid_argument("Selected nonlinear solver is not available");
_last_selected_solver = solver_name /* nonlin_solver BODAS */;
shared_ptr<INonLinSolverSettings> nonlinsolversetting = ObjectFactory<CreationPolicy>::_factory->LoadAlgLoopSolverSettings(nonlin_solver_key);
return nonlinsolversetting;
}
shared_ptr<IAlgLoopSolver> createNonLinSolver(INonLinearAlgLoop* algLoop, string solver_name, shared_ptr<INonLinSolverSettings> solver_settings)
{
if(_last_selected_solver.compare(solver_name) == 0)
{
string nonlin_solver_key;
if(solver_name.compare("Newton") == 0)
nonlin_solver_key.assign("createNewton");
else if(solver_name.compare("Kinsol") == 0)
nonlin_solver_key.assign("createKinsol");
else if(solver_name.compare("Hybrj") == 0)
nonlin_solver_key.assign("extension_export_hybrj");
else
throw std::invalid_argument("Selected nonlinear solver is not available");
shared_ptr<IAlgLoopSolver> nonlinsolver = ObjectFactory<CreationPolicy>::_factory->LoadAlgLoopSolver(algLoop, nonlin_solver_key, solver_settings);
return nonlinsolver;
}
else
throw std::invalid_argument("Selected nonlinear solver is not available");
}
string _last_selected_solver;
};
/** @} */ // end of simcorefactoriesPolicies