Hi,
I'm attempting to apply a displacement boundary condition on a surface in my problem. However, I would like the direction of the displacement of each point on the surface to depend on its direction from some point (for example the origin). Imagine a balloon inflating where the displacement direction is from the center of the balloon. My thought was to use a function similar to the example boundary conditions in step 23 but extended for 3 dimensions. I defined the following class in my code:
class BoundaryValuesU : public Function<dim>{
public:
virtual void vector_value(const Point<dim> & p, Vector<double> &values) const override
{
double xpos, ypos, zpos;
xpos = p[0];
ypos = p[1];
if (dim==3){zpos=p[2];}
else {zpos=0.0;}
values[0] = xpos/std::pow(std::pow(xpos,2.0)+std::pow(ypos,2.0)+std::pow(zpos,2.0),0.5)*0.1;
values[1] = ypos/std::pow(std::pow(xpos,2.0)+std::pow(ypos,2.0)+std::pow(zpos,2.0),0.5)*0.1;
values[2] = zpos/std::pow(std::pow(xpos,2.0)+std::pow(ypos,2.0)+std::pow(zpos,2.0),0.5)*0.1;
return;
}
};
Then I apply the boundary conditions in the following way to the surface with boundary id 2:
std::vector<bool> uBC (3, true);
BoundaryValuesU<dim> boundary_values_u_function;
VectorTools::interpolate_boundary_values (dof_handler, 2, boundary_values_u_function, constraints, uBC);
However, when I attempt to run with this case I get the following error:
An error occurred in line <2263> of file <src/deal.ii-candi/tmp/unpack/deal.II/include/deal.II/numerics/vector_tools.templates.h> in function
void dealii::VectorTools::<unnamed>::do_interpolate_boundary_values(const M_or_MC<dim, spacedim> &, const DoFHandlerType<dim, spacedim> &, const std::map<unsigned char, const dealii::Function<spacedim, number> *, std::less<unsigned char>, std::allocator<std::pair<const unsigned char, const dealii::Function<spacedim, number> *>>> &, std::map<unsigned int, number, std::less<unsigned int>, std::allocator<std::pair<const unsigned int, number>>> &, const dealii::ComponentMask &) [with dim = 3, spacedim = 3, number = double, DoFHandlerType = dealii::DoFHandler, M_or_MC = dealii::Mapping]
The violated condition was:
n_components == i->second->n_components
Additional information:
Dimension 3 not equal to 1.
Is there a way I am supposed to be initializing n_components in the class to make this work? Or is this just the wrong way to be doing this?
Thank you.