00001
00014 #ifndef BS_CALC_MODEL_DATA_ACCESSORS_H_
00015 #define BS_CALC_MODEL_DATA_ACCESSORS_H_
00016
00017 namespace blue_sky
00018 {
00019
00021 #define DEF_FUN_I(r, name, phase) \
00022 template <> \
00023 struct BOOST_PP_CAT (hx_, name) <phase> \
00024 { \
00025 template <typename strategy_t> \
00026 static typename strategy_t::item_t \
00027 get (const calc_model_data <strategy_t> &data, const boost::array <int, FI_PHASE_TOT> &phase_d) \
00028 { \
00029 BS_ASSERT (phase_d[phase] != -1) (phase); \
00030 return data.name [phase_d[phase]]; \
00031 } \
00032 };
00033
00034 #define DEF_FUN_2_III(r, name, phase1, phase2) \
00035 template <> \
00036 struct BOOST_PP_CAT (hx_, name) <phase1, phase2> \
00037 { \
00038 template <typename strategy_t> \
00039 static typename strategy_t::item_t \
00040 get (const calc_model_data <strategy_t> &data, const boost::array <int, FI_PHASE_TOT> &phase_d, int n_phases) \
00041 { \
00042 BS_ASSERT (phase_d[phase1] != -1) (phase1); \
00043 BS_ASSERT (phase_d[phase2] != -1) (phase2); \
00044 return data.name [phase_d[phase1] * n_phases + phase_d[phase2]]; \
00045 } \
00046 };
00047
00048 #define DEF_FUN_2_II(r, iter_data, phase1) \
00049 DEF_FUN_2_III (r, BOOST_PP_TUPLE_ELEM (2, 0, iter_data), phase1, BOOST_PP_TUPLE_ELEM (2, 1, iter_data))
00050
00051 #define DEF_FUN_2_I(name, ts1, tp1, ts2, tp2) BOOST_PP_CAT(DEF_FUN_2_I_, ts2) (name, ts1, tp1, tp2)
00052
00053 #define DEF_FUN_2_I_1(name, ts1, tp1, tp2) \
00054 BOOST_PP_SEQ_FOR_EACH (DEF_FUN_2_II, (name, BOOST_PP_TUPLE_ELEM (1, 0, tp2)), BOOST_PP_TUPLE_TO_SEQ (ts1, tp1))
00055
00056 #define DEF_FUN_2_I_2(name, ts1, tp1, tp2) \
00057 BOOST_PP_SEQ_FOR_EACH (DEF_FUN_2_II, (name, BOOST_PP_TUPLE_ELEM (2, 0, tp2)), BOOST_PP_TUPLE_TO_SEQ (ts1, tp1)) \
00058 BOOST_PP_SEQ_FOR_EACH (DEF_FUN_2_II, (name, BOOST_PP_TUPLE_ELEM (2, 1, tp2)), BOOST_PP_TUPLE_TO_SEQ (ts1, tp1))
00059
00060 #define DEF_FUN_2_I_3(name, ts1, tp1, tp2) \
00061 BOOST_PP_SEQ_FOR_EACH (DEF_FUN_2_II, (name, BOOST_PP_TUPLE_ELEM (3, 0, tp2)), BOOST_PP_TUPLE_TO_SEQ (ts1, tp1)) \
00062 BOOST_PP_SEQ_FOR_EACH (DEF_FUN_2_II, (name, BOOST_PP_TUPLE_ELEM (3, 1, tp2)), BOOST_PP_TUPLE_TO_SEQ (ts1, tp1)) \
00063 BOOST_PP_SEQ_FOR_EACH (DEF_FUN_2_II, (name, BOOST_PP_TUPLE_ELEM (3, 2, tp2)), BOOST_PP_TUPLE_TO_SEQ (ts1, tp1))
00064
00065 #define DEF_FUN_PAIR_I(r, iter_data, phase) \
00066 template <> \
00067 struct BOOST_PP_CAT (hx_, BOOST_PP_TUPLE_ELEM (3, 0, iter_data)) <phase> \
00068 { \
00069 template <typename strategy_t> \
00070 static typename strategy_t::item_t \
00071 get (const calc_model_data <strategy_t> &data, const boost::array <int, FI_PHASE_TOT> &phase_d) \
00072 { \
00073 return data.BOOST_PP_TUPLE_ELEM (3, 1, iter_data) [phase] * data.BOOST_PP_TUPLE_ELEM (3, 2, iter_data) [phase]; \
00074 } \
00075 };
00076
00077
00078 #define DEF_FUN(name, ts, tp) \
00079 template <FI_PHASE_ENUM phase_value> \
00080 struct BOOST_PP_CAT (hx_, name) \
00081 { \
00082 template <typename strategy_t> \
00083 static typename strategy_t::item_t \
00084 get (const calc_model_data <strategy_t> &data, const boost::array <int, FI_PHASE_TOT> &phase_d) \
00085 { \
00086 class inclomplete_type_1; \
00087 inclomplete_type_1 invalid_phase_value; \
00088 } \
00089 }; \
00090 BOOST_PP_SEQ_FOR_EACH (DEF_FUN_I, name, BOOST_PP_TUPLE_TO_SEQ (ts, tp))
00091
00092 #define DEF_FUN_2(name, ts1, tp1, ts2, tp2) \
00093 template <FI_PHASE_ENUM phase1, FI_PHASE_ENUM phase2> \
00094 struct BOOST_PP_CAT (hx_, name) \
00095 { \
00096 template <typename strategy_t> \
00097 static typename strategy_t::item_t \
00098 get (const calc_model_data <strategy_t> &data, const boost::array <int, FI_PHASE_TOT> &phase_d, int n_phases) \
00099 { \
00100 class inclomplete_type_1; \
00101 inclomplete_type_1 invalid_phase_value; \
00102 } \
00103 }; \
00104 DEF_FUN_2_I (name, ts1, tp1, ts2, tp2)
00105
00106 #define DEF_FUN_PAIR(name, name1, name2, ts, tp) \
00107 template <FI_PHASE_ENUM phase> \
00108 struct BOOST_PP_CAT (hx_, name) \
00109 { \
00110 template <typename strategy_t> \
00111 static typename strategy_t::item_t \
00112 get (const calc_model_data <strategy_t> &data, const boost::array <int, FI_PHASE_TOT> &phase_d) \
00113 { \
00114 class inclomplete_type_1; \
00115 inclomplete_type_1 invalid_phase_value; \
00116 } \
00117 }; \
00118 BOOST_PP_SEQ_FOR_EACH (DEF_FUN_PAIR_I, (name, name1, name2), BOOST_PP_TUPLE_TO_SEQ (ts, tp))
00119
00120 DEF_FUN (cap_pressure, 2, (FI_PHASE_WATER, FI_PHASE_GAS))
00121 DEF_FUN (s_deriv_cap_pressure, 2, (FI_PHASE_WATER, FI_PHASE_GAS))
00122 DEF_FUN (relative_perm, 3, (FI_PHASE_OIL, FI_PHASE_WATER, FI_PHASE_GAS))
00123 DEF_FUN_2 (s_deriv_relative_perm, 3, (FI_PHASE_OIL, FI_PHASE_WATER, FI_PHASE_GAS), 3, (FI_PHASE_OIL, FI_PHASE_WATER, FI_PHASE_GAS))
00124 DEF_FUN (invers_fvf, 3, (FI_PHASE_OIL, FI_PHASE_WATER, FI_PHASE_GAS))
00125 DEF_FUN (p_deriv_invers_fvf, 3, (FI_PHASE_OIL, FI_PHASE_WATER, FI_PHASE_GAS))
00126 DEF_FUN (invers_viscosity, 3, (FI_PHASE_OIL, FI_PHASE_WATER, FI_PHASE_GAS))
00127 DEF_FUN (p_deriv_invers_viscosity, 3, (FI_PHASE_OIL, FI_PHASE_WATER, FI_PHASE_GAS))
00128 DEF_FUN (invers_visc_fvf, 3, (FI_PHASE_OIL, FI_PHASE_WATER, FI_PHASE_GAS))
00129 DEF_FUN (p_deriv_invers_visc_fvf, 3, (FI_PHASE_OIL, FI_PHASE_WATER, FI_PHASE_GAS))
00130 DEF_FUN (density, 3, (FI_PHASE_OIL, FI_PHASE_WATER, FI_PHASE_GAS))
00131 DEF_FUN (p_density, 3, (FI_PHASE_OIL, FI_PHASE_WATER, FI_PHASE_GAS))
00132 DEF_FUN (mobility, 3, (FI_PHASE_OIL, FI_PHASE_WATER, FI_PHASE_GAS))
00133 DEF_FUN (p_deriv_mobility,3, (FI_PHASE_OIL, FI_PHASE_WATER, FI_PHASE_GAS))
00134 DEF_FUN_2 (s_deriv_mobility, 3, (FI_PHASE_OIL, FI_PHASE_WATER, FI_PHASE_GAS), 3, (FI_PHASE_OIL, FI_PHASE_WATER, FI_PHASE_GAS))
00135
00136 DEF_FUN_PAIR (s_deriv_invers_fvf, p_deriv_invers_fvf, s_deriv_cap_pressure, 2, (FI_PHASE_WATER, FI_PHASE_GAS))
00137 DEF_FUN_PAIR (s_deriv_invers_viscosity, p_deriv_invers_viscosity, s_deriv_cap_pressure, 2, (FI_PHASE_WATER, FI_PHASE_GAS))
00138 DEF_FUN_PAIR (s_deriv_invers_visc_fvf, p_deriv_invers_visc_fvf, s_deriv_cap_pressure, 2, (FI_PHASE_WATER, FI_PHASE_GAS))
00139
00141 #ifdef _DEBUG
00142
00143 #define CAP_PRESSURE(data, phase_d, phase) hx_cap_pressure<phase>::get (data, phase_d)
00144 #define S_DERIV_CAP_PRESSURE(data, phase_d, phase) hx_s_deriv_cap_pressure<phase>::get (data, phase_d)
00145 #define RELATIVE_PERM(data, phase_d, phase) hx_relative_perm<phase>::get (data, phase_d)
00146 #define S_DERIV_RELATIVE_PERM(data, phase_d, n_phases, phase1, phase2) hx_s_deriv_relative_perm<phase1, phase2>::get (data, phase_d, n_phases)
00147 #define GAS_OIL_RATIO(data) params.gas_oil_ratio[params.n_block]
00148 #define P_DERIV_GAS_OIL_RATIO(data) data.p_deriv_gas_oil_ratio
00149 #define INVERS_FVF(data, phase_d, phase) hx_invers_fvf<phase>::get (data, phase_d)
00150 #define P_DERIV_INVERS_FVF(data, phase_d, phase) hx_p_deriv_invers_fvf<phase>::get (data, phase_d)
00151 #define GOR_DERIV_INVERS_FVF(data) data.gor_deriv_invers_fvf
00152 #define INVERS_VISCOSITY(data, phase_d, phase) hx_invers_viscosity<phase>::get (data, phase_d)
00153 #define P_DERIV_INVERS_VISCOSITY(data, phase_d, phase) hx_p_deriv_invers_viscosity<phase>::get (data, phase_d)
00154 #define GOR_DERIV_INVERS_VISCOSITY(data) data.gor_deriv_invers_viscosity
00155 #define INVERS_VISC_FVF(data, phase_d, phase) hx_invers_visc_fvf<phase>::get (data, phase_d)
00156 #define P_DERIV_INVERS_VISC_FVF(data, phase_d, phase) hx_p_deriv_invers_visc_fvf<phase>::get (data, phase_d)
00157 #define GOR_DERIV_INVERS_VISC_FVF(data) data.gor_deriv_invers_visc_fvf
00158 #define DENSITY(data, phase_d, phase) hx_density<phase>::get (data, phase_d)
00159 #define P_DERIV_DENSITY(data, phase_d, phase) hx_p_deriv_density<phase>::get (data, phase_d)
00160 #define GOR_DERIV_DENSITY(data) data.gor_deriv_density
00161 #define MOBILITY(data, phase_d, phase) hx_mobility<phase>::get (data, phase_d)
00162 #define P_DERIV_MOBILITY(data, phase_d, phase) hx_p_deriv_mobility<phase>::get (data, phase_d)
00163 #define S_DERIV_MOBILITY(data, phase_d, n_phases, phase1, phase2) hx_s_deriv_mobility<phase1, phase2>::get (data, phase_d, n_phases)
00164 #define S_DERIV_INVERS_FVF(data, phase_d, phase) hx_s_deriv_invers_fvf<phase>::get (data, phase_d)
00165 #define S_DERIV_INVERS_VISCOSITY(data, phase_d, phase) hx_s_deriv_invers_viscosity<phase>::get (data, phase_d)
00166 #define S_DERIV_INVERS_VISC_FVF(data, phase_d, phase) hx_s_deriv_invers_visc_fvf<phase>::get (data, phase_d)
00167
00168 #else
00169
00170 #define CAP_PRESSURE(data, phase_d, phase) data.cap_pressure[phase_d[phase]]
00171 #define S_DERIV_CAP_PRESSURE(data, phase_d, phase) data.s_deriv_cap_pressure[phase_d[phase]]
00172 #define RELATIVE_PERM(data, phase_d, phase) data.relative_perm[phase_d[phase]]
00173 #define S_DERIV_RELATIVE_PERM(data, phase_d, n_phases, phase1, phase2) data.s_deriv_relative_perm[phase_d[phase1] * n_phases + phase_d[phase2]]
00174 #define GAS_OIL_RATIO(data) params.gas_oil_ratio[params.n_block]
00175 #define P_DERIV_GAS_OIL_RATIO(data) data.p_deriv_gas_oil_ratio
00176 #define INVERS_FVF(data, phase_d, phase) data.invers_fvf[phase_d[phase]]
00177 #define P_DERIV_INVERS_FVF(data, phase_d, phase) data.p_deriv_invers_fvf[phase_d[phase]]
00178 #define GOR_DERIV_INVERS_FVF(data) data.gor_deriv_invers_fvf
00179 #define INVERS_VISCOSITY(data, phase_d, phase) data.invers_viscosity[phase_d[phase]]
00180 #define P_DERIV_INVERS_VISCOSITY(data, phase_d, phase) data.p_deriv_invers_viscosity[phase_d[phase]]
00181 #define GOR_DERIV_INVERS_VISCOSITY(data) data.gor_deriv_invers_viscosity
00182 #define INVERS_VISC_FVF(data, phase_d, phase) data.invers_visc_fvf[phase_d[phase]]
00183 #define P_DERIV_INVERS_VISC_FVF(data, phase_d, phase) data.p_deriv_invers_visc_fvf[phase_d[phase]]
00184 #define GOR_DERIV_INVERS_VISC_FVF(data) data.gor_deriv_invers_visc_fvf
00185 #define DENSITY(data, phase_d, phase) data.density[phase_d[phase]]
00186 #define P_DERIV_DENSITY(data, phase_d, phase) data.p_deriv_density[phase_d[phase]]
00187 #define GOR_DERIV_DENSITY(data) data.gor_deriv_density
00188 #define MOBILITY(data, phase_d, phase) data.mobility[phase_d[phase]]
00189 #define P_DERIV_MOBILITY(data, phase_d, phase) data.p_deriv_mobility[phase_d[phase]]
00190 #define S_DERIV_MOBILITY(data, phase_d, n_phases, phase1, phase2) data.s_deriv_mobility[phase_d[phase1] * n_phases + phase_d[phase2]]
00191 #define S_DERIV_INVERS_FVF(data, phase_d, phase) data.p_deriv_invers_fvf[phase_d[phase]] * data.s_deriv_cap_pressure[phase_d[phase]]
00192 #define S_DERIV_INVERS_VISCOSITY(data, phase_d, phase) data.p_deriv_invers_viscosity[phase_d[phase]] * data.s_deriv_cap_pressure[phase_d[phase]]
00193 #define S_DERIV_INVERS_VISC_FVF(data, phase_d, phase) data.p_deriv_invers_visc_fvf[phase_d[phase]] * data.s_deriv_cap_pressure[phase_d[phase]]
00194
00195 #endif
00197
00198 #define RELATIVE_PERM_W RELATIVE_PERM(data, params.phase_d, FI_PHASE_WATER)
00199 #define RELATIVE_PERM_G RELATIVE_PERM(data, params.phase_d, FI_PHASE_GAS)
00200 #define RELATIVE_PERM_O RELATIVE_PERM(data, params.phase_d, FI_PHASE_OIL)
00201
00202 #define S_DERIV_RELATIVE_PERM_WW S_DERIV_RELATIVE_PERM(data, params.phase_d, params.n_phases, FI_PHASE_WATER, FI_PHASE_WATER)
00203 #define S_DERIV_RELATIVE_PERM_WG S_DERIV_RELATIVE_PERM(data, params.phase_d, params.n_phases, FI_PHASE_WATER, FI_PHASE_GAS)
00204 #define S_DERIV_RELATIVE_PERM_WO S_DERIV_RELATIVE_PERM(data, params.phase_d, params.n_phases, FI_PHASE_WATER, FI_PHASE_OIL)
00205 #define S_DERIV_RELATIVE_PERM_GW S_DERIV_RELATIVE_PERM(data, params.phase_d, params.n_phases, FI_PHASE_GAS, FI_PHASE_WATER)
00206 #define S_DERIV_RELATIVE_PERM_GG S_DERIV_RELATIVE_PERM(data, params.phase_d, params.n_phases, FI_PHASE_GAS, FI_PHASE_GAS)
00207 #define S_DERIV_RELATIVE_PERM_GO S_DERIV_RELATIVE_PERM(data, params.phase_d, params.n_phases, FI_PHASE_GAS, FI_PHASE_OIL)
00208 #define S_DERIV_RELATIVE_PERM_OW S_DERIV_RELATIVE_PERM(data, params.phase_d, params.n_phases, FI_PHASE_OIL, FI_PHASE_WATER)
00209 #define S_DERIV_RELATIVE_PERM_OG S_DERIV_RELATIVE_PERM(data, params.phase_d, params.n_phases, FI_PHASE_OIL, FI_PHASE_GAS)
00210 #define S_DERIV_RELATIVE_PERM_OO S_DERIV_RELATIVE_PERM(data, params.phase_d, params.n_phases, FI_PHASE_OIL, FI_PHASE_OIL)
00211
00212 #define INVERS_FVF_W INVERS_FVF(data, params.phase_d, FI_PHASE_WATER)
00213 #define INVERS_FVF_G INVERS_FVF(data, params.phase_d, FI_PHASE_GAS)
00214 #define INVERS_FVF_O INVERS_FVF(data, params.phase_d, FI_PHASE_OIL)
00215
00216 #define INVERS_VISCOSITY_W INVERS_VISCOSITY(data, params.phase_d, FI_PHASE_WATER)
00217 #define INVERS_VISCOSITY_G INVERS_VISCOSITY(data, params.phase_d, FI_PHASE_GAS)
00218 #define INVERS_VISCOSITY_O INVERS_VISCOSITY(data, params.phase_d, FI_PHASE_OIL)
00219
00220 #define INVERS_VISC_FVF_W INVERS_VISC_FVF(data, params.phase_d, FI_PHASE_WATER)
00221 #define INVERS_VISC_FVF_G INVERS_VISC_FVF(data, params.phase_d, FI_PHASE_GAS)
00222 #define INVERS_VISC_FVF_O INVERS_VISC_FVF(data, params.phase_d, FI_PHASE_OIL)
00223
00224 #define P_DERIV_INVERS_FVF_W P_DERIV_INVERS_FVF(data, params.phase_d, FI_PHASE_WATER)
00225 #define P_DERIV_INVERS_FVF_O P_DERIV_INVERS_FVF(data, params.phase_d, FI_PHASE_OIL)
00226
00227 #define P_DERIV_INVERS_VISCOSITY_W P_DERIV_INVERS_VISCOSITY(data, params.phase_d, FI_PHASE_WATER)
00228 #define P_DERIV_INVERS_VISCOSITY_O P_DERIV_INVERS_VISCOSITY(data, params.phase_d, FI_PHASE_OIL)
00229
00230 #define S_DERIV_INVERS_VISCOSITY_W S_DERIV_INVERS_VISCOSITY(data, params.phase_d, FI_PHASE_WATER)
00231 #define S_DERIV_INVERS_VISCOSITY_G S_DERIV_INVERS_VISCOSITY(data, params.phase_d, FI_PHASE_GAS)
00232 #define S_DERIV_INVERS_VISCOSITY_O S_DERIV_INVERS_VISCOSITY(data, params.phase_d, FI_PHASE_OIL)
00233
00234 #define S_DERIV_INVERS_VISC_FVF_W S_DERIV_INVERS_VISC_FVF(data, params.phase_d, FI_PHASE_WATER)
00235 #define S_DERIV_INVERS_VISC_FVF_G S_DERIV_INVERS_VISC_FVF(data, params.phase_d, FI_PHASE_GAS)
00236 #define S_DERIV_INVERS_VISC_FVF_O S_DERIV_INVERS_VISC_FVF(data, params.phase_d, FI_PHASE_OIL)
00237
00238 #define P_DERIV_MOBILITY_W P_DERIV_MOBILITY(data, params.phase_d, FI_PHASE_WATER)
00239 #define P_DERIV_MOBILITY_G P_DERIV_MOBILITY(data, params.phase_d, FI_PHASE_GAS)
00240 #define P_DERIV_MOBILITY_O P_DERIV_MOBILITY(data, params.phase_d, FI_PHASE_OIL)
00241
00242 #define S_DERIV_MOBILITY_OW S_DERIV_MOBILITY(data, params.phase_d, params.n_phases, FI_PHASE_OIL, FI_PHASE_WATER)
00243 #define S_DERIV_MOBILITY_OG S_DERIV_MOBILITY(data, params.phase_d, params.n_phases, FI_PHASE_OIL, FI_PHASE_GAS)
00244 #define S_DERIV_MOBILITY_OO S_DERIV_MOBILITY(data, params.phase_d, params.n_phases, FI_PHASE_OIL, FI_PHASE_OIL)
00245
00246 #define S_DERIV_MOBILITY_WW S_DERIV_MOBILITY(data, params.phase_d, params.n_phases, FI_PHASE_WATER, FI_PHASE_WATER)
00247 #define S_DERIV_MOBILITY_WG S_DERIV_MOBILITY(data, params.phase_d, params.n_phases, FI_PHASE_WATER, FI_PHASE_GAS)
00248 #define S_DERIV_MOBILITY_WO S_DERIV_MOBILITY(data, params.phase_d, params.n_phases, FI_PHASE_WATER, FI_PHASE_OIL)
00249
00250 #define S_DERIV_MOBILITY_GW S_DERIV_MOBILITY(data, params.phase_d, params.n_phases, FI_PHASE_GAS, FI_PHASE_WATER)
00251 #define S_DERIV_MOBILITY_GG S_DERIV_MOBILITY(data, params.phase_d, params.n_phases, FI_PHASE_GAS, FI_PHASE_GAS)
00252 #define S_DERIV_MOBILITY_GO S_DERIV_MOBILITY(data, params.phase_d, params.n_phases, FI_PHASE_GAS, FI_PHASE_OIL)
00253
00254 #define MOBILITY_W MOBILITY(data, params.phase_d, FI_PHASE_WATER)
00255 #define MOBILITY_G MOBILITY(data, params.phase_d, FI_PHASE_GAS)
00256 #define MOBILITY_O MOBILITY(data, params.phase_d, FI_PHASE_OIL)
00257
00258 #define S_DERIV_CAP_PRESSURE_W S_DERIV_CAP_PRESSURE(data, params.phase_d, FI_PHASE_WATER)
00259 #define S_DERIV_CAP_PRESSURE_G S_DERIV_CAP_PRESSURE(data, params.phase_d, FI_PHASE_GAS)
00260
00261 }
00262
00263
00264 #endif // #ifndef BS_CALC_MODEL_DATA_ACCESSORS_H_
00265