void set_lid_driven_bcs(TransientLinearImplicitSystem & system) { unsigned short int u_var = system.variable_number("vel_x"), v_var = system.variable_number("vel_y"); // This problem *does* require a pressure pin, there are Dirichlet // boundary conditions for u and v on the entire boundary. system.get_equation_systems().parameters.set<bool>("pin_pressure") = true; // Get a convenient reference to the System's DofMap DofMap & dof_map = system.get_dof_map(); { // u=v=0 on bottom, left, right std::set<boundary_id_type> boundary_ids; boundary_ids.insert(0); boundary_ids.insert(1); boundary_ids.insert(3); std::vector<unsigned int> variables; variables.push_back(u_var); variables.push_back(v_var); dof_map.add_dirichlet_boundary(DirichletBoundary(boundary_ids, variables, ZeroFunction<Number>())); } { // u=1 on top std::set<boundary_id_type> boundary_ids; boundary_ids.insert(2); std::vector<unsigned int> variables; variables.push_back(u_var); dof_map.add_dirichlet_boundary(DirichletBoundary(boundary_ids, variables, ConstFunction<Number>(1.))); } { // v=0 on top std::set<boundary_id_type> boundary_ids; boundary_ids.insert(2); std::vector<unsigned int> variables; variables.push_back(v_var); dof_map.add_dirichlet_boundary(DirichletBoundary(boundary_ids, variables, ZeroFunction<Number>())); } }
void set_poiseuille_bcs(TransientLinearImplicitSystem & system) { unsigned short int u_var = system.variable_number("vel_x"), v_var = system.variable_number("vel_y"); // This problem does not require a pressure pin, the Neumann outlet // BCs are sufficient to set the value of the pressure. system.get_equation_systems().parameters.set<bool>("pin_pressure") = false; // Get a convenient reference to the System's DofMap DofMap & dof_map = system.get_dof_map(); { // u=v=0 on top, bottom std::set<boundary_id_type> boundary_ids; boundary_ids.insert(0); boundary_ids.insert(2); std::vector<unsigned int> variables; variables.push_back(u_var); variables.push_back(v_var); dof_map.add_dirichlet_boundary(DirichletBoundary(boundary_ids, variables, ZeroFunction<Number>())); } { // u=quadratic on left std::set<boundary_id_type> boundary_ids; boundary_ids.insert(3); std::vector<unsigned int> variables; variables.push_back(u_var); dof_map.add_dirichlet_boundary(DirichletBoundary(boundary_ids, variables, ParsedFunction<Number>("4*y*(1-y)"))); } { // v=0 on left std::set<boundary_id_type> boundary_ids; boundary_ids.insert(3); std::vector<unsigned int> variables; variables.push_back(v_var); dof_map.add_dirichlet_boundary(DirichletBoundary(boundary_ids, variables, ZeroFunction<Number>())); } }
void set_lid_driven_bcs(TransientLinearImplicitSystem & system) { unsigned short int u_var = system.variable_number("vel_x"), v_var = system.variable_number("vel_y"); // Get a convenient reference to the System's DofMap DofMap & dof_map = system.get_dof_map(); { // u=v=0 on bottom, left, right std::set<boundary_id_type> boundary_ids; boundary_ids.insert(0); boundary_ids.insert(1); boundary_ids.insert(3); std::vector<unsigned int> variables; variables.push_back(u_var); variables.push_back(v_var); dof_map.add_dirichlet_boundary(DirichletBoundary(boundary_ids, variables, ZeroFunction<Number>())); } { // u=1 on top std::set<boundary_id_type> boundary_ids; boundary_ids.insert(2); std::vector<unsigned int> variables; variables.push_back(u_var); dof_map.add_dirichlet_boundary(DirichletBoundary(boundary_ids, variables, ConstFunction<Number>(1.))); } { // v=0 on top std::set<boundary_id_type> boundary_ids; boundary_ids.insert(2); std::vector<unsigned int> variables; variables.push_back(v_var); dof_map.add_dirichlet_boundary(DirichletBoundary(boundary_ids, variables, ZeroFunction<Number>())); } }
void set_stagnation_bcs(TransientLinearImplicitSystem & system) { unsigned short int u_var = system.variable_number("vel_x"), v_var = system.variable_number("vel_y"); // This problem does not require a pressure pin, the Neumann outlet // BCs are sufficient to set the value of the pressure. system.get_equation_systems().parameters.set<bool>("pin_pressure") = false; // Get a convenient reference to the System's DofMap DofMap & dof_map = system.get_dof_map(); { // u=v=0 on bottom std::set<boundary_id_type> boundary_ids; boundary_ids.insert(0); std::vector<unsigned int> variables; variables.push_back(u_var); variables.push_back(v_var); dof_map.add_dirichlet_boundary(DirichletBoundary(boundary_ids, variables, ZeroFunction<Number>())); } { // u=0 on left (symmetry) std::set<boundary_id_type> boundary_ids; boundary_ids.insert(3); std::vector<unsigned int> variables; variables.push_back(u_var); dof_map.add_dirichlet_boundary(DirichletBoundary(boundary_ids, variables, ZeroFunction<Number>())); } { // u = k*x on top std::set<boundary_id_type> boundary_ids; boundary_ids.insert(2); std::vector<unsigned int> variables; variables.push_back(u_var); // Set up ParsedFunction parameters std::vector<std::string> additional_vars; additional_vars.push_back("k"); std::vector<Number> initial_vals; initial_vals.push_back(1.); dof_map.add_dirichlet_boundary(DirichletBoundary(boundary_ids, variables, ParsedFunction<Number>("k*x", &additional_vars, &initial_vals))); } { // v = -k*y on top std::set<boundary_id_type> boundary_ids; boundary_ids.insert(2); std::vector<unsigned int> variables; variables.push_back(v_var); // Set up ParsedFunction parameters std::vector<std::string> additional_vars; additional_vars.push_back("k"); std::vector<Number> initial_vals; initial_vals.push_back(1.); // Note: we have to specify LOCAL_VARIABLE_ORDER here, since we're // using a ParsedFunction to set the value of v_var, which is // actually the second variable in the system. dof_map.add_dirichlet_boundary(DirichletBoundary(boundary_ids, variables, ParsedFunction<Number>("-k*y", &additional_vars, &initial_vals), LOCAL_VARIABLE_ORDER)); } }