GRINS-0.6.0
pressure_pinning.C
Go to the documentation of this file.
1 //-----------------------------------------------------------------------bl-
2 //--------------------------------------------------------------------------
3 //
4 // GRINS - General Reacting Incompressible Navier-Stokes
5 //
6 // Copyright (C) 2014-2015 Paul T. Bauman, Roy H. Stogner
7 // Copyright (C) 2010-2013 The PECOS Development Team
8 //
9 // This library is free software; you can redistribute it and/or
10 // modify it under the terms of the Version 2.1 GNU Lesser General
11 // Public License as published by the Free Software Foundation.
12 //
13 // This library is distributed in the hope that it will be useful,
14 // but WITHOUT ANY WARRANTY; without even the implied warranty of
15 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 // Lesser General Public License for more details.
17 //
18 // You should have received a copy of the GNU Lesser General Public
19 // License along with this library; if not, write to the Free Software
20 // Foundation, Inc. 51 Franklin Street, Fifth Floor,
21 // Boston, MA 02110-1301 USA
22 //
23 //-----------------------------------------------------------------------el-
24 
25 
26 // This class
27 #include "grins/pressure_pinning.h"
28 
29 // GRINS
30 #include "grins/assembly_context.h"
31 
32 // libMesh
33 #include "libmesh/getpot.h"
34 #include "libmesh/elem.h"
35 #include "libmesh/fe_interface.h"
36 
37 namespace GRINS
38 {
39 
40  PressurePinning::PressurePinning( const GetPot& input,
41  const std::string& physics_name )
42  {
43  _pin_value = input("Physics/"+physics_name+"/pin_value", 0.0 );
44 
45  unsigned int pin_loc_dim = input.vector_variable_size("Physics/"+physics_name+"/pin_location");
46 
47  // If the user is specifying a pin_location, it had better be at least 2-dimensional
48  if( pin_loc_dim > 0 && pin_loc_dim < 2 )
49  {
50  std::cerr << "Error: pressure pin location must be at least 2 dimensional"
51  << std::endl;
52  libmesh_error();
53  }
54 
55  _pin_location(0) = input("Physics/"+physics_name+"/pin_location", 0.0, 0 );
56  _pin_location(1) = input("Physics/"+physics_name+"/pin_location", 0.0, 1 );
57 
58  if( pin_loc_dim == 3 )
59  _pin_location(2) = input("Physics/"+physics_name+"/pin_location", 0.0, 2 );
60 
61  return;
62  }
63 
65  {
66  return;
67  }
68 
69  void PressurePinning::pin_value( libMesh::DiffContext &context,
70  const bool request_jacobian,
71  const VariableIndex var,
72  const double penalty )
73  {
75  AssemblyContext &c = libMesh::libmesh_cast_ref<AssemblyContext&>(context);
76 
77  if (c.get_elem().contains_point(_pin_location))
78  {
79  libMesh::DenseSubVector<libMesh::Number> &F_var = c.get_elem_residual(var); // residual
80  libMesh::DenseSubMatrix<libMesh::Number> &K_var = c.get_elem_jacobian(var, var); // jacobian
81 
82  // The number of local degrees of freedom in p variable.
83  const unsigned int n_var_dofs = c.get_dof_indices(var).size();
84 
85  libMesh::Number var_value = c.point_value(var, _pin_location);
86 
87  libMesh::FEType fe_type = c.get_element_fe(var)->get_fe_type();
88 
89  libMesh::Point point_loc_in_masterelem =
90  libMesh::FEInterface::inverse_map(c.get_dim(), fe_type, &c.get_elem(), _pin_location);
91 
92  std::vector<libMesh::Real> phi(n_var_dofs);
93 
94  for (unsigned int i=0; i != n_var_dofs; i++)
95  phi[i] = libMesh::FEInterface::shape( c.get_dim(), fe_type, &c.get_elem(), i,
96  point_loc_in_masterelem );
97 
98  for (unsigned int i=0; i != n_var_dofs; i++)
99  {
100  F_var(i) += penalty*(var_value - _pin_value)*phi[i];
101 
103  if (request_jacobian && c.get_elem_solution_derivative())
104  {
105  libmesh_assert (c.get_elem_solution_derivative() == 1.0);
106 
107  for (unsigned int j=0; j != n_var_dofs; j++)
108  K_var(i,j) += penalty*phi[i]*phi[j];
109 
110  } // End if request_jacobian
111  } // End i loop
112  } // End if pin_location
113 
114  return;
115  }
116 
117 } // namespace GRINS
unsigned int VariableIndex
More descriptive name of the type used for variable indices.
Definition: var_typedefs.h:40
libMesh::Point _pin_location
Location we want to pin the pressure.
GRINS namespace.
void pin_value(libMesh::DiffContext &context, const bool request_jacobian, const GRINS::VariableIndex var, const double penalty=1.0)
The idea here is to pin a variable to a particular value if there is a null space - e...
libMesh::Number _pin_value
Value of pressure we wish to pin.
PressurePinning(const GetPot &input, const std::string &physics_name)

Generated on Mon Jun 22 2015 21:32:20 for GRINS-0.6.0 by  doxygen 1.8.9.1