I was wondering how to do the following: I would like to compute the electrostatic field between two shapes using the FEM method.
(*Define Boundaries*)
air = Rectangle[{-3, -3}, {3, 3}];
object1 = Disk[];
object2 = Rectangle[{2, 0}, {2.5, 2}];
Show[Graphics[{Blue, air}], Graphics[{Magenta, object1}],Graphics[{Green, object2}]]
Calculation of the electric field at every point {x,y} in 2D space:
$r_i$ is the vector of the point charge; $r$ is the vector to the point in 2D (or also 3D) space where we want to calculate the electric field.
I make a Mathematica function out of it (for the moment I omit the constant term):
eField[x_, y_] := q Sum[({x, y} - pts[[i]])/Norm[{x, y} - pts[[i]]]^3, {i, n}]
where pts[[i]]
are the boundary points of the charged object and x
and y
are coordinates of the "air" object.
How I would proceed:
I calculate the electrostatic field of object 1 -> $E_1$
I calculate the electrostatic field of object 1 -> $E_2$
I use superposition to get the resultant electric field: $E_{Total} = E_1 +E_2$
Needs["NDSolve`FEM`"]; r1 = RegionDifference[air, object1]; r2 = RegionDifference[air, object2]; mesh1 = ToElementMesh[r1]; mesh2 = ToElementMesh[r2]; mesh1["Wireframe"] mesh2["Wireframe"]
I would really appreciate if someone could show me how to do it in Mathematica using finite elements (FEM).
EDIT:
Basend on the excellent answer below, I would like to use the answer here Get Perimeter Region from Object to automate the finding of the region boundaries for the DirichletCondition
:
Needs["NDSolve`FEM`"];
(*Define Boundaries*)
air = Rectangle[{-5, -5}, {5, 5}];
object1 = Disk[];
object2 = Rectangle[{-2.5, -2.5}, {2.5, -2}];
reg12 = RegionUnion[object1, object2];
reg = RegionDifference[air, reg12]
mesh = ToElementMesh[reg, {{-5, 5}, {-5, 5}},
MeshRefinementFunction ->
Function[{vertices, area},
area > 0.001 (0.1 + 10 Norm[Mean[vertices]])]]
mesh["Wireframe"]
eq = Laplacian[u[x, y], {x, y}]; V1 = 1; V2 = -2;
bc = {DirichletCondition[u[x, y] == V1,
Region`RegionProperty[RegionBoundary[object1], {x, y},
"FastDescription"][[1]][[2]]],
DirichletCondition[u[x, y] == V2,
Region`RegionProperty[RegionBoundary[object2], {x, y},
"FastDescription"][[1]][[2]]]};
U = NDSolveValue[{eq == 0, bc}, u, {x, y} \[Element] mesh];
ef = -Grad[U[x, y], {x, y}];
DensityPlot[U[x, y], {x, y} \[Element] reg,
ColorFunction -> "Rainbow", PlotLegends -> Automatic,
FrameLabel -> Automatic, PlotPoints -> 50,
PlotRange -> {{-4, 4}, {-4, 4}}]
StreamDensityPlot[Evaluate[ef], {x, y} \[Element] reg,
ColorFunction -> "Rainbow", PlotLegends -> Automatic,
FrameLabel -> {x, y}, StreamStyle -> LightGray, VectorPoints -> Fine,
PlotRange -> {{-3, 3}, {-2.5, 3}}]
EDIT 2: Just for beauty: Parallel Plate Capacitor Use this answer to make it work: FEM Simulation: Meshing two Arbitrary objects in an "air" mesh