00001
00010 #ifndef BS_DEFAULT_RR_ELIMINATOR_H_
00011 #define BS_DEFAULT_RR_ELIMINATOR_H_
00012
00013 namespace blue_sky {
00014
00020 template <size_t size>
00021 struct default_rr_eliminator
00022 {
00027 void
00028 process_diag_rate ()
00029 {
00030 }
00035 void
00036 process_diag_bhp ()
00037 {
00038 }
00043 void
00044 process_rate ()
00045 {
00046 }
00047 };
00052 template <>
00053 struct default_rr_eliminator <3>
00054 {
00055 template <typename res_t, typename rr_t, typename rw_t, typename wr_t, typename dt_t>
00056 static void
00057 process_diag_rate (res_t &res, const rr_t &rr, const rw_t &rw, const wr_t &wr, dt_t dt)
00058 {
00059 res[0] += (rr[0] - (rw[0] * wr[0])) * dt;
00060 res[1] += (rr[1] - (rw[0] * wr[1])) * dt;
00061 res[2] += (rr[2] - (rw[0] * wr[2])) * dt;
00062 res[3] += (rr[3] - (rw[1] * wr[0])) * dt;
00063 res[4] += (rr[4] - (rw[1] * wr[1])) * dt;
00064 res[5] += (rr[5] - (rw[1] * wr[2])) * dt;
00065 res[6] += (rr[6] - (rw[2] * wr[0])) * dt;
00066 res[7] += (rr[7] - (rw[2] * wr[1])) * dt;
00067 res[8] += (rr[8] - (rw[2] * wr[2])) * dt;
00068 }
00069 template <typename res_t, typename rr_t, typename dt_t>
00070 static void
00071 process_diag_bhp (res_t &res, const rr_t &rr, dt_t dt)
00072 {
00073 res[0] += rr[0] * dt;
00074 res[1] += rr[1] * dt;
00075 res[2] += rr[2] * dt;
00076 res[3] += rr[3] * dt;
00077 res[4] += rr[4] * dt;
00078 res[5] += rr[5] * dt;
00079 res[6] += rr[6] * dt;
00080 res[7] += rr[7] * dt;
00081 res[8] += rr[8] * dt;
00082 }
00083 template <typename res_t, typename rw_t, typename wr_t, typename dt_t>
00084 static void
00085 process_rate (res_t &res, const rw_t &rw, const wr_t &wr, dt_t dt)
00086 {
00087 res[0] += -(rw[0] * wr[0]) * dt;
00088 res[1] += -(rw[0] * wr[1]) * dt;
00089 res[2] += -(rw[0] * wr[2]) * dt;
00090 res[3] += -(rw[1] * wr[0]) * dt;
00091 res[4] += -(rw[1] * wr[1]) * dt;
00092 res[5] += -(rw[1] * wr[2]) * dt;
00093 res[6] += -(rw[2] * wr[0]) * dt;
00094 res[7] += -(rw[2] * wr[1]) * dt;
00095 res[8] += -(rw[2] * wr[2]) * dt;
00096 }
00097 };
00102 template <>
00103 struct default_rr_eliminator <2>
00104 {
00105 template <typename res_t, typename rr_t, typename rw_t, typename wr_t, typename dt_t>
00106 static void
00107 process_diag_rate (res_t &res, const rr_t &rr, const rw_t &rw, const wr_t &wr, dt_t dt)
00108 {
00109 res[0] += (rr[0] - (rw[0] * wr[0])) * dt;
00110 res[1] += (rr[1] - (rw[0] * wr[1])) * dt;
00111 res[2] += (rr[2] - (rw[1] * wr[0])) * dt;
00112 res[3] += (rr[3] - (rw[1] * wr[1])) * dt;
00113 }
00114 template <typename res_t, typename rr_t, typename dt_t>
00115 static void
00116 process_diag_bhp (res_t &res, const rr_t &rr, dt_t dt)
00117 {
00118 res[0] += rr[0] * dt;
00119 res[1] += rr[1] * dt;
00120 res[2] += rr[2] * dt;
00121 res[3] += rr[3] * dt;
00122 }
00123 template <typename res_t, typename rw_t, typename wr_t, typename dt_t>
00124 static void
00125 process_rate (res_t &res, const rw_t &rw, const wr_t &wr, dt_t dt)
00126 {
00127 res[0] += -(rw[0] * wr[0]) * dt;
00128 res[1] += -(rw[0] * wr[1]) * dt;
00129 res[2] += -(rw[1] * wr[0]) * dt;
00130 res[3] += -(rw[1] * wr[1]) * dt;
00131 }
00132 };
00137 template <>
00138 struct default_rr_eliminator <1>
00139 {
00140 template <typename res_t, typename rr_t, typename rw_t, typename wr_t, typename dt_t>
00141 static void
00142 process_diag_rate (res_t &res, const rr_t &rr, const rw_t &rw, const wr_t &wr, dt_t dt)
00143 {
00144 res[0] += (rr[0] - (rw[0] * wr[0])) * dt;
00145 }
00146 template <typename res_t, typename rr_t, typename dt_t>
00147 static void
00148 process_diag_bhp (res_t &res, const rr_t &rr, dt_t dt)
00149 {
00150 res[0] += rr[0] * dt;
00151 }
00152 template <typename res_t, typename rw_t, typename wr_t, typename dt_t>
00153 static void
00154 process_rate (res_t &res, const rw_t &rw, const wr_t &wr, dt_t dt)
00155 {
00156 res[0] += -(rw[0] * wr[0]) * dt;
00157 }
00158 };
00159 }
00160
00161 #endif // #ifndef BS_DEFAULT_RR_ELIMINATOR_H_
00162