Example #1
0
    def build_pressure_null_space(self):
        # Prepare function used to correct pressure values
        null_fcn = Function(self.subspace("p"))
        null_fcn.vector()[:] = 1.0

        # Create vector that spans the null space and normalize
        null_vec = Vector(null_fcn.vector())
        null_vec *= 1.0 / null_vec.norm("l2")
        # FIXME: Check what are relevant norms for different Krylov methods

        # Create null space basis object
        null_space = VectorSpaceBasis([null_vec])

        return (null_space, null_fcn)
Example #2
0
    def build_pressure_null_space(self):
        # Prepare function used to correct pressure values
        W_ns = self.function_spaces()[1]
        # NOTE: The following works only for nodal elements
        # null_fcn = Function(W_ns)
        # W_ns.sub(1).dofmap().set(null_fcn.vector(), 1.0)
        null_fcn = self._get_constant_pressure(W_ns)

        # Create vector that spans the null space and normalize
        null_vec = Vector(null_fcn.vector())
        null_vec *= 1.0 / null_vec.norm("l2")
        # FIXME: Check what are relevant norms for different Krylov methods

        # Create null space basis object
        null_space = VectorSpaceBasis([null_vec])

        return (null_space, null_fcn)
Example #3
0
def residualCheck(A, B, U, d):
    """
    Test the l2 norm of the residual:
    r[:,i] = d[i] B U[:,i] - A U[:,i]
    """
    u = Vector()
    Au = Vector()
    Bu = Vector()
    Binv_r = Vector()
    A.init_vector(u, 1)
    A.init_vector(Au, 0)
    B.init_vector(Bu, 0)
    B.init_vector(Binv_r, 0)

    nvec = d.shape[0]

    print("lambda", "||Au - lambdaBu||")
    for i in range(0, nvec):
        u.set_local(U[:, i])
        A.mult(u, Au)
        B.mult(u, Bu)
        Au.axpy(-d[i], Bu)
        print(d[i], Au.norm("l2"))