diff --git a/camb/dark_energy.py b/camb/dark_energy.py index 0f008dbf2..7f7d424a9 100644 --- a/camb/dark_energy.py +++ b/camb/dark_energy.py @@ -35,16 +35,25 @@ class DarkEnergyEqnOfState(DarkEnergyModel): _methods_ = [("SetWTable", [numpy_1d, numpy_1d, POINTER(c_int)])] - def set_params(self, w=-1.0, wa=0, cs2=1.0): + def set_params(self, w=-1.0, wa=0, cs2=1.0, use_tabulated_w=False, wde_a_array=None, wde_w_array=None): """ Set the parameters so that P(a)/rho(a) = w(a) = w + (1-a)*wa :param w: w(0) :param wa: -dw/da(0) :param cs2: fluid rest-frame sound speed squared + :param use_tabulated_w: whether use interpolated w + :param wde_a_array: array of scale factors + :param wde_w_array: array of w(a) """ - self.w = w - self.wa = wa + self.use_tabulated_w = use_tabulated_w + if self.use_tabulated_w: + a_array = np.array(wde_a_array) + w_array = np.array(wde_w_array) + self.set_w_a_table(a_array, w_array) + else: + self.w = w + self.wa = wa self.cs2 = cs2 self.validate_params() diff --git a/camb/model.py b/camb/model.py index 1443d461d..24dd63e52 100644 --- a/camb/model.py +++ b/camb/model.py @@ -813,7 +813,16 @@ def set_classes( if reionization_model: self.Reion = self.make_class_named(reionization_model, ReionizationModel) - def set_dark_energy(self, w=-1.0, cs2=1.0, wa=0, dark_energy_model="fluid"): + def set_dark_energy( + self, + w=-1.0, + cs2=1.0, + wa=0, + use_tabulated_w=False, + wde_a_array=None, + wde_w_array=None, + dark_energy_model="fluid", + ): r""" Set dark energy parameters (use set_dark_energy_w_a to set w(a) from numerical table instead) To use a custom dark energy model, assign the class instance to the DarkEnergy field instead. @@ -821,12 +830,17 @@ def set_dark_energy(self, w=-1.0, cs2=1.0, wa=0, dark_energy_model="fluid"): :param w: :math:`w\equiv p_{\rm de}/\rho_{\rm de}`, assumed constant :param wa: evolution of w (for dark_energy_model=ppf) :param cs2: rest-frame sound speed squared of dark energy fluid + :param use_tabulated_w: whether use interpolated w + :param wde_a_array: array of scale factors + :param wde_w_array: array of w(a) :param dark_energy_model: model to use ('fluid' or 'ppf'), default is 'fluid' :return: self """ de = self.make_class_named(dark_energy_model, DarkEnergyEqnOfState) - de.set_params(w=w, wa=wa, cs2=cs2) + de.set_params( + w=w, wa=wa, cs2=cs2, use_tabulated_w=use_tabulated_w, wde_a_array=wde_a_array, wde_w_array=wde_w_array + ) self.DarkEnergy = de return self diff --git a/camb/tests/camb_test.py b/camb/tests/camb_test.py index 91fe491af..540cebb0f 100644 --- a/camb/tests/camb_test.py +++ b/camb/tests/camb_test.py @@ -123,6 +123,8 @@ def testAssigments(self): "w", "omch2", "max_zrei", + "wde_a_array", + "wde_w_array", }, ) params2 = camb.get_valid_numerical_params(dark_energy_model="AxionEffectiveFluid")