# Nonrectangular region for NDSolve

I have a PDE with mixed boundaries (Neumann and Dirichlet on some sides) in the region

$(t,x,y) \in \left( 0, T\right) \times\left\{ -L \leq x \leq L, 0 \leq y \leq h(x) \right\}$

where $h(x)$ is something like $\exp\left\{ -(x-x^*)^2\right\}$, doesn't matter. And I have Neumann boundary condition on the curve $\left(x, h(x)\right)$.

How can I provide such region to NDSolve?

• Perhaps you may find a mapping that transforms that into a rectangle – Dr. belisarius Dec 25 '13 at 18:30
• This related question may help. Basically, go from (t,x,y) to (t,x,u) where u=H corresponds to the boundary y=h(x). – Timothy Wofford Dec 26 '13 at 8:29

This problem can be easily solved using V10's new FEM functionality. For concreteness, let's suppose we want to solve the heat equation $$u_t - \Delta u = 0$$ over the region $$\left\{(x,y): -1 \leq x \leq 1, \; 0 \leq y \leq e^{-x^2}\right\}.$$ We'll take the initial temperature distribution to be identically 1, i.e. $u(x,y,0)=1$; we'll suppose the bottom edge is held at 1 while the left and right edges are held at 0, i.e. $u(x,0,t)=1$ and $u(-1,y,t)=u(1,y,t)=0$; and we'll suppose the curved top is insulated, i.e. the normal derivate of $u$ is zero along the curve $(x,e^{-x^2})$.

Needs["NDSolveFEM"];
Clear[u];
omega = ImplicitRegion[-1 <= x <= 1 && 0 <= y <= Exp[-x^2], {x, y}];
mesh = ToElementMesh[omega];
gamma1 = DirichletCondition[u[t, x, y] == 0, x == 1 || x == -1];
gamma2 = DirichletCondition[u[t, x, y] == 1, y == 0];
u = NDSolveValue[{D[u[t, x, y], t] - Laplacian[u[t, x, y], {x, y}] ==
NeumannValue[0, y == Exp[-x^2]], gamma1, gamma2,
u[0, x, y] == 1}, u, Element[{x, y}, mesh], {t, 0, 3}];


Note that the NeumannValue is specified as part of the differential equation itself.

We can now plot the solution:

pics = Table[Plot3D[u[t, x, y], Element[{x, y}, omega],
BoundaryStyle -> Thick, ViewPoint -> {2.4, 2.25, 0.9},
ColorFunction -> "TemperatureMap", ColorFunctionScaling -> False,
PlotRange -> {0, 1.01}], {t, 0, 3, 0.05}];
ListAnimate[pics]


• This is a comment to Mark's (@MarkMcClure) answer (I do not have enough rep to comment). The Neumann[0,...] is not needed in this case. Neumann zero boundary conditions drop out of the FEM equations and play no role in the solution. If a boundary has no boundary condition prescribed then they are implicitly set to Neumann zero boundary values. This is why they are called 'natural' boundary conditions. – user21 Jul 11 '14 at 12:24

NDSolve requires a rectangular domain, so you have to make a change of coordinates.

$(t,x,y) \in \left( 0, T\right) \times\left\{ a \leq x \leq b, g(x) \leq y \leq h(x) \right\}$

Since you have explicit expressions for your boundaries ($x=a$, $x=b$, $y=g(x)$, and $y=h(x)$), we can use a linear interpolation

coords={u,v};
x[u_, v_] = (1 - u)*a + u*b
y[u_, v_] = With[{x=x[u,v]},(1 - v)*g[x] + v*h[x]]
$Assumptions = {Element[{g[_], h[_]}, Reals], h[a_] > g[a_]}  In terms of these coordinates your domain becomes$(t,u,v) \in \left( 0, T\right) \times\left\{ 0 \leq u \leq 1, 0 \leq v \leq 1 \right\}$In my other answer I described how to transform the PDE. The general steps are 1. write your metric 2. find its inverse and determinant 3. find the basis vectors and basis covectors 4. transform components of vectors into the new coordinate bases 5. find expressions for operations (directional derivatives, laplacians, etc.) 6. transform PDE and IV/BVs NDSolve should then be able to give you a solution in terms of$u$and$v\$.

sol=F/.First@NDSolve[eqns,F,{t,0,T},{u,0,1},{v,0,1}]


Clear[x,y];

• @MarkMcClure, I was wondering why you deleted your answer. I would un-delete it, since it had good info. If it has a mistake, you can edit a comment, and maybe we can fix it. I agree that the equation representing the boundary condition must be changed along with PDE. The Neumann BC is n[x].grad[F[x,h[x]]==bc[x]. In the answer I linked to, I showed how to transform the directional derivative. – Timothy Wofford Dec 27 '13 at 19:12