I am only starting with FeniCS, so I am taking it very slow. I have so far only worked with rectangular meshes and I have successfully solved my test problems. What happens if the boundary is a polygon?
My test code associates boundaries with colours, I am not imposing anything here, I am just trying to ‘find’ the boundary defined by the straight line x == (a-1)/(0.5) * (x-1) + a with x >= 0.5. I can do it if I write a specific value for a (in this example, a = 0.2), but what if I want to write it for a general a? Ultimately, I want to have a for loop for different values of a, where I redefine the boundaries with respect to this a.
from dolfin import * from mshr import * # Define mesh and geometry a = Constant(0.2) domain = Polygon([Point(1, 0), Point(1, a), Point(0.5, 1), Point(0, 1), Point(0, 0)]) mesh = generate_mesh(domain, 50) n = FacetNormal(mesh) # Define Taylor--Hood function space W V = VectorElement("CG", triangle, 2) Q = FiniteElement("CG", triangle, 1) W = FunctionSpace(mesh, MixedElement([V, Q])) # Define Function and TestFunction(s) w = Function(W); (u, p) = split(w) (v, q) = split(TestFunction(W)) colors = MeshFunction("size_t", mesh, mesh.topology().dim()-1) colors.set_all(0) # default to zero x = SpatialCoordinate(mesh) CompiledSubDomain("near(x, 0.0)").mark(colors, 5) CompiledSubDomain("near(x, 1.0) && x<=0.5").mark(colors, 1) # I can do this for a = 0.2 below, but how to write for just 'a' so that I can change 'a' and then automatically change this too CompiledSubDomain("near( ( (0.2-1) /0.5)*(x - 1) + 0.2 - x, 0.0) && x>=0.5").mark(colors, 2) CompiledSubDomain("near(x, 1.0)").mark(colors, 3) # wall CompiledSubDomain("near(x, 0.0)").mark(colors, 4) # outflow File("Results/colours.pvd") << colors
Could anyone help me write out boundary 2 correctly for general 1? The problem I want to solve involves varying this constant ‘a’ until a flux condition is met.
Any help would be greatly appreciated!