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)
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)
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"))