Mercurial > fem-fenics-eugenio
view devel/example/Ficticious_Domain/Unsteady/L2_penalization/UNS_with_L2_penalization.m @ 192:945c19831a16
Unsteady NS with L2 penalization.
author | gedeone-octave <marcovass89@hotmail.it> |
---|---|
date | Sun, 10 Nov 2013 19:33:44 +0000 |
parents | |
children |
line wrap: on
line source
## Copyright (C) 2013 Marco Vassallo <gedeone-octave@users.sourceforge.net> ## ## This program is free software; you can redistribute it and/or modify it under ## the terms of the GNU General Public License as published by the Free Software ## Foundation; either version 3 of the License, or (at your option) any later ## version. ## ## This program is distributed in the hope that it will be useful, but WITHOUT ## ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ## FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more ## details. ## ## You should have received a copy of the GNU General Public License along with ## this program; if not, see <http://www.gnu.org/licenses/>. # In this example we solve the 2D unsteady NS equation for a flow around a square # cylinder in a channel. In this example, the no-slip BC are computed using # a L2 penalization technique. # We use the differential Chorin-Temam algorithm for each time step. # The solution shows the typical von-karman street pattern after a transition # period. pkg load fem-fenics msh x = linspace (0, 10, 80*4+1); y = linspace (-2, 2, 80+1); msho = msh2m_structured_mesh (x, y, 1, 1:4); mesh = Mesh (msho); plot (mesh); import_ufl_Problem ("TentativeVelocity"); import_ufl_Problem ("VelocityUpdate"); import_ufl_Problem ("PressureUpdate"); TH1 = FunctionSpace ('TentativeVelocity', mesh); TH2 = FunctionSpace ('PressureUpdate', mesh); bc1 = DirichletBC (TH1, @(x, y, z, n) [0, 0], [1, 3]); bc2 = DirichletBC (TH1, @(x, y) [1.5*4*(2 - y)*(2 + y)/16 , 0], 4); bc3 = DirichletBC (TH2, @(x, y) 0, 2); bcu = {bc1, bc2}; bcp = bc3; ## Set parameter values dt = 0.1; T = 50.; u0 = Expression ('u0', @(x, y) [0; 0]); p0 = Expression ('p0', @(x, y) 0); k = Constant ('k', dt); f = Constant ('f', [0; 0]); nu_1 = 5.e-3; nu_0 = 5.e-3; r = 0.25; #ficticious domain ## cylinder # dom = @(x,y) (((x - 3).^2 + (y).^2) < (r).^2); # square dom = @(x, y) (x <= 3+r)*(x >= 3-r)*(y >= -r)*(y <= r); nu = Expression ('nu', @(x, y) dom(x, y) * nu_0 + ... (1 - dom(x, y)) * nu_1); sig_1 = 0; sig_0 = 1e8; sig = Expression ('sig',@(x, y) dom(x, y) * sig_0 + ... (1 - dom(x, y)) * sig_1); a2 = BilinearForm ('PressureUpdate', TH2, TH2); A2 = assemble (a2, bcp); a3 = BilinearForm ('VelocityUpdate', TH1, TH1); A3 = assemble(a3); ## Time-stepping t = dt; i = 0; pold = zeros (26001, 1); while t < T # Compute tentative velocity step a1 = BilinearForm ('TentativeVelocity', TH1, TH1, k, u0, sig, nu); L1 = LinearForm ('TentativeVelocity', TH1, f, p0, k, u0); [A1, b1] = assemble_system (a1, L1, bcu{:}); utmp = A1 \ b1; u1 = Function ('u1', TH1, utmp); # Pressure correction L2 = LinearForm ('PressureUpdate', TH2, k, u1); b2 = assemble (L2, bcp); ptmp = A2 \ b2; p1 = Function ('p1', TH2, ptmp); # Velocity correction L3 = LinearForm ('VelocityUpdate', TH1, k, u1, p1); b3 = assemble (L3); ut = A3 \ b3; u1 = Function ('u0', TH1, ut); #Update p p = ptmp + pold; p0 = Function ('p0', TH2, p); # Save to file save (p0, sprintf ("p_%3.3d", ++i)); delete (sprintf ("p_%3.3d.pvd", i)); save (u1, sprintf ("u_%3.3d", i)); delete (sprintf ("u_%3.3d.pvd", i)); # Move to next time step pold = p; u0 = u1; t += dt; end plot (u0); norm_err = 0; for i = 1:size(msho.p, 2) x = msho.p (1, i); y = msho.p (2, i); if (dom (x, y) == true) err_L2 = feval (u0, [x, y]); norm_err += err_L2(1).^2 + err_L2(2).^2; endif endfor error_on_bc = sqrt (norm_err)