3 % Drag and lift coefficients are computed via volume integrals.
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
11 %
get dofs at inner boundary
12 dirichlet_dofs = model_data.bc_info.dirichlet_gids;
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);
22 dirichlet_dofs = dirichlet_dofs(obstacle_boundary);
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, ...
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;
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);
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;
51 drag_dofs = intersect(dirichlet_dofs, get_dof_ids_global(model_data.df_info, [1 1]));
52 v.dofs(drag_dofs) = 1;
54 Cd = -2/model.U_mean(model)/model.U_mean(model)/model.L(model) * v.dofs
'*(A*sim_data.uh.dofs - f);
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;
61 Cl = -2/model.U_mean(model)/model.U_mean(model)/model.L(model) * v.dofs'*(A*sim_data.uh.dofs - f);
dofs_global_coordinate
global coordinate of DOFs
represents a continous piecewise polynomial function of arbitrary dimension. Can be used for all fini...
function [ Cd , Cl ] = stokes_compute_drag_and_lift(model, model_data, sim_data)
Drag and lift coefficients are computed via volume integrals.