https://github.com/penn-graphics-research/ziran2019
Raw File
Tip revision: 8d3d27cd17bbceab18c317820dbe595178f6312a authored by fangy14 on 06 November 2019, 07:20:57 UTC
open source
Tip revision: 8d3d27c
main.cpp
#include <Ziran/CS/Util/FloatingPointExceptions.h>
#include <Ziran/CS/Util/SignalHandler.h>
#include <Ziran/CS/Util/CommandLineFlags.h>
#include <Ziran/CS/Util/Debug.h>
#include <Ziran/CS/Util/Filesystem.h>
#include <Ziran/CS/Util/PluginManager.h>
#include <tbb/tbb.h>
#include "AdmmInit2D.h"
#include "AdmmInit3D.h"

#define T double
#define dim 3

using namespace ZIRAN;

int main(int argc, char* argv[])
{
    {
        bool displayHelp = false;
        int test_number = -1; // Non-lua option.
        bool three_d = false; // Non-lua option.
        bool use_double = false; // Non-lua option
        int restart = 0; // Non-lua option
        bool run_diff_test = false; // Non-lua option
        double diff_test_perturbation_scale = 1; // Non-lua option
        float phase_field_percentage;
        float phase_field_l0_ratio;

        // Not checking for nan, because when constitutive model returns that, MpmForceBase is skipping them (treating as zeros)
        // FPE::WatchedScope w(FPE::Mask::Overflow | FPE::Mask::DivZero);
        // Unconmment the following to catch division by 0
        // FPE::WatchedScope w(FPE::Mask::Overflow | FPE::Mask::Invalid | FPE::Mask::DivZero);
        FPE::WatchedScope w(FPE::Mask::Invalid);

        std::string script_file_name;
        StdVector<std::string> inline_strings;
        FLAGS::Register helpflag("--help", "Print help (this message) and exit", displayHelp);

        // Lua command line options
        FLAGS::Register scriptflag("-script", "Lua script to read for initial data", script_file_name);
        FLAGS::Register iflag("-i", "Append string to script", inline_strings);

        // Non-lua command line options
        FLAGS::Register test_number_flag("-test", "Test number (non-lua test)", test_number);
        FLAGS::Register three_d_flag("--3d", "Dimension is 3(non-lua test)", three_d);
        FLAGS::Register run_diff_test_flag("--run_diff_test", "Run diff test (non-lua test)", run_diff_test);
        FLAGS::Register diff_test_perturbation_scale_flag("-dtps", "diff_test_perturbation_scale (non-lua test)", diff_test_perturbation_scale);
        FLAGS::Register double_flag("--double", "Dimension (non-lua test)", use_double);
        FLAGS::Register restart_flag("-restart", "Restart frame (non-lua test)", restart);

        FLAGS::Register phase_field_percentage_flag("-p", "phase_field_percentage_flag", phase_field_percentage);
        FLAGS::Register phase_field_l0_ratio_flag("-l0", "phase_field_l0_ratio_flag", phase_field_l0_ratio);

        int num_threads = tbb::task_scheduler_init::automatic;

        FLAGS::Register thread_flag("-t", "Set number of threads", num_threads);

        std::stringstream script;
        PluginManager pm;
        try {
            FLAGS::ParseFlags(argc, argv);
            if (!script_file_name.empty()) {
                FILESYSTEM::readFile(script, script_file_name);
            }
            pm.loadAllPlugins();
        }
        catch (std::exception& e) {
            std::cerr << e.what() << std::endl;
            FLAGS::PrintUsage(std::cerr);
            return 1;
        }
        if (displayHelp) {
            std::cout << "Usage:\n";
            FLAGS::PrintUsage(std::cout);
            return 0;
        }
        installSignalHandler();
        for (const auto& s : inline_strings) {
            script << s << "\n";
        }

        tbb::task_scheduler_init init(num_threads);

        if (script_file_name.empty()) {
            ZIRAN_ASSERT(test_number != -1, "No lua script loaded. Either load with --script or set --test");
            AdmmSimulation<T, dim> e;
            if (run_diff_test) {
                e.diff_test = true;
                e.diff_test_perturbation_scale = diff_test_perturbation_scale;
            }
            e.logger = LogWorker::initializeLogging();
#if dim == 2
            AdmmInit2D<T> h(e, test_number);
#else
            AdmmInit3D<T> h(e, test_number);
#endif
            if (!restart)
                h.start();
            else
                h.restart(restart);
        }
    }
    return 0;
}
back to top