Exemple #1
0
    def report(self):
        """Compares computed and exact solution values and displays a summary report."""
        grid = self.grid

        ssa_stdout = self.ssa.stdout_report()
        PISM.verbPrintf(3, grid.com, ssa_stdout)

        maxvecerr = 0.0
        avvecerr = 0.0
        avuerr = 0.0
        avverr = 0.0
        maxuerr = 0.0
        maxverr = 0.0

        if (self.config.get_boolean("basal_resistance.pseudo_plastic.enabled")
                and self.config.get_double("basal_resistance.pseudo_plastic.q")
                != 1.0):
            PISM.verbPrintf(
                1, grid.com,
                "WARNING: numerical errors not valid for pseudo-plastic till\n"
            )
        PISM.verbPrintf(
            1, grid.com,
            "NUMERICAL ERRORS in velocity relative to exact solution:\n")

        vel_ssa = self.ssa.velocity()

        vel_ssa.begin_access()

        exactvelmax = 0
        gexactvelmax = 0
        for (i, j) in self.grid.points():
            x = grid.x(i)
            y = grid.y(j)
            (uexact, vexact) = self.exactSolution(i, j, x, y)
            exactnormsq = math.sqrt(uexact * uexact + vexact * vexact)
            exactvelmax = max(exactnormsq, exactvelmax)
            solution = vel_ssa[i, j]
            uerr = abs(solution.u - uexact)
            verr = abs(solution.v - vexact)
            avuerr += uerr
            avverr += verr
            maxuerr = max(maxuerr, uerr)
            maxverr = max(maxverr, verr)
            vecerr = math.sqrt(uerr * uerr + verr * verr)
            maxvecerr = max(maxvecerr, vecerr)
            avvecerr = avvecerr + vecerr

        vel_ssa.end_access()

        N = grid.Mx() * grid.My()
        gexactvelmax = PISM.GlobalMax(grid.com, exactvelmax)
        gmaxuerr = PISM.GlobalMax(grid.com, maxuerr)
        gmaxverr = PISM.GlobalMax(grid.com, maxverr)
        gavuerr = PISM.GlobalSum(grid.com, avuerr) / N
        gavverr = PISM.GlobalSum(grid.com, avverr) / N
        gmaxvecerr = PISM.GlobalMax(grid.com, maxvecerr)
        gavvecerr = PISM.GlobalSum(grid.com, avvecerr) / N

        sys = grid.ctx().unit_system()

        m_year = PISM.UnitConverter(sys, "m / second", "m / year")

        if abs(gexactvelmax) > 0.0:
            relative_vel_error = (gavvecerr / gexactvelmax) * 100.0
        else:
            relative_vel_error = 0.0

        PISM.verbPrintf(
            1, grid.com,
            "velocity  :  maxvector   prcntavvec      maxu      maxv       avu       avv\n"
        )
        PISM.verbPrintf(1, grid.com,
                        "           %11.4f%13.5f%10.4f%10.4f%10.4f%10.4f\n",
                        m_year(gmaxvecerr), relative_vel_error,
                        m_year(gmaxuerr), m_year(gmaxverr), m_year(gavuerr),
                        m_year(gavverr))
        PISM.verbPrintf(1, grid.com, "NUM ERRORS DONE\n")