template<int dim>
class PropellerTorque : public Function<dim>
{
public:
PropellerTorque(const double torque, const double polar_moment, const double radius);
virtual void vector_value(const Point<dim> &p,
Vector<double> &values) const override;
virtual void
vector_value_list(const std::vector<Point<dim>> &points,
std::vector<Vector<double>> & value_list) const override;
private:
const double torque;
const double polar_moment;
const double radius;
};
template <int dim>
PropellerTorque<dim>::PropellerTorque(const double torque, const double polar_moment, const double radius)
: Function<dim>(dim), torque(torque), polar_moment(polar_moment), radius(radius)
{}
template <int dim>
inline void PropellerTorque<dim>::vector_value(const Point<dim> &p,
Vector<double> &values) const
{
AssertDimension(values.size(), dim);
double y = p(1);
double z = p(2);
double distance = sqrt(y*y+z*z);
if (distance<=0)
distance=0;
double angle = atan2(z,y);
//if (angle
double tau = -torque*radius/(polar_moment);
if (isnan(tau))
tau=0;
if (isnan(angle))
{
angle=0;
tau=0;
}
values = 0;
values(1) = tau* sin(angle);
values(2) = -tau* cos(angle);
}
template <int dim>
inline void PropellerTorque<dim>::vector_value_list(
const std::vector<Point<dim>> &points,
std::vector<Vector<double>> & value_list) const
{
const unsigned int n_points = points.size();
AssertDimension(value_list.size(), n_points);
for (unsigned int p = 0; p < n_points; ++p)
PropellerTorque<dim>::vector_value(points[p], value_list[p]);
}