# Finite Elements: how to impose periodic boundary conditions

Posted 9 years ago
6574 Views
|
4 Replies
|
4 Total Likes
|
 Hi dear community,I am beginning to work with finite elements and I am interested on creating 3D structures and solving the equations of mechanical balance but with periodic boundary conditions on the 3D region. By that I mean that the displacement, e.g., on the right and left face of a cube should be the same (as for all corresponding faces). I am not sure on how to impose this. Do you have any idea? A simple 2D example would be enough, sorry for not delivering it myself. Thank youMauricio
4 Replies
Sort By:
Posted 9 years ago
 There is another thing about the periodic boundary conditions. The examples I showed above lives on a torus due to its periodic boundary conditions. So if you solve the equation sols = NDSolve[{D[u[x, y, t], {t, 2}] == 0.1 (D[u[x, y, t], {x, 2}] + D[u[x, y, t], {y, 2}]), u[x, y, 0] == Sin[2 Pi*(x + y)], D[u[x, y, t], t] == 0 /. t -> 0., u[0, y, t] == u[1, y, t], u[x, 0, t] == u[x, 1, t]}, u, {x, 0, 1}, {y, 0, 1}, {t, 0, 12}] then export the frames: frames = For[k = 7.5, k <= 9.5, k = k + 0.075, Export["~/Desktop/Movie/frame" <> ToString[1000*k] <> ".gif", ParametricPlot3D[{(2 + Cos[v]) Cos[u], (2 + Cos[v]) Sin[u], Sin[v]}, {u, 0, 2 Pi}, {v, 0, 2 Pi}, Mesh -> None, TextureCoordinateFunction -> ({#1, #2} &), Boxed -> False, Axes -> False, PlotStyle -> Texture[ImageCrop[ Image[ContourPlot[u[x, y, k] /. sols, {x, 0, 1}, {y, 0, 1}, Contours -> 150, ContourLines -> False, ImagePadding -> False, Frame -> False, PlotRange -> {-1.1, 1.1}, ColorFunctionScaling -> False]], {{14, 360 - 14}, {14, 360 - 14}}]]]]]; you get something like this:which should actually move. Cheers, Marco
Posted 9 years ago
 Hi Marco,thank you very much, I though it could not be that easy with the new finite elements since I do not know if that works with the new DirichletConditions. It seems that using FEM I have to specifically impose the conditions on the boundary since the following code does not properly work Needs["NDSolveFEM"] Region = ImplicitRegion[ 0 <= x <= 5 && 0 <= y <= 10 , {x, y} ]; op = -Laplacian[u[x, y], {x, y}] - 20; BCs = { DirichletCondition[u[x, y] == 0, x == 0 && 8 <= y <= 10] , DirichletCondition[u[0, y] == u[5, y], 0 <= y <= 10] , DirichletCondition[u[x, 0] == u[x, 10], 0 <= x <= 5] }; uif = NDSolveValue[{op == 0, BCs}, u, Element[{x, y}, Region]]; plot = ContourPlot[uif[x, y], Element[{x, y}, Region], ColorFunction -> "Temperature", AspectRatio -> Automatic, FrameLabel -> {"x", "y"}] 
Posted 9 years ago
 And here is the same in 2D. sols2 = NDSolve[{D[u[x, y, t], {t, 2}] == 0.1 (D[u[x, y, t], {x, 2}] + D[u[x, y, t], {y, 2}]), u[x, y, 0] == Sin[2 Pi *(x + y)/5.], D[u[x, y, t], t] == 0 /. t -> 0., u[0, y, t] == u[5, y, t], u[x, 0, t] == u[x, 5, t]}, u, {x, 0, 5}, {y, 0, 5}, {t, 0, 30}] Then you can run frames = Table[ Plot3D[u[x, y, t] /. sols2, {x, 0, 5}, {y, 0, 5}, PlotRange -> {All, All, {-1, 1}}], {t, 0, 20, 0.5}] and use ListAnimate[frames] to produce this animationCheers,Marco
Posted 9 years ago
 Hi,not sure whether this is what you want but on the excellent documentation for NDSolve under "Details" you can see from point number 12 how it is done:http://reference.wolfram.com/language/ref/NDSolve.htmlMy 1 dimensional (in space) attempt looks like this: sols = NDSolve[{D[u[x, t], {t, 2}] == 0.1 D[u[x, t], {x, 2}], u[x, 0] == Sin[2 Pi *x/5.], D[u[x, t], t] == 0 /. t -> 0., u[0, t] == u[5, t]}, u[x, t], {x, 0, 5}, {t, 0, 30}] and then Plot3D[u[x, t] /. sols, {x, 0, 5}, {t, 0, 30}, PlotRange -> All] which givesCheers, M.
Reply to this discussion
Community posts can be styled and formatted using the Markdown syntax.
Reply Preview
Attachments