/*
    C++ Mesh Generation Library
    Copyright (c) 2000echet <eric at bechet dot ca>

    This file is part of the C++ Mesh Generation Library.

    See the NOTICE & LICENSE files for conditions.
*/
//---------------------------------------------------------------------------
#ifndef METRIC_FIELD_H
#define METRIC_FIELD_H
//---------------------------------------------------------------------------



#include "mesh_const.h"


/// metric base class
template <class V> class Metric_Field
{

protected:

///
  int prec;


public :

///
  struct field_type
  {
    /// remplissage en ce point
    double filling;
    /// distance au front
    double distance;
    /// temps
    double time;
    /// vitesse (du fluide)
    double velocity[3];
    /// gradient de la distance
    double gradient_distance[3];
    /// norme de la matrice hessienne
    double norm_hessian_pressure;
    /// norme de la matrice hessienne
    double norm_hessian_temperature;
    /// temperature courante
    double temperature0;
    /// temperature 1x avant
    double temperature1;

    /// cuisson courante
    double alpha0;
    /// cuisson 1 fois avant
    double alpha1;
    /// exothermie courante
    double exothermy;
  };



///
  Metric_Field ( int i=5 )
  {
    prec=i;
  }

///
  virtual void Set_Precision ( int i )
  {
    prec=i;
  }

///
  int Get_Precision ( void ) const
  {
    return prec;
  }

///
  virtual bool Get_Fields ( V& Ver,field_type &fields )
  {
    fields.filling=0;
    fields.distance=0;
    fields.time=0;

    for ( int i=0; i<3; ++i )
    {
      fields.velocity[i]=0;
      fields.gradient_distance[i]=0;
    }

    fields.norm_hessian_pressure=0; // norme de la matrice hessienne
    fields.norm_hessian_temperature=0; // norme de la matrice hessienne
    fields.temperature0=0; // temperature courante
    fields.temperature1=0; // temperature 1x avant

    fields.alpha0=0; // cuisson courante
    fields.alpha1=0; // cuisson 1 fois avant

    fields.exothermy=0; // exothermie courante

    return false;
  }
///
  virtual void Save_Debug_Info ( void )
  {
  }
///
  virtual void operator () ( V& Ver,Metric_Tensor& MM ) =0;
///
  virtual double Metric_Distance ( V& V1,V& V2 ) =0;

  virtual ~Metric_Field()
  {
  }

};

#endif // METRIC_FIELD_H


 
