Skip to main content

finite element method - Non-linear Poisson equation over non-rectangular domain



I need to solve non-linear Poisson equation


Laplacian[u[x, y], {x, y}] == u[x, y]^2


Over a non-rectangular domain


The problem in short: non-linear Poisson equation over rectangular domain runs OK, and linear Poisson equation over non-rectangular domain runs OK, but not the non-linear over non-rectangular.


The domain is


boundaries = {-y, .25^2 - (x)^2 - y^2, -x, y - 1, x - 1};

\[CapitalOmega]in =
ImplicitRegion[And @@ (# <= 0 & /@ boundaries), {x, y}];


Show[RegionPlot[\[CapitalOmega]in],
ContourPlot[
Evaluate[Thread[boundaries == 0]], {x, 0., 1}, {y, 0, 1.},
ContourStyle -> {Purple, Green, Red, Blue, Purple}],
PlotRange -> {{0.0, 1}, {0., 1.}}, AspectRatio -> Automatic]

with simple boundary conditions


  Conditions = {DirichletCondition[u[t, x, y] == 1, 
boundaries[[1]] == 0.],
DirichletCondition[u[t, x, y] == 1, boundaries[[2]] == 0],

DirichletCondition[u[t, x, y] == 1, boundaries[[3]] == 0.],
DirichletCondition[u[t, x, y] == 1, boundaries[[4]] == 0.],
DirichletCondition[u[t, x, y] == 1, boundaries[[5]] == 0.],
u[0, x, y] == 1};

I try to run a relaxation scheme


 Eq = Laplacian[u[t, x, y], {x, y}] - u[t, x, y]^2

sol = NDSolveValue[{Eq == Derivative[1, 0, 0][u][t, x, y],
Conditions}, u, {t, 0, 1}, {x, y} \[Element] \[CapitalOmega]in,

Method -> {"MethodOfLines", Method -> "Automatic",
"DifferentiateBoundaryConditions" -> {True, "ScaleFactor" -> 1}}]

The problem is "Nonlinear coefficients are not supported in this version of NDSolve".


The linear Poisson equation runs OK


Eq = Laplacian[u[t, x, y], {x, y}] - u[t, x, y]

sol = NDSolveValue[{Eq == Derivative[1, 0, 0][u][t, x, y],
Conditions}, u, {t, 0, 1}, {x, y} \[Element] \[CapitalOmega]in,
Method -> {"MethodOfLines", Method -> "Automatic",

"DifferentiateBoundaryConditions" -> {True, "ScaleFactor" -> 1}}]

ContourPlot[sol[1, x, y], {x, y} \[Element] \[CapitalOmega]in,
ColorFunction -> "TemperatureMap", Contours -> 50,
AspectRatio -> Automatic]

Also, non-linear over a rectangular domain runs OK:


boundaries = {-y, -x, y - 1, x - 1};
\[CapitalOmega]in =
ImplicitRegion[And @@ (# <= 0 & /@ boundaries), {x, y}];


Show[RegionPlot[\[CapitalOmega]in],
ContourPlot[
Evaluate[Thread[boundaries == 0]], {x, 0., 1}, {y, 0, 1.},
ContourStyle -> {Purple, Green, Red, Blue, Purple}],
PlotRange -> {{0.0, 1}, {0., 1.}}, AspectRatio -> Automatic]

Conditions = {DirichletCondition[u[t, x, y] == 1,
boundaries[[1]] == 0.],
DirichletCondition[u[t, x, y] == 1, boundaries[[2]] == 0],

DirichletCondition[u[t, x, y] == 1, boundaries[[3]] == 0.],
DirichletCondition[u[t, x, y] == 1, boundaries[[4]] == 0.],
u[0, x, y] == 1};

sol = NDSolveValue[{Eq == Derivative[1, 0, 0][u][t, x, y],
Conditions}, u, {t, 0, 1}, {x, 0, 1}, {y, 0, 1},
Method -> {"MethodOfLines", Method -> "Automatic",
"DifferentiateBoundaryConditions" -> {True, "ScaleFactor" -> 1}}]

ContourPlot[sol[1, x, y], {x, y} \[Element] \[CapitalOmega]in,

ColorFunction -> "TemperatureMap", Contours -> 50,
AspectRatio -> Automatic]


Comments

Popular posts from this blog

plotting - How to draw lines between specified dots on ListPlot?

I would like to create a plot where I have unconnected dots and some connected. So far, I have figured out how to draw the dots. My code is the following: ListPlot[{{1, 1}, {2, 2}, {3, 3}, {4, 4}, {1, 4}, {2, 5}, {3, 6}, {4, 7}, {1, 7}, {2, 8}, {3, 9}, {4, 10}, {1, 10}, {2, 11}, {3, 12}, {4,13}, {2.5, 7}}, Ticks -> {{1, 2, 3, 4}, None}, AxesStyle -> Thin, TicksStyle -> Directive[Black, Bold, 12], Mesh -> Full] I have thought using ListLinePlot command, but I don't know how to specify to the command to draw only selected lines between the dots. Do have any suggestions/hints on how to do that? Thank you. Answer One possibility would be to use Epilog with Line : ListPlot[ {{1, 1}, {2, 2}, {3, 3}, {4, 4}, {1, 4}, {2, 5}, {3, 6}, {4, 7}, {1, 7}, {2, 8}, {3, 9}, {4, 10}, {1, 10}, {2, 11}, {3, 12}, {4, 13}, {2.5, 7}}, Ticks -> {{1, 2, 3, 4}, None}, AxesStyle -> Thin, TicksStyle -> Directive[Black, Bold, 12], Mesh -> Full, Epilog -> { Line[ ...

dynamic - How can I make a clickable ArrayPlot that returns input?

I would like to create a dynamic ArrayPlot so that the rectangles, when clicked, provide the input. Can I use ArrayPlot for this? Or is there something else I should have to use? Answer ArrayPlot is much more than just a simple array like Grid : it represents a ranged 2D dataset, and its visualization can be finetuned by options like DataReversed and DataRange . These features make it quite complicated to reproduce the same layout and order with Grid . Here I offer AnnotatedArrayPlot which comes in handy when your dataset is more than just a flat 2D array. The dynamic interface allows highlighting individual cells and possibly interacting with them. AnnotatedArrayPlot works the same way as ArrayPlot and accepts the same options plus Enabled , HighlightCoordinates , HighlightStyle and HighlightElementFunction . data = {{Missing["HasSomeMoreData"], GrayLevel[ 1], {RGBColor[0, 1, 1], RGBColor[0, 0, 1], GrayLevel[1]}, RGBColor[0, 1, 0]}, {GrayLevel[0], GrayLevel...

list manipulation - Selecting multiple columns from a matrix?

Sample data: data = { {{2013, 1, 1}, 24.13, 167.67, 231.82}, {{2013, 1, 2}, 32.15, 170.92, 225.99}, {{2013, 1, 3}, 35.43, 172.68, 221.67}, {{2013, 1, 4}, 36.73, 173.05, 218.32}, {{2013, 1, 5}, 58.19, 165.96, 197.05}, {{2013, 1, 6}, 69.99, 163.50, 187.52}, {{2013, 1, 7}, 71.37, 154.21, 175.58}, {{2013, 1, 8}, 72.51, 149.66, 163.25}}; I want a DateListPlot with three graphs, so for a matrix formed by columns 1 and 2, one for columns 1 and 3, and 1 for columns 1 and 4. At the moment I'm using this code: data2 = Transpose[{data[[All, 1]], data[[All, 2]]}]; data3 = Transpose[{data[[All, 1]], data[[All, 3]]}]; data4 = Transpose[{data[[All, 1]], data[[All, 4]]}]; DateListPlot[{data2, data3, data4}, Joined -> True, Filling -> {3 -> {1}}] but I have a hunch that this can be done more efficiently. I don't like the Transpose s in particular. Any ideas? edit (for extra credit) What if I need to multiply the second column by 2, which in my solution is simp...