#include "forcevisc.h"

SparseVecd ForceVisc::eval(const Vecd &x, const Vecd &v, const Vecd &m) const
{
    int n = m.Elts();
    Vecd ret(3*n);

    for (int i=0; i<n; i++)
    {
		ret[O(i,0)] = -_k*v[O(i,0)];
		ret[O(i,1)] = -_k*v[O(i,1)];
		ret[O(i,2)] = -_k*v[O(i,2)];
    }

    return ret;
}

Force::DblSparse_t ForceVisc::evalDx(const Vecd &x, const Vecd &v, const Vecd &m) const
{
	return DblSparse_t();
}

Force::DblSparse_t ForceVisc::evalDv(const Vecd &x, const Vecd &v, const Vecd &m) const
{
	// note that n is *not* number of particles!
	int n = x.Elts();
	DblSparse_t ret(n, std::pair<int,SparseVecd>(-1,SparseVecd(n)));

	for (int i=0; i<n; i++)
	{
		ret[i].first = i;
		ret[i].second.SetElts(i,-_k,VL_SV_END);
	}

	return ret;



}

double ForceVisc::Displacement(const Vecd &x) const {
  return 0;
}
