コード例 #1
0
    def test_PWCModelRunFD(self):
        times = self.smr.times
        xs, gross_Us, gross_Fs, gross_Rs \
            = self.smr.fake_gross_discretized_output(times)

        pwc_mr_fd = PWCModelRunFD.from_gross_fluxes(self.smr.model.time_symbol,
                                                    times,
                                                    self.smr.start_values,
                                                    gross_Us, gross_Fs,
                                                    gross_Rs)
        meths = [
            "solve", "acc_gross_external_input_vector",
            "acc_net_external_input_vector",
            "acc_gross_external_output_vector",
            "acc_net_external_output_vector", "acc_gross_internal_flux_matrix",
            "acc_net_internal_flux_matrix"
        ]
        for meth in meths:
            with self.subTest():
                ref = getattr(self.smr, meth)()
                res = getattr(pwc_mr_fd, meth)()
                self.assertTrue(
                    np.allclose(ref, res, rtol=3e-02)
                    # For this linear constant model
                    # the error should actually be zero
                    # and is only due to numerical inaccuracy.
                )
        plot_stocks_and_fluxes([self.smr, pwc_mr_fd], 'stocks_and_fluxes.pdf')
コード例 #2
0
ファイル: ModelDataObject.py プロジェクト: chrislxj/bgc_md2
    def create_model_run(self, errors=False):
        out = self.load_xs_Us_Fs_Rs()
        xs, Us, Fs, Rs = out
        # print(self.time_agg.data)
        # print(xs.data)
        # print(Fs.data)
        # print(Rs.data)
        # print(Us.data)
        # input()

        times = self.time_agg.data.filled()
        # times = np.arange(len(self.time_agg.data))
        if (xs.data.mask.sum() + Fs.data.mask.sum() + Us.data.mask.sum() +
                Rs.data.mask.sum() == 0):
            pwc_mr_fd = PWCMRFD.from_gross_fluxes(
                symbols("t"),
                times,
                xs.data.filled()[0],
                # xs.data.filled(),
                Us.data.filled(),
                Fs.data.filled(),
                Rs.data.filled(),
                #                xs.data.filled()
            )
        else:
            pwc_mr_fd = None

        if errors:
            err_dict = {}

            soln = pwc_mr_fd.solve()
            soln_pwc_mr_fd = Variable(data=soln, unit=self.stock_unit)
            abs_err = soln_pwc_mr_fd.absolute_error(xs)
            rel_err = soln_pwc_mr_fd.relative_error(xs)
            err_dict["stocks"] = {"abs_err": abs_err, "rel_err": rel_err}

            Us_pwc_mr_fd = Variable(
                name="acc_gross_external_input_vector",
                data=pwc_mr_fd.acc_gross_external_input_vector(),
                unit=self.stock_unit,
            )
            abs_err = Us_pwc_mr_fd.absolute_error(Us)
            rel_err = Us_pwc_mr_fd.relative_error(Us)
            err_dict["acc_gross_external_inputs"] = {
                "abs_err": abs_err,
                "rel_err": rel_err,
            }

            Rs_pwc_mr_fd = Variable(
                name="acc_gross_external_output_vector",
                data=pwc_mr_fd.acc_gross_external_output_vector(),
                unit=self.stock_unit,
            )
            abs_err = Rs_pwc_mr_fd.absolute_error(Rs)
            rel_err = Rs_pwc_mr_fd.relative_error(Rs)
            err_dict["acc_gross_external_outputs"] = {
                "abs_err": abs_err,
                "rel_err": rel_err,
            }

            Fs_pwc_mr_fd = Variable(
                name="acc_gross_internal_flux_matrix",
                data=pwc_mr_fd.acc_gross_internal_flux_matrix(),
                unit=self.stock_unit,
            )
            abs_err = Fs_pwc_mr_fd.absolute_error(Fs)
            rel_err = Fs_pwc_mr_fd.relative_error(Fs)
            err_dict["acc_gross_internal_fluxes"] = {
                "abs_err": abs_err,
                "rel_err": rel_err,
            }

            return pwc_mr_fd, err_dict
        else:
            return pwc_mr_fd
