예제 #1
0
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>()));
  }
}
예제 #2
0
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>()));
  }
}
예제 #4
0
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));
  }
}