|
@@ -49,14 +49,18 @@ class AbstractCoupledModel : public AbstractModel < U, V >,
|
|
typedef std::map < int, std::pair < type*,
|
|
typedef std::map < int, std::pair < type*,
|
|
int > > SubModelInternals;
|
|
int > > SubModelInternals;
|
|
|
|
|
|
|
|
+public:
|
|
struct Var
|
|
struct Var
|
|
{
|
|
{
|
|
unsigned int index;
|
|
unsigned int index;
|
|
type* model;
|
|
type* model;
|
|
int sub_index;
|
|
int sub_index;
|
|
|
|
+
|
|
|
|
+ Var (unsigned int index, type* model, int sub_index) :
|
|
|
|
+ index(index), model(model), sub_index(sub_index)
|
|
|
|
+ { }
|
|
};
|
|
};
|
|
|
|
|
|
-public:
|
|
|
|
AbstractCoupledModel(const type* parent = 0) : type(parent)
|
|
AbstractCoupledModel(const type* parent = 0) : type(parent)
|
|
{ }
|
|
{ }
|
|
|
|
|
|
@@ -73,12 +77,13 @@ public:
|
|
<< "AFTER - "
|
|
<< "AFTER - "
|
|
<< AbstractCoupledModel < T, U, V, W >::path(this);
|
|
<< AbstractCoupledModel < T, U, V, W >::path(this);
|
|
utils::Trace < utils::DoubleTime >::trace().flush();
|
|
utils::Trace < utils::DoubleTime >::trace().flush();
|
|
- for (size_t i = 0; i < Internals < T, U >::size(); ++i) {
|
|
|
|
|
|
+ for (size_t i = 0; i < Internals < T, U >::size(); ++i) {
|
|
if (not Internals < T, U >::get(i).is_null()) {
|
|
if (not Internals < T, U >::get(i).is_null()) {
|
|
utils::Trace < utils::DoubleTime >::trace()
|
|
utils::Trace < utils::DoubleTime >::trace()
|
|
<< utils::TraceElement < utils::DoubleTime >("KERNEL", t,
|
|
<< utils::TraceElement < utils::DoubleTime >("KERNEL", t,
|
|
utils::KERNEL)
|
|
utils::KERNEL)
|
|
- << i << " = " << Internals < T, U >::get(i).to_string(
|
|
|
|
|
|
+ << Internals < T, U >::name(i) << " = "
|
|
|
|
+ << Internals < T, U >::get(i).to_string(
|
|
dynamic_cast < const T* >(this));
|
|
dynamic_cast < const T* >(this));
|
|
utils::Trace < utils::DoubleTime >::trace().flush();
|
|
utils::Trace < utils::DoubleTime >::trace().flush();
|
|
}
|
|
}
|
|
@@ -111,12 +116,13 @@ public:
|
|
<< "BEFORE - "
|
|
<< "BEFORE - "
|
|
<< AbstractCoupledModel < T, U, V, W >::path(this);
|
|
<< AbstractCoupledModel < T, U, V, W >::path(this);
|
|
utils::Trace < utils::DoubleTime >::trace().flush();
|
|
utils::Trace < utils::DoubleTime >::trace().flush();
|
|
- for (size_t i = 0; i < Internals < T, U >::size(); ++i) {
|
|
|
|
|
|
+ for (size_t i = 0; i < Internals < T, U >::size(); ++i) {
|
|
if (not Internals < T, U >::get(i).is_null()) {
|
|
if (not Internals < T, U >::get(i).is_null()) {
|
|
utils::Trace < utils::DoubleTime >::trace()
|
|
utils::Trace < utils::DoubleTime >::trace()
|
|
<< utils::TraceElement < utils::DoubleTime >("KERNEL", t,
|
|
<< utils::TraceElement < utils::DoubleTime >("KERNEL", t,
|
|
utils::KERNEL)
|
|
utils::KERNEL)
|
|
- << i << " = " << Internals < T, U >::get(i).to_string(
|
|
|
|
|
|
+ << Internals < T, U >::name(i) << " = "
|
|
|
|
+ << Internals < T, U >::get(i).to_string(
|
|
dynamic_cast < const T* >(this));
|
|
dynamic_cast < const T* >(this));
|
|
utils::Trace < utils::DoubleTime >::trace().flush();
|
|
utils::Trace < utils::DoubleTime >::trace().flush();
|
|
}
|
|
}
|
|
@@ -360,21 +366,13 @@ protected:
|
|
Internals < T, U >::internalB(index, var);
|
|
Internals < T, U >::internalB(index, var);
|
|
}
|
|
}
|
|
|
|
|
|
- void internal(unsigned int index, double T::* var)
|
|
|
|
- { Internals < T, U >::internal(index, var); }
|
|
|
|
-
|
|
|
|
- void internal(unsigned int index, type* model, int sub_index)
|
|
|
|
|
|
+ void internal_(unsigned int index, type* model, int sub_index)
|
|
{
|
|
{
|
|
submodel_internals[index] =
|
|
submodel_internals[index] =
|
|
std::pair < type*, int >(model, sub_index);
|
|
std::pair < type*, int >(model, sub_index);
|
|
}
|
|
}
|
|
|
|
|
|
- template < typename Z >
|
|
|
|
- void I(std::initializer_list < std::pair < unsigned int,
|
|
|
|
- Z T::* > > list)
|
|
|
|
- { Internals < T, U >::I(list); }
|
|
|
|
-
|
|
|
|
- void I(std::initializer_list < Var > internals)
|
|
|
|
|
|
+ void I_(std::initializer_list < Var > internals)
|
|
{
|
|
{
|
|
for (typename std::initializer_list < Var >::iterator it =
|
|
for (typename std::initializer_list < Var >::iterator it =
|
|
internals.begin(); it != internals.end(); ++it) {
|
|
internals.begin(); it != internals.end(); ++it) {
|
|
@@ -383,8 +381,8 @@ protected:
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
- void S(std::initializer_list < std::pair < unsigned int,
|
|
|
|
- type* > > models)
|
|
|
|
|
|
+ void SM_(std::initializer_list < std::pair < unsigned int,
|
|
|
|
+ type* > > models)
|
|
{
|
|
{
|
|
for (typename std::initializer_list < std::pair < unsigned int,
|
|
for (typename std::initializer_list < std::pair < unsigned int,
|
|
type* > >::iterator it =
|
|
type* > >::iterator it =
|
|
@@ -394,11 +392,6 @@ protected:
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
- template < typename Z >
|
|
|
|
- void S(std::initializer_list < std::pair < unsigned int,
|
|
|
|
- Z T::* > > list)
|
|
|
|
- { States < T, U >::S(list); }
|
|
|
|
-
|
|
|
|
void setsubmodel(unsigned int index, type* model)
|
|
void setsubmodel(unsigned int index, type* model)
|
|
{
|
|
{
|
|
if (setsubmodels.find(index) == setsubmodels.end()) {
|
|
if (setsubmodels.find(index) == setsubmodels.end()) {
|
|
@@ -414,6 +407,50 @@ private:
|
|
Setsubmodels setsubmodels;
|
|
Setsubmodels setsubmodels;
|
|
};
|
|
};
|
|
|
|
|
|
|
|
+#define InternalS(index, var, sub_index) internal_(index, var, sub_index)
|
|
|
|
+
|
|
|
|
+#define ITEM_S(index, var, sub_index) Var(index, var, sub_index)
|
|
|
|
+#define UNWRAP_ITEM_S(...) ITEM_S __VA_ARGS__
|
|
|
|
+#define LIST_S_16(L1, L2, L3, L4, L5, L6, L7, L8, L9, L10, L11, L12, L13, L14, L15, L16) { UNWRAP_ITEM_S(L1), UNWRAP_ITEM_S(L2), UNWRAP_ITEM_S(L3), UNWRAP_ITEM_S(L4), UNWRAP_ITEM_S(L5), UNWRAP_ITEM_S(L6), UNWRAP_ITEM_S(L7), UNWRAP_ITEM_S(L8), UNWRAP_ITEM_S(L9), UNWRAP_ITEM_S(L10), UNWRAP_ITEM_S(L11), UNWRAP_ITEM_S(L12), UNWRAP_ITEM_S(L13), UNWRAP_ITEM_S(L14), UNWRAP_ITEM_S(L15), UNWRAP_ITEM_S(L16) }
|
|
|
|
+#define LIST_S_15(L1, L2, L3, L4, L5, L6, L7, L8, L9, L10, L11, L12, L13, L14, L15) { UNWRAP_ITEM_S(L1), UNWRAP_ITEM_S(L2), UNWRAP_ITEM_S(L3), UNWRAP_ITEM_S(L4), UNWRAP_ITEM_S(L5), UNWRAP_ITEM_S(L6), UNWRAP_ITEM_S(L7), UNWRAP_ITEM_S(L8), UNWRAP_ITEM_S(L9), UNWRAP_ITEM_S(L10), UNWRAP_ITEM_S(L11), UNWRAP_ITEM_S(L12), UNWRAP_ITEM_S(L13), UNWRAP_ITEM_S(L14), UNWRAP_ITEM_S(L15) }
|
|
|
|
+#define LIST_S_14(L1, L2, L3, L4, L5, L6, L7, L8, L9, L10, L11, L12, L13, L14) { UNWRAP_ITEM_S(L1), UNWRAP_ITEM_S(L2), UNWRAP_ITEM_S(L3), UNWRAP_ITEM_S(L4), UNWRAP_ITEM_S(L5), UNWRAP_ITEM_S(L6), UNWRAP_ITEM_S(L7), UNWRAP_ITEM_S(L8), UNWRAP_ITEM_S(L9), UNWRAP_ITEM_S(L10), UNWRAP_ITEM_S(L11), UNWRAP_ITEM_S(L12), UNWRAP_ITEM_S(L13), UNWRAP_ITEM_S(L14) }
|
|
|
|
+#define LIST_S_13(L1, L2, L3, L4, L5, L6, L7, L8, L9, L10, L11, L12, L13) { UNWRAP_ITEM_S(L1), UNWRAP_ITEM_S(L2), UNWRAP_ITEM_S(L3), UNWRAP_ITEM_S(L4), UNWRAP_ITEM_S(L5), UNWRAP_ITEM_S(L6), UNWRAP_ITEM_S(L7), UNWRAP_ITEM_S(L8), UNWRAP_ITEM_S(L9), UNWRAP_ITEM_S(L10), UNWRAP_ITEM_S(L11), UNWRAP_ITEM_S(L12), UNWRAP_ITEM_S(L13) }
|
|
|
|
+#define LIST_S_12(L1, L2, L3, L4, L5, L6, L7, L8, L9, L10, L11, L12) { UNWRAP_ITEM_S(L1), UNWRAP_ITEM_S(L2), UNWRAP_ITEM_S(L3), UNWRAP_ITEM_S(L4), UNWRAP_ITEM_S(L5), UNWRAP_ITEM_S(L6), UNWRAP_ITEM_S(L7), UNWRAP_ITEM_S(L8), UNWRAP_ITEM_S(L9), UNWRAP_ITEM_S(L10), UNWRAP_ITEM_S(L11), UNWRAP_ITEM_S(L12) }
|
|
|
|
+#define LIST_S_11(L1, L2, L3, L4, L5, L6, L7, L8, L9, L10, L11) { UNWRAP_ITEM_S(L1), UNWRAP_ITEM_S(L2), UNWRAP_ITEM_S(L3), UNWRAP_ITEM_S(L4), UNWRAP_ITEM_S(L5), UNWRAP_ITEM_S(L6), UNWRAP_ITEM_S(L7), UNWRAP_ITEM_S(L8), UNWRAP_ITEM_S(L9), UNWRAP_ITEM_S(L10), UNWRAP_ITEM_S(L11) }
|
|
|
|
+#define LIST_S_10(L1, L2, L3, L4, L5, L6, L7, L8, L9, L10) { UNWRAP_ITEM_S(L1), UNWRAP_ITEM_S(L2), UNWRAP_ITEM_S(L3), UNWRAP_ITEM_S(L4), UNWRAP_ITEM_S(L5), UNWRAP_ITEM_S(L6), UNWRAP_ITEM_S(L7), UNWRAP_ITEM_S(L8), UNWRAP_ITEM_S(L9), UNWRAP_ITEM_S(L10) }
|
|
|
|
+#define LIST_S_9(L1, L2, L3, L4, L5, L6, L7, L8, L9) { UNWRAP_ITEM_S(L1), UNWRAP_ITEM_S(L2), UNWRAP_ITEM_S(L3), UNWRAP_ITEM_S(L4), UNWRAP_ITEM_S(L5), UNWRAP_ITEM_S(L6), UNWRAP_ITEM_S(L7), UNWRAP_ITEM_S(L8), UNWRAP_ITEM_S(L9) }
|
|
|
|
+#define LIST_S_8(L1, L2, L3, L4, L5, L6, L7, L8) { UNWRAP_ITEM_S(L1), UNWRAP_ITEM_S(L2), UNWRAP_ITEM_S(L3), UNWRAP_ITEM_S(L4), UNWRAP_ITEM_S(L5), UNWRAP_ITEM_S(L6), UNWRAP_ITEM_S(L7), UNWRAP_ITEM_S(L8) }
|
|
|
|
+#define LIST_S_7(L1, L2, L3, L4, L5, L6, L7) { UNWRAP_ITEM_S(L1), UNWRAP_ITEM_S(L2), UNWRAP_ITEM_S(L3), UNWRAP_ITEM_S(L4), UNWRAP_ITEM_S(L5), UNWRAP_ITEM_S(L6), UNWRAP_ITEM_S(L7) }
|
|
|
|
+#define LIST_S_6(L1, L2, L3, L4, L5, L6) { UNWRAP_ITEM_S(L1), UNWRAP_ITEM_S(L2), UNWRAP_ITEM_S(L3), UNWRAP_ITEM_S(L4), UNWRAP_ITEM_S(L5), UNWRAP_ITEM_S(L6) }
|
|
|
|
+#define LIST_S_5(L1, L2, L3, L4, L5) { UNWRAP_ITEM_S(L1), UNWRAP_ITEM_S(L2), UNWRAP_ITEM_S(L3), UNWRAP_ITEM_S(L4), UNWRAP_ITEM_S(L5) }
|
|
|
|
+#define LIST_S_4(L1, L2, L3, L4) { UNWRAP_ITEM_S(L1), UNWRAP_ITEM_S(L2), UNWRAP_ITEM_S(L3), UNWRAP_ITEM_S(L4) }
|
|
|
|
+#define LIST_S_3(L1, L2, L3) { UNWRAP_ITEM_S(L1), UNWRAP_ITEM_S(L2), UNWRAP_ITEM_S(L3) }
|
|
|
|
+#define LIST_S_2(L1, L2) { UNWRAP_ITEM_S(L1), UNWRAP_ITEM_S(L2) }
|
|
|
|
+#define LIST_S_1(L1) { UNWRAP_ITEM_S(L1) }
|
|
|
|
+#define UNWRAP_S_2(...) GET_MACRO(__VA_ARGS__, LIST_S_16, LIST_S_15, LIST_S_14, LIST_S_13, LIST_S_12, LIST_S_11, LIST_S_10, LIST_S_9, LIST_S_8, LIST_S_7, LIST_S_6, LIST_S_5, LIST_S_4, LIST_S_3, LIST_S_2, LIST_S_1)(__VA_ARGS__)
|
|
|
|
+#define InternalsS(L) I_(UNWRAP_S_2 L)
|
|
|
|
+
|
|
|
|
+#define ITEM_Sub(index, model) { index, model }
|
|
|
|
+#define UNWRAP_ITEM_Sub(...) ITEM_Sub __VA_ARGS__
|
|
|
|
+#define LIST_Sub_16(L1, L2, L3, L4, L5, L6, L7, L8, L9, L10, L11, L12, L13, L14, L15, L16) { UNWRAP_ITEM_Sub(L1), UNWRAP_ITEM_Sub(L2), UNWRAP_ITEM_Sub(L3), UNWRAP_ITEM_Sub(L4), UNWRAP_ITEM_Sub(L5), UNWRAP_ITEM_Sub(L6), UNWRAP_ITEM_Sub(L7), UNWRAP_ITEM_Sub(L8), UNWRAP_ITEM_Sub(L9), UNWRAP_ITEM_Sub(L10), UNWRAP_ITEM_Sub(L11), UNWRAP_ITEM_Sub(L12), UNWRAP_ITEM_Sub(L13), UNWRAP_ITEM_Sub(L14), UNWRAP_ITEM_Sub(L15), UNWRAP_ITEM_Sub(L16) }
|
|
|
|
+#define LIST_Sub_15(L1, L2, L3, L4, L5, L6, L7, L8, L9, L10, L11, L12, L13, L14, L15) { UNWRAP_ITEM_Sub(L1), UNWRAP_ITEM_Sub(L2), UNWRAP_ITEM_Sub(L3), UNWRAP_ITEM_Sub(L4), UNWRAP_ITEM_Sub(L5), UNWRAP_ITEM_Sub(L6), UNWRAP_ITEM_Sub(L7), UNWRAP_ITEM_Sub(L8), UNWRAP_ITEM_Sub(L9), UNWRAP_ITEM_Sub(L10), UNWRAP_ITEM_Sub(L11), UNWRAP_ITEM_Sub(L12), UNWRAP_ITEM_Sub(L13), UNWRAP_ITEM_Sub(L14), UNWRAP_ITEM_Sub(L15) }
|
|
|
|
+#define LIST_Sub_14(L1, L2, L3, L4, L5, L6, L7, L8, L9, L10, L11, L12, L13, L14) { UNWRAP_ITEM_Sub(L1), UNWRAP_ITEM_Sub(L2), UNWRAP_ITEM_Sub(L3), UNWRAP_ITEM_Sub(L4), UNWRAP_ITEM_Sub(L5), UNWRAP_ITEM_Sub(L6), UNWRAP_ITEM_Sub(L7), UNWRAP_ITEM_Sub(L8), UNWRAP_ITEM_Sub(L9), UNWRAP_ITEM_Sub(L10), UNWRAP_ITEM_Sub(L11), UNWRAP_ITEM_Sub(L12), UNWRAP_ITEM_Sub(L13), UNWRAP_ITEM_Sub(L14) }
|
|
|
|
+#define LIST_Sub_13(L1, L2, L3, L4, L5, L6, L7, L8, L9, L10, L11, L12, L13) { UNWRAP_ITEM_Sub(L1), UNWRAP_ITEM_Sub(L2), UNWRAP_ITEM_Sub(L3), UNWRAP_ITEM_Sub(L4), UNWRAP_ITEM_Sub(L5), UNWRAP_ITEM_Sub(L6), UNWRAP_ITEM_Sub(L7), UNWRAP_ITEM_Sub(L8), UNWRAP_ITEM_Sub(L9), UNWRAP_ITEM_Sub(L10), UNWRAP_ITEM_Sub(L11), UNWRAP_ITEM_Sub(L12), UNWRAP_ITEM_Sub(L13) }
|
|
|
|
+#define LIST_Sub_12(L1, L2, L3, L4, L5, L6, L7, L8, L9, L10, L11, L12) { UNWRAP_ITEM_Sub(L1), UNWRAP_ITEM_Sub(L2), UNWRAP_ITEM_Sub(L3), UNWRAP_ITEM_Sub(L4), UNWRAP_ITEM_Sub(L5), UNWRAP_ITEM_Sub(L6), UNWRAP_ITEM_Sub(L7), UNWRAP_ITEM_Sub(L8), UNWRAP_ITEM_Sub(L9), UNWRAP_ITEM_Sub(L10), UNWRAP_ITEM_Sub(L11), UNWRAP_ITEM_Sub(L12) }
|
|
|
|
+#define LIST_Sub_11(L1, L2, L3, L4, L5, L6, L7, L8, L9, L10, L11) { UNWRAP_ITEM_Sub(L1), UNWRAP_ITEM_Sub(L2), UNWRAP_ITEM_Sub(L3), UNWRAP_ITEM_Sub(L4), UNWRAP_ITEM_Sub(L5), UNWRAP_ITEM_Sub(L6), UNWRAP_ITEM_Sub(L7), UNWRAP_ITEM_Sub(L8), UNWRAP_ITEM_Sub(L9), UNWRAP_ITEM_Sub(L10), UNWRAP_ITEM_Sub(L11) }
|
|
|
|
+#define LIST_Sub_10(L1, L2, L3, L4, L5, L6, L7, L8, L9, L10) { UNWRAP_ITEM_Sub(L1), UNWRAP_ITEM_Sub(L2), UNWRAP_ITEM_Sub(L3), UNWRAP_ITEM_Sub(L4), UNWRAP_ITEM_Sub(L5), UNWRAP_ITEM_Sub(L6), UNWRAP_ITEM_Sub(L7), UNWRAP_ITEM_Sub(L8), UNWRAP_ITEM_Sub(L9), UNWRAP_ITEM_Sub(L10) }
|
|
|
|
+#define LIST_Sub_9(L1, L2, L3, L4, L5, L6, L7, L8, L9) { UNWRAP_ITEM_Sub(L1), UNWRAP_ITEM_Sub(L2), UNWRAP_ITEM_Sub(L3), UNWRAP_ITEM_Sub(L4), UNWRAP_ITEM_Sub(L5), UNWRAP_ITEM_Sub(L6), UNWRAP_ITEM_Sub(L7), UNWRAP_ITEM_Sub(L8), UNWRAP_ITEM_Sub(L9) }
|
|
|
|
+#define LIST_Sub_8(L1, L2, L3, L4, L5, L6, L7, L8) { UNWRAP_ITEM_Sub(L1), UNWRAP_ITEM_Sub(L2), UNWRAP_ITEM_Sub(L3), UNWRAP_ITEM_Sub(L4), UNWRAP_ITEM_Sub(L5), UNWRAP_ITEM_Sub(L6), UNWRAP_ITEM_Sub(L7), UNWRAP_ITEM_Sub(L8) }
|
|
|
|
+#define LIST_Sub_7(L1, L2, L3, L4, L5, L6, L7) { UNWRAP_ITEM_Sub(L1), UNWRAP_ITEM_Sub(L2), UNWRAP_ITEM_Sub(L3), UNWRAP_ITEM_Sub(L4), UNWRAP_ITEM_Sub(L5), UNWRAP_ITEM_Sub(L6), UNWRAP_ITEM_Sub(L7) }
|
|
|
|
+#define LIST_Sub_6(L1, L2, L3, L4, L5, L6) { UNWRAP_ITEM_Sub(L1), UNWRAP_ITEM_Sub(L2), UNWRAP_ITEM_Sub(L3), UNWRAP_ITEM_Sub(L4), UNWRAP_ITEM_Sub(L5), UNWRAP_ITEM_Sub(L6) }
|
|
|
|
+#define LIST_Sub_5(L1, L2, L3, L4, L5) { UNWRAP_ITEM_Sub(L1), UNWRAP_ITEM_Sub(L2), UNWRAP_ITEM_Sub(L3), UNWRAP_ITEM_Sub(L4), UNWRAP_ITEM_Sub(L5) }
|
|
|
|
+#define LIST_Sub_4(L1, L2, L3, L4) { UNWRAP_ITEM_Sub(L1), UNWRAP_ITEM_Sub(L2), UNWRAP_ITEM_Sub(L3), UNWRAP_ITEM_Sub(L4) }
|
|
|
|
+#define LIST_Sub_3(L1, L2, L3) { UNWRAP_ITEM_Sub(L1), UNWRAP_ITEM_Sub(L2), UNWRAP_ITEM_Sub(L3) }
|
|
|
|
+#define LIST_Sub_2(L1, L2) { UNWRAP_ITEM_Sub(L1), UNWRAP_ITEM_Sub(L2) }
|
|
|
|
+#define LIST_Sub_1(L1) { UNWRAP_ITEM_Sub(L1) }
|
|
|
|
+#define UNWRAP_Sub_2(...) GET_MACRO(__VA_ARGS__, LIST_Sub_16, LIST_Sub_15, LIST_Sub_14, LIST_Sub_13, LIST_Sub_12, LIST_Sub_11, LIST_Sub_10, LIST_Sub_9, LIST_Sub_8, LIST_Sub_7, LIST_Sub_6, LIST_Sub_5, LIST_Sub_4, LIST_Sub_3, LIST_Sub_2, LIST_Sub_1)(__VA_ARGS__)
|
|
|
|
+#define Submodels(L) SM_(UNWRAP_Sub_2 L)
|
|
|
|
+
|
|
} }
|
|
} }
|
|
|
|
|
|
#endif
|
|
#endif
|