//#####################################################################
// Copyright 2002-2008, Robert Bridson, Ronald Fedkiw, Geoffrey Irving, Sergey Koltakov, Michael Lentine, Craig Schroeder, Andrew Selle, Tamar Shinar, Eftychios Sifakis, Joseph Teran.
// This file is part of PhysBAM whose distribution is governed by the license contained in the accompanying file PHYSBAM_COPYRIGHT.txt.
//#####################################################################
#include <Solids/Forces_And_Torques/GRAVITY.h>
#include <Core/Log/DEBUG_UTILITIES.h>
#include <Core/Matrices/FRAME.h>
#include <Rigids/Particles/RIGID_BODY_PARTICLES.h>
#include <Rigids/Rigid_Bodies/RIGID_BODY_COLLECTION.h>
#include <Deformables/Particles/DEFORMABLE_PARTICLES.h>
#include <Solids/Solids_Evolution/GENERALIZED_VELOCITY.h>
using namespace PhysBAM;
//#####################################################################
// Destructor
//#####################################################################
template<class TV> GRAVITY<TV>::
~GRAVITY()
{
}
//#####################################################################
// Function Add_Forces
//#####################################################################
template<class TV> void GRAVITY<TV>::
Add_Forces(GENERALIZED_VELOCITY<TV>& F,const T time) const
{
    if(!gravity.Magnitude_Squared()) return;
    for(int p:force_particles) F.V.array(p)+=particles.mass(p)*gravity;
    auto& rm=rigid_body_collection.rigid_body_particles.mass;
    for(int p:force_rigid_body_particles)
        F.rigid_V.array(p).linear+=rm(p)*gravity;
}
//#####################################################################
// Function Potential_Energy
//#####################################################################
template<class TV> typename TV::SCALAR GRAVITY<TV>::
Potential_Energy(const T time) const
{
    T potential_energy=0;
    for(int p:force_particles)
        potential_energy-=particles.mass(p)*particles.X(p).Dot(gravity);
    auto& rbp=rigid_body_collection.rigid_body_particles;
    for(int p:force_rigid_body_particles)
        potential_energy-=rbp.mass(p)*rbp.frame(p).t.Dot(gravity);
    return potential_energy;
}
//#####################################################################
// Function Add_Velocity_Dependent_Forces
//#####################################################################
template<class TV> void GRAVITY<TV>::
Add_Velocity_Dependent_Forces(const GENERALIZED_VELOCITY<TV>& V,GENERALIZED_VELOCITY<TV>& F,const T time) const
{
}
//#####################################################################
// Function Enforce_Definiteness
//#####################################################################
template<class TV> void GRAVITY<TV>::
Enforce_Definiteness(const bool enforce_definiteness_input)
{
}
//#####################################################################
// Function Add_Force_Derivatives
//#####################################################################
template<class TV> void GRAVITY<TV>::
Add_Force_Derivatives(const GENERALIZED_VELOCITY<TV>& V,GENERALIZED_VELOCITY<TV>& F,const T time,bool transpose) const
{
}
//#####################################################################
namespace PhysBAM{
template class GRAVITY<VECTOR<float,1> >;
template class GRAVITY<VECTOR<float,2> >;
template class GRAVITY<VECTOR<float,3> >;
template class GRAVITY<VECTOR<double,1> >;
template class GRAVITY<VECTOR<double,2> >;
template class GRAVITY<VECTOR<double,3> >;
}
