 // ------ Tools.h ------
// S. CLAIN 2012/06

#ifndef _Tools 
#define _Tools
#include "FVLib_config.h" 
#include <cmath>
#include <cstring>
#include <iostream>
#include <cstdlib>
#include "FVDenseM.h"
#include "FVSparseM.h"


class A2B
{
public:
size_t labelA,codeA,layerA,typeA;
size_t typeB,labelB[NB_CELL_PER_VERTEX_3D];
size_t nb;

A2B(){labelA=0;codeA=0;layerA=0;typeA=NULL_ENTITY;typeB=NULL_ENTITY;nb=0;}
A2B(size_t label){labelA=label;}
A2B(size_t label, size_t type_a ){labelA=label;typeA=type_a;}
A2B(size_t label, size_t type_a , size_t type_b){labelA=label;typeA=type_a;typeB=type_b;}
~A2B();
A2B(const A2B &el); // copy constructor
A2B & operator =(const  A2B &el) // assigment operator
{
labelA=el.labelA;codeA=el.codeA;layerA=el.layerA;typeA=el.typeA;typeB=el.typeB;nb=el.nb;  
for(size_t i=0;i<nb;i++) labelB[i]=el.labelB[i];    
return(*this);
}
void setLabel(size_t label){labelA=label;}
size_t getLabel(){return labelA;}
void setCode(size_t code){codeA=code;}
size_t getCode(){return codeA;}
void setLayer(size_t layer){layerA=layer;}
size_t getLayer(){return layerA;}
void setTypeA(size_t type_a){typeA=type_a;}
size_t getTypeA(){return typeA;}
void setTypeB(size_t type_b){typeB=type_b;}
size_t getTypeB(){return typeB;}
void clean(){labelA=0;codeA=0;layerA=0;typeA=NULL_ENTITY;typeB=NULL_ENTITY;nb=0;}
void addLabel(size_t i);
void delLabel(size_t i);
void changeLabel(size_t i, size_t j);
bool isEqual(A2B target);
size_t getSum()
{
size_t sum=0;
for(size_t k=0;k<nb;k++) sum+=labelB[k];
return(sum);    
}
size_t getProd()
{
size_t prod=1;
for(size_t k=0;k<nb;k++) prod*=labelB[k];
return(prod);    
}

};

inline double FVPow(double x, size_t p)
{
   register double val=1.;
   while(p) {val*=x;p--;}
   return(val);
} 

inline double FVSqrt3(double a)
{
  register double x=a,x1,x2,inva,f;
  if(a==0) return(a);
  if(std::abs(a)==1.) return(a);
  inva=1./a;
  while(std::abs(f)*inva>FVEPSI)
      {
      x1=x*x;f=(x1+x1+x1-a);x2=x1*x-a;f/=x2;x-=f;    
      }
  return(x);
}

void strtos(char *ptr, char **endptr,char *auxString);


void denseM2sparseM(FVDenseM<double> &DM,FVSparseM<double> &SM,double tol);
#endif // define _Tools
