#include #include #include namespace kel { namespace lbm { namespace sch { using namespace saw::schema; using MetaArgsStruct = Struct< Member, Member, Member, Member, Member >; using MetaArgs = Args< MetaArgsStruct, Tuple >; using Prec = Float64; } } } template saw::error_or meta_lbm_info(const saw::data& args_str){ using namespace kel::lbm; converter conv{ {args_str.template get<"dx">()}, {args_str.template get<"dt">()} }; print_lbm_meta(conv, {args_str.template get<"kin_vis">()},{args_str.template get<"char_vel">()},{args_str.template get<"char_len">()}); return saw::make_void(); } saw::error_or meta_main(int argc, char** argv){ using namespace kel::lbm; std::string_view cfg_file_name = "config.json"; if(argc > 1){ cfg_file_name = argv[1]; } saw::data args_dat; { { } saw::data args_enc{argc,argv}; saw::codec args_codec; auto eov = args_codec.decode(args_enc,args_dat); if(eov.is_error()){ return eov; } } auto& args_str = args_dat.template get<"args">(); auto& args_pos = args_dat.template get<"positionals">(); switch(args_pos.get<0u>().get()){ case 1u: { switch(args_pos.get<1u>().get()){ case 3u: meta_lbm_info>(args_str); break; default: return saw::make_error("Second positional needs to be a valid velocity set"); } } break; case 2u: { switch(args_pos.get<1u>().get()){ case 5u: meta_lbm_info>(args_str); break; case 9u: meta_lbm_info>(args_str); break; default: return saw::make_error("Second positional needs to be a valid velocity set"); } } break; case 3u: { switch(args_pos.get<1u>().get()){ case 7u: return saw::make_error("D3Q7 Velocity Set is not implemented"); // meta_lbm_info>(args_str); break; case 19u: return saw::make_error("D3Q17 Velocity Set is not implemented"); // meta_lbm_info>(args_str); break; case 27u: meta_lbm_info>(args_str); break; default: return saw::make_error("Second positional needs to be a valid velocity set"); } } break; default: return saw::make_error("First positional needs to be Dimension 1,2 or 3"); } return saw::make_void(); } int main(int argc, char** argv){ auto eov = meta_main(argc,argv); if(eov.is_error()){ auto& err = eov.get_error(); std::cerr<<"[Error]: "<