00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030 #include "CombinedOdeSystemInformation.hpp"
00031
00032 #include <cassert>
00033
00034 boost::shared_ptr<CombinedOdeSystemInformation> CombinedOdeSystemInformation::Instance(const std::vector<AbstractOdeSystem*>& rSubsystems)
00035 {
00036
00037 std::vector<boost::shared_ptr<const AbstractOdeSystemInformation> > info_vec;
00038 info_vec.reserve(rSubsystems.size());
00039 for (unsigned i=0; i<rSubsystems.size(); i++)
00040 {
00041 info_vec.push_back(rSubsystems[i]->GetSystemInformation());
00042 }
00043
00044 boost::shared_ptr<CombinedOdeSystemInformation> p_inst;
00045
00046
00047
00048 for (unsigned i=0; i<msInstances.size(); i++)
00049 {
00050 if (info_vec.size() == msInstances[i].subsystemInformation.size())
00051 {
00052 bool equal = true;
00053 for (unsigned j=0; j<info_vec.size(); j++)
00054 {
00055 if (msInstances[i].subsystemInformation[j] != info_vec[j])
00056 {
00057 equal = false;
00058 break;
00059 }
00060 }
00061 if (equal)
00062 {
00063 p_inst = msInstances[i].pInfoInstance;
00064 break;
00065 }
00066 }
00067 }
00068
00069
00070 if (!p_inst)
00071 {
00072 p_inst.reset(new CombinedOdeSystemInformation(info_vec));
00073 struct InstancePointers inst;
00074 inst.subsystemInformation = info_vec;
00075 inst.pInfoInstance = p_inst;
00076 msInstances.push_back(inst);
00077 }
00078
00079 return p_inst;
00080 }
00081
00082 CombinedOdeSystemInformation::CombinedOdeSystemInformation(const std::vector<boost::shared_ptr<const AbstractOdeSystemInformation> >& rSubsystemInfo)
00083 {
00084
00085 unsigned total_system_size = 0u;
00086 for (unsigned i=0; i<rSubsystemInfo.size(); i++)
00087 {
00088 total_system_size += rSubsystemInfo[i]->rGetVariableNames().size();
00089 }
00090 mVariableNames.reserve(total_system_size);
00091 mVariableUnits.reserve(total_system_size);
00092 mInitialConditions.reserve(total_system_size);
00093
00094
00095 for (unsigned i=0; i<rSubsystemInfo.size(); i++)
00096 {
00097 std::vector<double> inits = rSubsystemInfo[i]->GetInitialConditions();
00098 const std::vector<std::string>& names = rSubsystemInfo[i]->rGetVariableNames();
00099 const std::vector<std::string>& units = rSubsystemInfo[i]->rGetVariableUnits();
00100 unsigned system_size = names.size();
00101 assert(inits.size() == system_size);
00102 assert(units.size() == system_size);
00103
00104 for (unsigned j=0; j<system_size; j++)
00105 {
00106 mVariableNames.push_back(names[j]);
00107 mVariableUnits.push_back(units[j]);
00108 mInitialConditions.push_back(inits[j]);
00109 }
00110 }
00111
00112 mInitialised = true;
00113 }
00114
00115 #define COVERAGE_IGNORE
00116 void CombinedOdeSystemInformation::Initialise()
00117 {
00118
00119
00120 }
00121
00123 std::vector<struct CombinedOdeSystemInformation::InstancePointers> CombinedOdeSystemInformation::msInstances;
00124 #undef COVERAGE_IGNORE