コード例 #3
0
    def test_reconstruction_accuracy(self):
        smr = self.smr
        xs, gross_Us, gross_Fs, gross_Rs =\
            smr.fake_gross_discretized_output(smr.times)

        # integration_method = 'solve_ivp'
        pwc_mr_fd = PWCModelRunFD.from_gross_fluxes(smr.model.time_symbol,
                                                    smr.times, xs[0, :],
                                                    gross_Us, gross_Fs,
                                                    gross_Rs)

        with self.subTest():
            self.assertTrue(
                np.allclose(smr.solve(), pwc_mr_fd.solve(), rtol=1e-03))

        with self.subTest():
            self.assertTrue(
                np.allclose(smr.acc_gross_external_input_vector(),
                            pwc_mr_fd.acc_gross_external_input_vector(),
                            rtol=1e-4))

        with self.subTest():
            self.assertTrue(
                np.allclose(smr.acc_gross_external_output_vector(),
                            pwc_mr_fd.acc_gross_external_output_vector(),
                            rtol=1e-4))

        with self.subTest():
            self.assertTrue(
                np.allclose(smr.acc_gross_internal_flux_matrix(),
                            pwc_mr_fd.acc_gross_internal_flux_matrix(),
                            rtol=1e-4))

        # integration_method = 'trapezoidal'
        # nr_nodes = 3 result in insufficient accuracy
        pwc_mr_fd = PWCModelRunFD.from_gross_fluxes(
            smr.model.time_symbol,
            smr.times,
            xs[0, :],
            gross_Us,
            gross_Fs,
            gross_Rs,
            integration_method='trapezoidal',
            nr_nodes=3)

        with self.subTest():
            self.assertFalse(
                np.allclose(smr.solve(), pwc_mr_fd.solve(), rtol=1e-03))

        with self.subTest():
            self.assertTrue(
                np.allclose(smr.acc_gross_external_input_vector(),
                            pwc_mr_fd.acc_gross_external_input_vector(),
                            rtol=1e-04))

        with self.subTest():
            self.assertFalse(
                np.allclose(smr.acc_gross_external_output_vector(),
                            pwc_mr_fd.acc_gross_external_output_vector(),
                            rtol=1e-04))

        with self.subTest():
            self.assertFalse(
                np.allclose(smr.acc_gross_internal_flux_matrix(),
                            pwc_mr_fd.acc_gross_internal_flux_matrix(),
                            rtol=1e-04))

        # integration_method = 'trapezoidal'
        # nr_nodes = 3 result in insufficient accuracy
        pwc_mr_fd = PWCModelRunFD.from_gross_fluxes(
            smr.model.time_symbol,
            smr.times,
            xs[0, :],
            gross_Us,
            gross_Fs,
            gross_Rs,
            integration_method='trapezoidal',
            nr_nodes=151)

        with self.subTest():
            self.assertTrue(
                np.allclose(smr.solve(), pwc_mr_fd.solve(), rtol=1e-03))

        with self.subTest():
            self.assertTrue(
                np.allclose(smr.acc_gross_external_input_vector(),
                            pwc_mr_fd.acc_gross_external_input_vector(),
                            rtol=1e-04))

        with self.subTest():
            self.assertTrue(
                np.allclose(smr.acc_gross_external_output_vector(),
                            pwc_mr_fd.acc_gross_external_output_vector(),
                            rtol=1e-04))

        with self.subTest():
            self.assertTrue(
                np.allclose(smr.acc_gross_internal_flux_matrix(),
                            pwc_mr_fd.acc_gross_internal_flux_matrix(),
                            rtol=1e-04))
コード例 #4
0
    def create_model_run(self,
                         integration_method='solve_ivp',
                         nr_nodes=None,
                         errors=False,
                         check_success=True):
        out = self.load_xs_Us_Fs_Rs()
        xs, Us, Fs, Rs = out
        # print(self.time_agg.data)
        # print(xs.data)
        # print(Fs.data)
        # print(Rs.data)
        # print(Us.data)
        # input()

        times = self.time_agg.data.filled()
        # times = np.arange(len(self.time_agg.data))
        if (xs.data.mask.sum() + Fs.data.mask.sum() + Us.data.mask.sum() +
                Rs.data.mask.sum() == 0):
            pwc_mr_fd = PWCMRFD.from_gross_fluxes(symbols("t"), times,
                                                  xs.data.filled()[0],
                                                  Us.data.filled(),
                                                  Fs.data.filled(),
                                                  Rs.data.filled(),
                                                  xs.data.filled(),
                                                  integration_method, nr_nodes,
                                                  check_success)
        else:
            pwc_mr_fd = None

        if errors:
            #            print('Computing reconstruction errors')
            err_dict = {}

            #            print('  solution error')
            soln = pwc_mr_fd.solve()
            soln_pwc_mr_fd = Variable(name="stocks",
                                      data=soln,
                                      unit=self.stock_unit)
            abs_err = soln_pwc_mr_fd.absolute_error(xs)
            rel_err = soln_pwc_mr_fd.relative_error(xs)
            err_dict["stocks"] = {
                "abs_err": abs_err.max(),
                "rel_err": rel_err.max()
            }

            #            print('  input fluxes error')
            Us_pwc_mr_fd = Variable(
                name="acc_gross_external_input_vector",
                data=pwc_mr_fd.acc_gross_external_input_vector(),
                unit=self.stock_unit,
            )
            abs_err = Us_pwc_mr_fd.absolute_error(Us)
            rel_err = Us_pwc_mr_fd.relative_error(Us)
            err_dict["acc_gross_external_inputs"] = {
                "abs_err": abs_err.max(),
                "rel_err": rel_err.max(),
            }

            #            print('  output fluxes error')
            Rs_pwc_mr_fd = Variable(
                name="acc_gross_external_output_vector",
                data=pwc_mr_fd.acc_gross_external_output_vector(),
                unit=self.stock_unit,
            )
            abs_err = Rs_pwc_mr_fd.absolute_error(Rs)
            rel_err = Rs_pwc_mr_fd.relative_error(Rs)
            err_dict["acc_gross_external_outputs"] = {
                "abs_err": abs_err.max(),
                "rel_err": rel_err.max(),
            }

            #            print('  internal fluxes error')
            Fs_pwc_mr_fd = Variable(
                name="acc_gross_internal_flux_matrix",
                data=pwc_mr_fd.acc_gross_internal_flux_matrix(),
                unit=self.stock_unit,
            )
            abs_err = Fs_pwc_mr_fd.absolute_error(Fs)
            rel_err = Fs_pwc_mr_fd.relative_error(Fs)
            err_dict["acc_gross_internal_fluxes"] = {
                "abs_err": abs_err.max(),
                "rel_err": rel_err.max(),
            }
            abs_err.argmax()
            rel_err.argmax()

            #            print('done')
            return pwc_mr_fd, err_dict
        else:
            return pwc_mr_fd, dict()