blob: 937ebf5acb52555f392bbd868016378b0423f640 [file] [log] [blame]
//#####################################################################
// Copyright 2004, Ron Fedkiw, Andrew Selle.
// This file is part of PhysBAM whose distribution is governed by the license contained in the accompanying file PHYSBAM_COPYRIGHT.txt.
//#####################################################################
// Class SOLIDS_FLUIDS_DRIVER
//#####################################################################
#ifndef __SOLIDS_FLUIDS_DRIVER__
#define __SOLIDS_FLUIDS_DRIVER__
#include "SOLIDS_FLUIDS_EXAMPLE.h"
#include "../Read_Write/FILE_UTILITIES.h"
namespace PhysBAM
{
template <class T>
class SOLIDS_FLUIDS_DRIVER
{
public:
SOLIDS_FLUIDS_EXAMPLE<T>& example;
int current_frame;
T time;
int output_number;
SOLIDS_FLUIDS_DRIVER (SOLIDS_FLUIDS_EXAMPLE<T>& example_input)
: example (example_input)
{}
virtual ~SOLIDS_FLUIDS_DRIVER()
{}
T Time_At_Frame (const int frame) const
{
return example.initial_time + (frame - example.first_frame) / example.frame_rate;
}
virtual void Preprocess_Frame (const int frame)
{
example.Preprocess_Frame (frame);
}
virtual void Postprocess_Frame (const int frame)
{
example.Postprocess_Frame (frame);
}
virtual void Write_Output_Files (const int frame)
{
FILE_UTILITIES::Create_Directory (example.output_directory);
example.Write_Output_Files (frame);
Write_Last_Frame (frame);
}
void Write_Last_Frame (const int frame) const
{
if (example.write_last_frame) FILE_UTILITIES::Write_To_Text_File (example.output_directory + "/last_frame", frame);
}
void Write_Time (const int frame) const
{
if (example.write_time)
{
FILE_UTILITIES::template Write_To_File<float> (
STRING_UTILITIES::string_sprintf ("%s/time.%d",
example.output_directory.c_str(), frame), time);
}
}
void Read_Time (const int frame)
{
std::string filename =
STRING_UTILITIES::string_sprintf ("%s/time.%d",
example.output_directory.c_str(), frame);
if (FILE_UTILITIES::File_Exists (filename))
{
FILE_UTILITIES::template Read_From_File<float> (filename, time);
example.initial_time =
time - (frame - example.first_frame) / example.frame_rate;
}
} // adjust initial time so that Simulate_To_Frame() returns correct time (essential when writing substeps)
//#####################################################################
virtual void Advance_To_Target_Time (const T target_time) {}
virtual void Execute_Main_Program();
virtual void Initialize();
virtual void Simulate_To_Frame (const int frame_input);
//#####################################################################
};
}
#endif