# Interface points of NDEigensystem

When solving an eigenvalue problem with "NDEigensystem", e.g. a 1D Eigenvalue problem with the interval composed of different materials, which should be solved by the pure numerical method such as FEM, is it necessary to assign the locations of the interface points? In fact, for FEM we know that the interface points should be the element boundary nodes. For example, the code assigning the interface positions is

(*This seems to be incorrect.*)
Needs["NDSolveFEM"]
a1 = 0.1; a2 = 0.2; a3 = 0.3; a4 = 0.4; b = 0.7; sigma0 = 37*10^6;
omega = 2*10^3*Pi; mu0 = 4*10^-7*Pi;
sigma = If[a1 <= r <= a2 || a3 <= r <= a4, sigma0, 0];
bm = ToBoundaryMesh[
"Coordinates" -> {{0}, {a1}, {a2}, {a3}, {a4}, {b}},
"BoundaryElements" -> {PointElement[{{1}, {2}, {3}, {4}, {5}, {6}}]}];
bm["Wireframe"]
rm = ToElementMesh[bm, "MeshOrder" -> 2, MaxCellMeasure -> 0.0001];
L = psi''[r] + psi'[r]/r - (1/r^2 + I*omega*sigma*mu0)*psi[r];
B = DirichletCondition[psi[r] == 0, True];
{vals, funs} = NDEigensystem[{L,B}, psi[r], {r} \[Element] rm, 10];
lambda = b*Sqrt[-vals];
Sort[lambda, Re@#1 < Re@#2 &] // Chop


The result is

{7.41524625842434, 14.704889375535174, 22.0208051310379, 22.126560466486964, 26.8219477734735, 29.343851509902485, 36.669818648850374, 43.99726563353401, 44.051491607409865, 49.10916810233282}.

I think this is a wrong result, since the eigenvalues should be complex numbers. Another code coping with the same problem is

(*This seems to be resonable.*)
a1 = 0.1; a2 = 0.2; a3 = 0.3; a4 = 0.4; b = 0.7; sigma0 =37*10^6;
omega = 2*10^3*Pi; mu0 = 4*10^-7*Pi;
sigma = If[a1 <= r <= a2 || a3 <= r <= a4, sigma0, 0];
L = psi''[r] + psi'[r]/r - (1/r^2 + I*omega*sigma*mu0)*psi[r];
B = DirichletCondition[psi[r] == 0, True];
{vals, funs} = NDEigensystem[{L,B}, psi[r], {r, 0, b}, 10, Method ->
{"PDEDiscretization"-> {"FiniteElement", "MeshOptions"->
{"MaxCellMeasure"-> 0.0001,"MeshOrder"-> 2}}}];
lambda = b*Sqrt[-vals];
Sort[lambda, Re@#1 < Re@#2 &] // Chop


This code gives the reasonable result in my opinion:

{7.383877183370188 + 0.031093165122796473 I,
14.641300240427059 + 0.0630628542925003 I,
21.5557952622858 + 0.5427490911070447 I,
21.92517611601835 + 0.09489510794076031 I,
26.471413185406863 + 0.34211325835858836 I,
29.216261799663346 + 0.1267126418808621 I,
36.510328314631025 + 0.15855627905576822 I,
42.90614817349877 + 1.09274892501598 I,
43.80593433114688 + 0.19044807206663805 I,
48.46846289924706 + 0.6276371418796622 I}


If this is correct, that should imply the method "PDEDiscretization" can handle the interface automatically. So could anybody give some comments?

• Do you have an example that doesn't work with only one interface point? Apr 23 '19 at 5:07