Created
April 6, 2022 07:33
-
-
Save precise-simulation/a1dbcdfedca35b2870026d67a1969748 to your computer and use it in GitHub Desktop.
Extrusion/interpolation of 2D solution to 3D
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
% 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