<commit_before>//===========================================================================
//                                                                           
// File: EvalFunctorSurface.C                                                
//                                                                           
// Created: Wed Sep 19 15:45:14 2012                                         
//                                                                           
// Author: <NAME> <<EMAIL>>
//                                                                           
// Revision: $Id$
//                                                                           
// Description:
//                                                                           
//===========================================================================



#include "GoTools/isogeometric_model/EvalFunctorSurface.h"

namespace Go
{

  //===========================================================================
  EvalFunctorSurface::EvalFunctorSurface(BdCondFunctor* fbd, shared_ptr<SplineSurface> geo_surface, int dimension):
    functor_(fbd),
    geo_surface_(geo_surface),
    dim_(dimension)
  //===========================================================================
  {
  }


  //===========================================================================
  EvalFunctorSurface::~EvalFunctorSurface()
  //===========================================================================
  {
  }


  //===========================================================================
    Point EvalFunctorSurface::eval( double u, double v) const
  //===========================================================================
  {
    Point geo_pt;
    geo_surface_->point(geo_pt, u, v);
    return functor_->evaluate(geo_pt);
  }


  //===========================================================================
    void EvalFunctorSurface::eval( double u, double v, int n, Point der[]) const
  //===========================================================================
  {
      MESSAGE("eval(): Not implemented yet.");

#if 0
    if (n >= 0)
      der[0] = eval(t);
    if (n >= 1)
      {
	double delta_default = 0.01;
	double delta;
	double start_par = start();
	double end_par = end();
	if (t + delta_default <= end_par)
	  delta = delta_default;
	else if (t - delta_default >= start_par)
	  delta = -delta_default;
	else if (end_par - t >= t - start_par)
	  delta = end_par - t;
	else
	  delta = start_par - t;
	der[1] = (1.0 / delta) * (eval(t + delta) - der[0]);
      }
    if (n >= 2)
      {
	Point zero(dim());
	for (int i = 0; i < dim(); ++i)
	  zero[i] = 0.0;
	for (int i = 2; i <= n; ++i)
	  der[i] = zero;
      }
#endif
  }


  //===========================================================================
  double EvalFunctorSurface::start_u() const
  //===========================================================================
  {
      return geo_surface_->basis_u().startparam();
  }



  //===========================================================================
  double EvalFunctorSurface::start_v() const
  //===========================================================================
  {
      return geo_surface_->basis_v().startparam();
  }


  //===========================================================================
  double EvalFunctorSurface::end_u() const
  //===========================================================================
  {<commit_msg>Volume code.<commit_after>//===========================================================================
//                                                                           
// File: EvalFunctorSurface.C                                                
//                                                                           
// Created: Wed Sep 19 15:45:14 2012                                         
//                                                                           
// Author: <NAME> <<EMAIL>>
//                                                                           
// Revision: $Id$
//                                                                           
// Description:
//                                                                           
//===========================================================================



#include "GoTools/isogeometric_model/EvalFunctorSurface.h"

namespace Go
{

  //===========================================================================
  EvalFunctorSurface::EvalFunctorSurface(BdCondFunctor* fbd, shared_ptr<SplineSurface> geo_surface, int dimension):
    functor_(fbd),
    geo_surface_(geo_surface),
    dim_(dimension)
  //===========================================================================
  {
  }


  //===========================================================================
  EvalFunctorSurface::~EvalFunctorSurface()
  //===========================================================================
  {
  }


  //===========================================================================
    Point EvalFunctorSurface::eval( double u, double v) const
  //===========================================================================
  {
    Point geo_pt;
    geo_surface_->point(geo_pt, u, v);
    return functor_->evaluate(geo_pt);
  }


  //===========================================================================
    void EvalFunctorSurface::eval( double u, double v, int n, Point der[]) const
  //===========================================================================
  {
    if (n >= 0)
	der[0] = eval(u, v);

    if (n >= 2)
	MESSAGE("eval(): Higher than first order derivs not supported yet.");

    if (n >= 1)
      {
	double delta_default = 0.01;
	double delta_u, delta_v;
	double start_par_u = start_u();
	double end_par_u = end_u();
	if (u + delta_default <= end_par_u)
	  delta_u = delta_default;
	else if (u - delta_default >= start_par_u)
	  delta_u = -delta_default;
	else if (end_par_u - u >= u - start_par_u)
	  delta_u = end_par_u - u;
	else
	  delta_u = start_par_u - u;
	der[1] = (1.0 / delta_u) * (eval(u + delta_u, v) - der[0]);

	double start_par_v = start_v();
	double end_par_v = end_v();
	if (v + delta_default <= end_par_v)
	  delta_v = delta_default;
	else if (v - delta_default >= start_par_v)
	  delta_v = -delta_default;
	else if (end_par_v - v >= v - start_par_v)
	  delta_v = end_par_v - v;
	else
	  delta_v = start_par_v - v;
	der[2] = (1.0 / delta_v) * (eval(u, v + delta_v) - der[0]);
      }
    if (n >= 2)
      {
	Point zero(dim());
	int num_pts = (n+1)*(n+2)/2;
	for (int i = 0; i < dim(); ++i)
	  zero[i] = 0.0;
	for (int i = 3; i < num_pts; ++i)
	  der[i] = zero;
      }
  }


  //===========================================================================
  double EvalFunctorSurface::start_u() const
  //===========================================================================
  {
      return geo_surface_->basis_u().startparam();
  }



  //===========================================================================
  double EvalFunctorSurface::start_v() const
  //===========================================================================
  {
      return geo_surface_->basis_v().startparam();
  }


  //===========================================================================
  double EvalFunctorSurface::end_u() const
  //===========================================================================
  {
{'fraction_non_alphanumeric': 0.4086165373294086, 'fraction_numerical': 0.00842922130050843, 'mean_word_length': 2.4210526315789473, 'pattern_counts': {'":': 0, '<': 18, '<?xml version=': 0, '>': 32, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 44, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '4881639', 'n_tokens_mistral': 1882, 'n_tokens_neox': 1638, 'n_words': 347}