void NavierStokesManual::on_initial_conditions_set(InitialConditions& initial_conditions)
{
  // Use proto to add an initial condition on the viscosity, setting it equal to the molecular viscosity
  FieldVariable<0, ScalarField> nu_eff("EffectiveViscosity", "navier_stokes_viscosity");
  PhysicsConstant nu("kinematic_viscosity");
  Handle<ProtoAction> visc_ic(initial_conditions.create_initial_condition("navier_stokes_viscosity", "cf3.solver.ProtoAction"));
  visc_ic->set_expression(nodes_expression(nu_eff = nu));
}
Handle< common::Action > BoundaryConditions::add_function_bc(const std::string& region_name, const std::string& variable_name)
{
  Handle<ParsedFunctionExpression> result = create_component<ParsedFunctionExpression>("BC"+region_name+variable_name);

  MeshTerm<0, VectorField> var(variable_name, m_implementation->m_solution_tag);
  result->set_expression( nodes_expression( m_implementation->dirichlet(var) = result->function() ) );

  m_implementation->configure_bc(*result, region_name);

  return result;
}
Handle< common::Action > BoundaryConditions::add_constant_component_bc(const std::string& region_name, const std::string& variable_name, const Uint component_idx, const Real default_value)
{
  MeshTerm<0, VectorField> var(variable_name, m_implementation->m_solution_tag);
  ConfigurableConstant<Real> value("value", "Value for constant boundary condition", default_value);
  
  boost::shared_ptr< common::Action > result = create_proto_action("BC"+region_name+variable_name,
                                                nodes_expression(m_implementation->dirichlet(var[component_idx]) = value));
  
  add_component(result);
  m_implementation->configure_bc(*result, region_name);

  return Handle<common::Action>(result);
}
 void set_vector_function_expression(const std::string& variable_name, ParsedFunctionExpression& func)
 {
   FieldVariable<0, VectorField> var(variable_name, m_solution_tag);
   func.set_expression( nodes_expression( dirichlet(var) = func.vector_function() ) );
 }