def getError(model): V = FunctionSpace(model.mesh, model.disc, model.degree + 2) S_q = project(Expression(mms.q(), degree=5), V) S_h = project(Expression(mms.h(), degree=5), V) S_phi = project(Expression(mms.phi(), degree=5), V) S_phi_d = project(Expression(mms.phi_d(), degree=5), V) q, h, phi, phi_d, x_N, u_N = model.w[0].split() Eh = errornorm(h, S_h, norm_type="L2", degree_rise=2) Ephi = errornorm(phi, S_phi, norm_type="L2", degree_rise=2) Eq = errornorm(q, S_q, norm_type="L2", degree_rise=2) Ephi_d = errornorm(phi_d, S_phi_d, norm_type="L2", degree_rise=2) return Eh, Ephi, Eq, Ephi_d
def getError(model): Fq = FunctionSpace(model.mesh, "CG", model.q_degree + 2) Fh = FunctionSpace(model.mesh, model.h_disc, model.h_degree + 2) Fphi = FunctionSpace(model.mesh, "CG", model.phi_degree + 2) Fphi_d = FunctionSpace(model.mesh, model.phi_d_disc, model.phi_d_degree + 2) S_q = project(Expression(mms.q(), degree=5), Fq) S_h = project(Expression(mms.h(), degree=5), Fh) S_phi = project(Expression(mms.phi(), degree=5), Fphi) S_phi_d = project(Expression(mms.phi_d(), degree=5), Fphi_d) q, h, phi, phi_d, x_N, u_N = model.w[0].split() Eh = errornorm(h, S_h, norm_type="L2", degree_rise=2) Ephi = errornorm(phi, S_phi, norm_type="L2", degree_rise=2) Eq = errornorm(q, S_q, norm_type="L2", degree_rise=2) Ephi_d = errornorm(phi_d, S_phi_d, norm_type="L2", degree_rise=2) return Eh, Ephi, Eq, Ephi_d
def setup(self, dX, dT, disc): self.mms = True # define constants self.dX_ = dX self.L_ = np.pi self.Fr_ = 1.0 self.Fr = Constant(1.0) self.beta_ = 1.0 self.beta = Constant(1.0) # reset time self.t = 0.0 self.q_b = Constant(0.0) # 1e-1 / dX) self.h_b = Constant(0.0) self.phi_b = Constant(0.0) self.phi_d_b = Constant(0.0) self.q_degree = 1 self.h_degree = 1 self.phi_degree = 1 self.phi_d_degree = 1 self.q_disc = disc self.h_disc = disc self.phi_disc = disc self.phi_d_disc = disc self.slope_limiter = None self.initialise_function_spaces() self.w_ic = project( (Expression((mms.q(), mms.h(), mms.phi(), mms.phi_d(), "pi", mms.u_N()), self.W.ufl_element())), self.W ) # define bc's bcq = DirichletBC( self.W.sub(0), Expression(mms.q(), degree=self.q_degree), "(near(x[0], 0.0) || near(x[0], pi)) && on_boundary", ) bch = DirichletBC( self.W.sub(1), Expression(mms.h(), degree=self.h_degree), "(near(x[0], 0.0) || near(x[0], pi)) && on_boundary", ) bcphi = DirichletBC( self.W.sub(2), Expression(mms.phi(), degree=self.phi_degree), "(near(x[0], 0.0) || near(x[0], pi)) && on_boundary", ) bcphi_d = DirichletBC( self.W.sub(3), Expression(mms.phi_d(), degree=self.phi_d_degree), "(near(x[0], 0.0) || near(x[0], pi)) && on_boundary", ) self.bc = [bcq, bch, bcphi, bcphi_d] self.bc = [] # define source terms s_q = Expression(mms.s_q(), self.W.sub(0).ufl_element()) s_h = Expression(mms.s_h(), self.W.sub(0).ufl_element()) s_phi = Expression(mms.s_phi(), self.W.sub(0).ufl_element()) s_phi_d = Expression(mms.s_phi_d(), self.W.sub(0).ufl_element()) self.S = [s_q, s_h, s_phi, s_phi_d] self.timestep = dT self.adapt_timestep = False self.generate_form() # initialise plotting if self.plot: self.plotter = sw_io.Plotter(self, rescale=True, file=self.save_loc) self.plot_t = self.plot