12 #ifndef ECL_GEOMETRY_TENSION_FUNCTION_HPP_ 
   13 #define ECL_GEOMETRY_TENSION_FUNCTION_HPP_ 
   38 class TensionFunction;
 
   40 namespace blueprints {
 
   42 class TensionSecondDerivativeInterpolation;
 
   58 class ECL_PUBLIC BluePrintFactory< TensionFunction > {
 
   77         static blueprints::TensionSecondDerivativeInterpolation Interpolation(
const double x_i, 
const double y_i, 
const double yddot_i,
 
   78                 const double x_f, 
const double y_f, 
const double yddot_f);
 
   80         virtual ~BluePrintFactory() {};
 
  110 class ECL_PUBLIC TensionFunction : 
public BluePrintFactory< TensionFunction > {
 
  122         virtual ~TensionFunction() {}
 
  145         template<
typename Derived>
 
  146         TensionFunction(
const BluePrint< Derived > &blueprint) {
 
  147             blueprint.implementApply(*
this);
 
  163         double derivative(
const double &tau, 
const double &x) 
const;
 
  175         double dderivative(
const double &tau, 
const double &x) 
const;
 
  190         double operator ()(
const double &tau, 
const double &x) 
const;
 
  195         friend class blueprints::TensionSecondDerivativeInterpolation;
 
  198         template <
typename OutputStream>
 
  199         friend OutputStream& 
operator << (OutputStream &ostream, 
const TensionFunction &
function);
 
  222 template <
typename OutputStream>
 
  229     double h = 
function.x_f - 
function.x_0;
 
  230     if ( ( 
function.z_0 == 0.0 ) && ( 
function.z_f == 0.0 ) ) {
 
  234         if ( 
function.z_0 != 0.0 ) {
 
  235             ostream << format(
function.z_0) << 
"*sinh[tau(";
 
  236             ostream << format(
function.x_f) << 
"-x)] + ";
 
  238         if ( 
function.z_f != 0.0 ) {
 
  239             ostream << format(
function.z_f) << 
"*sinh[tau(x-";
 
  240             ostream << format(
function.x_0) << 
")]}/[tau^2 sinh(";
 
  241             ostream << format(
function.x_f - 
function.x_0) << 
"*tau)]";
 
  246     ostream << format(
function.y_0/h) << 
"-";
 
  247     ostream << format(
function.z_0/h) << 
"/tau^2)(";
 
  248     ostream << format(
function.x_f) << 
"-x)\n";
 
  250     ostream << format(
function.y_f/h) << 
"-";
 
  251     ostream << format(
function.z_f/h) << 
"/tau^2)(x-";
 
  252     ostream << format(
function.x_0) << 
")\n";
 
  262 namespace blueprints {
 
  284 class ECL_PUBLIC TensionSecondDerivativeInterpolation : 
public ecl::BluePrint<TensionSecondDerivativeInterpolation> {
 
  302         TensionSecondDerivativeInterpolation(
const double x_i, 
const double y_i, 
const double yddot_i,
 
  303                 const double x_f, 
const double y_f, 
const double yddot_f) :
 
  306                     yddot_initial(yddot_i),
 
  311         virtual ~TensionSecondDerivativeInterpolation() {}
 
  329         void apply(base_type& 
function) 
const;
 
  332         double x_initial, y_initial, yddot_initial;
 
  333         double x_final, y_final, yddot_final;