blob: 111f1f7eea9fc7672efcaa72db6d8a72ccb2e6d9 [file] [log] [blame]
//#####################################################################
// Copyright 2004-2005, Eftychios Sifakis.
// This file is part of PhysBAM whose distribution is governed by the license contained in the accompanying file PHYSBAM_COPYRIGHT.txt.
//#####################################################################
// Class FACE_OPTIMIZATION
//#####################################################################
#include "FACE_OPTIMIZATION.h"
using namespace PhysBAM;
//#####################################################################
// Function Advance_To_Target_Time
//#####################################################################
template<class T> void FACE_OPTIMIZATION<T>::
Update_Jacobian (bool resize_jacobians_of_inactive_controls_to_zero, bool verbose)
{
deformable_object.Set_External_Forces_And_Velocities (*this);
jacobian.Resize_Array (control_parameters.Size());
if (control_parameters.Active_Nonkinematic_Size())
{
deformable_object.Enforce_Definiteness (false);
deformable_object.Update_Position_Based_State();
deformable_object.Update_Collision_Penalty_Forces_And_Derivatives();
}
for (int i = 1; i <= control_parameters.Size(); i++)
{
if (verbose) std::cout << "Updating jacobian for control parameter " << i << std::endl;
if (!control_parameters.Active (i))
{
if (resize_jacobians_of_inactive_controls_to_zero) jacobian (i).Resize_Array (0);
}
else if (control_parameters.Active_Kinematic (i))
{
jacobian (i).Resize_Array (deformable_object.particles.number);
control_parameters.Position_Derivative (jacobian (i), i);
}
else
{
control_force_jacobian.Resize_Array (deformable_object.particles.number);
control_parameters.Force_Derivative (control_force_jacobian, i);
jacobian (i).Resize_Array (deformable_object.particles.number);
control_parameters.Kinematically_Update_Jacobian (jacobian (i));
deformable_object.One_Newton_Step_Toward_Steady_State (jacobian_cg_tolerance, jacobian_cg_iterations, 0, jacobian (i), true, 0, false);
}
}
deformable_object.Set_External_Forces_And_Velocities (default_external_forces_and_velocities);
}
//#####################################################################
// Funciton Add_External_Forces
//#####################################################################
template<class T> void FACE_OPTIMIZATION<T>::
Add_External_Forces (ARRAY<VECTOR_3D<T> >& F, const T time, const int id_number)
{
F += control_force_jacobian;
}
//#####################################################################
// Set_External_Positions
//#####################################################################
template<class T> void FACE_OPTIMIZATION<T>::
Set_External_Positions (ARRAY<VECTOR_3D<T> >& X, const T time, const int id_number)
{
default_external_forces_and_velocities.Set_External_Positions (X, time, id_number);
}
//#####################################################################
// Zero_Out_Enslaved_Position_Nodes
//#####################################################################
template<class T> void FACE_OPTIMIZATION<T>::
Zero_Out_Enslaved_Position_Nodes (ARRAY<VECTOR_3D<T> >& X, const T time, const int id_number)
{
default_external_forces_and_velocities.Zero_Out_Enslaved_Position_Nodes (X, time, id_number);
}
//#####################################################################
// Function Update_Collision_Body_Positions_And_Velocities
//#####################################################################
template<class T> void FACE_OPTIMIZATION<T>::
Update_Collision_Body_Positions_And_Velocities (const T time)
{
if (solids_evolution_callbacks) solids_evolution_callbacks->Update_Collision_Body_Positions_And_Velocities (time);
}
//#####################################################################
template class FACE_OPTIMIZATION<float>;
template class FACE_OPTIMIZATION<double>;