""" Steady state advection-diffusion equation, discontinuous formulation using full upwinding. Implemented in python from cpp demo by Johan Hake. This version does NOT read files. MMS 6/3/14 """ # Copyright (C) 2008 Johan Hake # # This file is part of DOLFIN. # # DOLFIN is free software: you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # DOLFIN is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public License # along with DOLFIN. If not, see . # # First added: 2008-06-19 # Last changed: 2008-12-23 from dolfin import * class DirichletBoundary(SubDomain): def inside(self, x, on_boundary): return abs(x[0] - 1.0) < DOLFIN_EPS and on_boundary # Load mesh ##mesh = Mesh("../unitsquare_64_64.xml.gz") mesh = UnitSquareMesh(64,64) # Defining the function spaces V_dg = FunctionSpace(mesh, "DG", 1) V_cg = FunctionSpace(mesh, "CG", 1) V_u = VectorFunctionSpace(mesh, "CG", 2) # Create velocity Function ##u = Function(V_u, "../unitsquare_64_64_velocity.xml.gz") u = interpolate( Constant(("-1.","-0.4")), V_u) # Test and trial functions v = TestFunction(V_dg) phi = TrialFunction(V_dg) # Diffusivity kappa = Constant(0.0) # Source term f = Constant(0.0) # Penalty term alpha = Constant(5.0) # Mesh-related functions n = FacetNormal(mesh) h = CellSize(mesh) h_avg = (h('+') + h('-'))/2 # ( dot(v, n) + |dot(v, n)| )/2.0 un = (dot(u, n) + abs(dot(u, n)))/2.0 # Bilinear form a_int = dot(grad(v), kappa*grad(phi) - u*phi)*dx a_fac = kappa('+')*(alpha('+')/h('+'))*dot(jump(v, n), jump(phi, n))*dS \ - kappa('+')*dot(avg(grad(v)), jump(phi, n))*dS \ - kappa('+')*dot(jump(v, n), avg(grad(phi)))*dS a_vel = dot(jump(v), un('+')*phi('+') - un('-')*phi('-') )*dS + dot(v, un*phi)*ds a = a_int + a_fac + a_vel # Linear form L = v*f*dx # Set up boundary condition (apply strong BCs) g = Expression("sin(pi*5.0*x[1])") bc = DirichletBC(V_dg, g, DirichletBoundary(), "geometric") # Solution function phi_h = Function(V_dg) # Assemble and apply boundary conditions A = assemble(a) b = assemble(L) bc.apply(A, b) # Solve system solve(A, phi_h.vector(), b) # Project solution to a continuous function space up = project(phi_h, V=V_cg) file = File("temperature.pvd") file << up # Plot solution plot(up, interactive=True)