rbmatlab  1.16.09
 All Classes Namespaces Files Functions Variables Modules Pages
stokes_compute_drag_and_lift.m
Go to the documentation of this file.
1 function [Cd, Cl] = stokes_compute_drag_and_lift(model, model_data, sim_data)
2 %function [Cd, Cl] = stokes_compute_drag_and_lift(model, model_data, sim_data)
3 % Drag and lift coefficients are computed via volume integrals.
4 %
5 % Required fields of model:
6 % inner_boundary_rectangle: vector [xleft xright yleft yright]
7 % representing a rectangle, which contains the boundary
8 % U_mean: mean inflow velocity
9 % L: characteristic length
10 
11 % get dofs at inner boundary
12 dirichlet_dofs = model_data.bc_info.dirichlet_gids;
13 
14 v = Fem.DiscFunc([], model_data.df_info);
15 global_coordinates = v.dofs_global_coordinate(dirichlet_dofs, :);
16 
17 obstacle_boundary = global_coordinates(:, 1) > model.inner_boundary_rectangle(1) ...
18  & global_coordinates(:, 1) < model.inner_boundary_rectangle(2) ...
19  & global_coordinates(:, 2) > model.inner_boundary_rectangle(3) ...
20  & global_coordinates(:, 2) < model.inner_boundary_rectangle(4);
21 
22 dirichlet_dofs = dirichlet_dofs(obstacle_boundary);
23 
24 % delete dofs for operator computation
25 old_dirichlet_gids = model_data.bc_info.dirichlet_gids;
26 model_data.bc_info.dirichlet_gids = setdiff(model_data.bc_info.dirichlet_gids, ...
27  dirichlet_dofs);
28 model.has_dirichlet_values = ~isempty(model_data.bc_info.dirichlet_gids);
29 if model.has_dirichlet_values
30  model.decomp_mode = 1;
31  model_data.bc_info.dirichlet_dof_vector_components = ...
32  Fem.Assembly.dirichlet_dof_vector(model, model_data.df_info, model_data.bc_info);
33  model.decomp_mode = 0;
34 end
35 
36 [A, f] = model.operators(model, model_data);
37 if model.has_nonlinearity
38  model.uh = sim_data.uh;
39  A = A + model.operators(model, model_data);
40 end
41 % undo changes
42 model_data.bc_info.dirichlet_gids = old_dirichlet_gids;
43 if model.has_dirichlet_values
44  model.decomp_mode = 1;
45  model_data.bc_info.dirichlet_dof_vector_components = ...
46  Fem.Assembly.dirichlet_dof_vector(model, model_data.df_info, model_data.bc_info);
47  model.decomp_mode = 0;
48 end
49 
50 % drag
51 drag_dofs = intersect(dirichlet_dofs, get_dof_ids_global(model_data.df_info, [1 1]));
52 v.dofs(drag_dofs) = 1;
53 
54 Cd = -2/model.U_mean(model)/model.U_mean(model)/model.L(model) * v.dofs'*(A*sim_data.uh.dofs - f);
55 
56 % lift
57 lift_dofs = intersect(dirichlet_dofs, get_dof_ids_global(model_data.df_info, [1 2]));
58 v.dofs = zeros(v.ndofs, 1);
59 v.dofs(lift_dofs) = 1;
60 
61 Cl = -2/model.U_mean(model)/model.U_mean(model)/model.L(model) * v.dofs'*(A*sim_data.uh.dofs - f);
62 
63 end
dofs_global_coordinate
global coordinate of DOFs
Definition: DiscFunc.m:102
represents a continous piecewise polynomial function of arbitrary dimension. Can be used for all fini...
Definition: DiscFunc.m:18
function [ Cd , Cl ] = stokes_compute_drag_and_lift(model, model_data, sim_data)
Drag and lift coefficients are computed via volume integrals.