blob: 0f2abc3f01282dbd9ec0dfbe766e37e6d119a1c5 [file] [log] [blame]
//#####################################################################
// Copyright 2004, 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.
//#####################################################################
// Class QUASISTATICS_EXAMPLE
//#####################################################################
#ifndef __QUASISTATICS_EXAMPLE__
#define __QUASISTATICS_EXAMPLE__
#include "../../Public_Library/Solids_And_Fluids/SOLIDS_FLUIDS_EXAMPLE_3D.h"
#include "../../Public_Library/Rigid_Bodies/RIGID_BODY_LIST_3D.h"
#include "../../Public_Library/Deformable_Objects/DEFORMABLE_OBJECT_LIST_3D.h"
#include "../../Public_Library/Read_Write/FILE_UTILITIES.h"
#include "../../Public_Library/Utilities/STRING_UTILITIES.h"
#include "../../Public_Library/Collisions_And_Interactions/COLLISION_BODY_LIST_3D.h"
#include "../../Public_Library/Forces_And_Torques/BODY_FORCES_3D.h"
namespace PhysBAM
{
template <class T, class RW>
class QUASISTATICS_EXAMPLE: public SOLIDS_FLUIDS_EXAMPLE_3D<T, RW>
{
public:
using SOLIDS_FLUIDS_EXAMPLE_3D<T, RW>::solids_parameters;
using SOLIDS_FLUIDS_EXAMPLE<T>::output_directory;
int newton_iterations;
T newton_tolerance;
bool use_partially_converged_result;
ARRAY<LIST_ARRAY<int> > colliding_nodes;
bool allow_tangential_slipping_for_rigid_collisions;
BODY_FORCES_3D<T>* body_forces;
VECTOR_3D<T> external_force_rate;
ARRAY<LIST_ARRAY<int> > inverted_tets;
bool print_mesh_information;
QUASISTATICS_EXAMPLE()
: SOLIDS_FLUIDS_EXAMPLE_3D<T, RW>(), newton_iterations (1), newton_tolerance ( (T) 1e-3), use_partially_converged_result (false),
allow_tangential_slipping_for_rigid_collisions (false), body_forces (0), print_mesh_information (false)
{}
virtual ~QUASISTATICS_EXAMPLE()
{}
void Default() const
{
std::cout << "THIS QUASISTATICS_EXAMPLE FUNCTION IS NOT DEFINED!" << std::endl;
}
//#####################################################################
virtual void Initialize_Bodies();
virtual void Add_External_Forces (ARRAY<VECTOR_3D<T> >& F, const T time, const int id_number) {}
virtual void Set_External_Positions (ARRAY<VECTOR_3D<T> >& X, const T time, const int id_number) {}
virtual void Zero_Out_Enslaved_Position_Nodes (ARRAY<VECTOR_3D<T> >& X, const T time, const int id_number) {}
virtual void Update_Time_Varying_Material_Properties (const T time, const int id_number);
virtual void Update_Collision_Body_Positions (const T time) {}
virtual void Print_Mesh_Information (const int frame) const;
virtual void Compute_Inverted_Tets();
virtual void Write_Output_Files (const int frame) const;
//#####################################################################
};
//#####################################################################
// Function Initialize_Deformable_Objects
//#####################################################################
template<class T, class RW> void QUASISTATICS_EXAMPLE<T, RW>::
Initialize_Bodies()
{
SOLIDS_FLUIDS_EXAMPLE_3D<T, RW>::Initialize_Bodies();
colliding_nodes.Resize_Array (solids_parameters.deformable_body_parameters.list.deformable_objects.m);
inverted_tets.Resize_Array (solids_parameters.deformable_body_parameters.list.deformable_objects.m);
for (int i = 1; i <= solids_parameters.deformable_body_parameters.list.deformable_objects.m; i++) solids_parameters.deformable_body_parameters.list.deformable_objects (i)->collisions.collision_tolerance = solids_parameters.collision_tolerance;
}
//#####################################################################
// Function Update_Time_Varying_Material_Properties
//#####################################################################
template<class T, class RW> void QUASISTATICS_EXAMPLE<T, RW>::
Update_Time_Varying_Material_Properties (const T time, const int id_number)
{
if (body_forces)
{
T magnitude = external_force_rate.Magnitude();
T incremented_gravity = max (- (T) 9.8, time * magnitude);
if (magnitude) body_forces->downward_direction = external_force_rate / magnitude;
body_forces->gravity = incremented_gravity;
}
}
//#####################################################################
// Function Print_Mesh_Information
//#####################################################################
template<class T, class RW> void QUASISTATICS_EXAMPLE<T, RW>::
Print_Mesh_Information (const int frame) const
{
std::ostream* output;
std::string prefix = output_directory + "/";
for (int d = 1; d <= solids_parameters.deformable_body_parameters.list.deformable_objects.m; d++)
{
output = FILE_UTILITIES::Safe_Open_Output (STRING_UTILITIES::string_sprintf ("%scolliding_nodes_%d.%d", prefix.c_str(), d, frame));
colliding_nodes (d).template Write<RW> (*output);
delete output;
output = FILE_UTILITIES::Safe_Open_Output (STRING_UTILITIES::string_sprintf ("%ssubset_%d.%d", prefix.c_str(), d, frame));
inverted_tets (d).template Write<RW> (*output);
delete output;
}
}
//#####################################################################
// Function Compute_Inverted_Tets
//#####################################################################
template<class T, class RW> void QUASISTATICS_EXAMPLE<T, RW>::
Compute_Inverted_Tets()
{
for (int d = 1; d <= solids_parameters.deformable_body_parameters.list.deformable_objects.m; d++)
{
TETRAHEDRALIZED_VOLUME<T>& tetrahedralized_volume = *solids_parameters.deformable_body_parameters.list.deformable_objects (d)->tetrahedralized_volume;
SOLIDS_PARTICLE<T, VECTOR_3D<T> > particles = solids_parameters.deformable_body_parameters.list.deformable_objects (d)->particles;
for (int t = 1; t <= tetrahedralized_volume.tetrahedron_mesh.tetrahedrons.m; t++)
{
int i, j, k, l;
tetrahedralized_volume.tetrahedron_mesh.tetrahedrons.Get (t, i, j, k, l);
T signed_volume = TETRAHEDRON<T>::Signed_Volume (particles.X.array (i), particles.X.array (j), particles.X.array (k), particles.X.array (l));
if (signed_volume < 0) inverted_tets (d).Append_Element (t);
}
}
}
//#####################################################################
// Function Compute_Inverted_Tets
//#####################################################################
template<class T, class RW> void QUASISTATICS_EXAMPLE<T, RW>::
Write_Output_Files (const int frame) const
{
SOLIDS_FLUIDS_EXAMPLE_3D<T, RW>::Write_Output_Files (frame);
if (print_mesh_information) Print_Mesh_Information (frame);
}
//#####################################################################
}
#endif