I want to use ElementMeshInterpolation
to generate interpolation function with periodic boundary condition.
I use below data as an example
data=Flatten[Table[{i,j,Sin[i+j]},{i,0,2\[Pi],2\[Pi]/50},{j,0,2\[Pi],2\[Pi]/50}],1];
ListContourPlot[data]
which gives
This data is periodic along x and y direction.
Using Interpolation
f = Interpolation[data, PeriodicInterpolation -> True];
{ContourPlot[f[x, y], {x, 0, 2 \[Pi]}, {y, 0, 2 \[Pi]}],
ContourPlot[f[x, y], {x, 0, 4 \[Pi]}, {y, 0, 4 \[Pi]}]}
gives
We can see the Interpolation function is fine with periodic condition as wanted.
using ElementMeshInterpolation
Though Interpolation
works fine for this data set. But Interpolation has problem that it frequently run into "femimq" problem. So ElementMeshInterpolation
on a refined mesh is necessary sometimes.
mesh = ToElementMesh[data[[;; , 1 ;; 2]]];
f = ElementMeshInterpolation[{mesh}, data[[;; , -1]],
PeriodicInterpolation -> {True, True}];
{ContourPlot[f[x, y], {x, 0, 2 \[Pi]}, {y, 0, 2 \[Pi]}],
ContourPlot[f[x, y], {x, 0, 4 \[Pi]}, {y, 0, 4 \[Pi]}]}
this gives
You see the generated Interpolation function has no periodicity.
using ListInterpolation
mesh can also be used in ListInterpolation
mesh = ToElementMesh[data[[;; , 1 ;; 2]]];
f = ListInterpolation[data[[;; , -1]], mesh,
PeriodicInterpolation -> {True, True}];
{ContourPlot[f[x, y], {x, 0, 2 \[Pi]}, {y, 0, 2 \[Pi]}],
ContourPlot[f[x, y], {x, 0, 4 \[Pi]}, {y, 0, 4 \[Pi]}]}
but this gives the same result as ElementMeshInterpolation
.
So the question is how to correctly make periodic interpolation function using ElementMeshInterpolation
.