//#####################################################################
// Copyright 2012.
// This file is part of PhysBAM whose distribution is governed by the license contained in the accompanying file PHYSBAM_COPYRIGHT.txt.
//#####################################################################
#include <Core/Analytic_Tests/ANALYTIC_LEVELSET.h>
#include <Core/Diff_Tools/Diff_Test.h>
#include <Core/Math_Tools/RANGE.h>
#include <Core/Random_Numbers/RANDOM_NUMBERS.h>
namespace PhysBAM{
//#####################################################################
// Destructor
//#####################################################################
template<class TV> ANALYTIC_LEVELSET<TV>::
~ANALYTIC_LEVELSET()
{
}
//#####################################################################
// Function Test
//#####################################################################
template<class TV> void ANALYTIC_LEVELSET<TV>::
Test(const RANGE<TV>& domain) const
{
    RANDOM_NUMBERS<T> rand;
    TV X,dX;
    rand.Fill_Uniform(X,domain);
    T eps=1e-6,t=rand.Get_Uniform_Number(0,1);
    rand.Fill_Uniform(dX,-eps,eps);
    int c0,c1;
    T l0=-phi(X,t,c0),l1=-phi(X+dX,t,c1);
    if(c1!=c0) l1=-l1;
    TV dl0=N(X,t,c0),dl1=N(X+dX,t,c0);
    Diff_Test("analytic level",l0,X,dl0,l1,X+dX,dl1);
}
template struct ANALYTIC_LEVELSET<VECTOR<float,1> >;
template struct ANALYTIC_LEVELSET<VECTOR<float,2> >;
template struct ANALYTIC_LEVELSET<VECTOR<float,3> >;
template struct ANALYTIC_LEVELSET<VECTOR<double,1> >;
template struct ANALYTIC_LEVELSET<VECTOR<double,2> >;
template struct ANALYTIC_LEVELSET<VECTOR<double,3> >;
}
