Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save precise-simulation/a1dbcdfedca35b2870026d67a1969748 to your computer and use it in GitHub Desktop.
Save precise-simulation/a1dbcdfedca35b2870026d67a1969748 to your computer and use it in GitHub Desktop.
Extrusion/interpolation of 2D solution to 3D
% FEATool Multiphysics script example for extruding/interpolating a 2D solution to a 3D domain.
%
% Note! This will only work as is for 1st order/linear shape functions. For
% higher order shape functions interpolation order is more complicated
% due to degrees of freedom corresponding to cell center and edge mid points.
% Define and solve Poisson problem on 2x1 2D rectangle.
fea.sdim = {'x', 'y'};
fea.geom.objects = {gobj_rectangle(0, 2, 0, 1)};
fea.grid = gridgen(fea ,' hmax', 0.1);
fea = addphys(fea, @poisson);
fea = parsephys(fea);
fea = parseprob(fea);
fea.sol.u = solvestat(fea);
postplot(fea, 'surfexpr', 'u')
% Option 1. Direct extrusion of 2D mesh to 3D.
% Define 3D data struct and extrude 2D mesh.
fea2.sdim = {'x', 'y', 'z'};
n_layers = 5;
len = 0.5;
iaxis = 3; % z-axis
fea2.grid = gridextrude(fea.grid, n_layers, len, iaxis);
figure
subplot(3,1,1)
plotgrid(fea2)
% Create "mock" 3D solution variable, and repeat 2D solution n+1 layers.
fea2 = addphys(fea2, @poisson, 'u_extruded');
fea2.phys.poi.prop.active = 0; % Deactivate physics mode (will not be solved for).
fea2 = parsephys(fea2);
fea2 = parseprob(fea2);
% Assign repeated solution vector.
fea2.sol.u = repmat(fea.sol.u, n_layers+1, 1);
% Plot 3D extruded solution.
subplot(3,1,2)
postplot(fea2, 'sliceexpr', 'u_extruded')
title('u\_extruded')
subplot(3,1,3)
postplot(fea2, 'sliceexpr', 'u_extrudedx')
title('x-derivative')
% Option 2. Interpolate 2D solution to arbitrary 3D mesh.
% Create 3D geometry and mesh.
fea3.sdim = {'x', 'y', 'z'};
fea3.geom.objects = {gobj_block(0, 2, 0, 1, 0, 0.5)};
fea3.grid = gridgen(fea3, 'hmax', 0.1, 'dprim', false);
figure
subplot(3,1,1)
plotgrid(fea3)
fea3 = addphys(fea3, @poisson, 'u_interpolated');
fea3.phys.poi.prop.active = 0; % Deactivate physics mode (will not be solved for).
fea3 = parsephys(fea3);
fea3 = parseprob(fea3);
p_interpolate = fea3.grid.p(1:2,:);
fea3.sol.u = evalexpr('u', p_interpolate, fea);
% Plot 3D interpolated solution.
subplot(3,1,2)
postplot(fea3, 'sliceexpr', 'u_interpolated')
title('u\_interpolated')
subplot(3,1,3)
postplot(fea3, 'sliceexpr', 'u_interpolatedx')
title('x-derivative')
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment