From df293e3e9b45084ad78b8c0db1acf130116d8959 Mon Sep 17 00:00:00 2001 From: chn Date: Mon, 18 Aug 2025 10:21:26 +0800 Subject: [PATCH] temp --- packages/sbatch-tui/src/fdtd.cpp | 120 +++++++++++++++++++++++++++++++ 1 file changed, 120 insertions(+) create mode 100644 packages/sbatch-tui/src/fdtd.cpp diff --git a/packages/sbatch-tui/src/fdtd.cpp b/packages/sbatch-tui/src/fdtd.cpp new file mode 100644 index 00000000..9efd0448 --- /dev/null +++ b/packages/sbatch-tui/src/fdtd.cpp @@ -0,0 +1,120 @@ +# include + +namespace sbatch +{ + class Fdtd : public Program + { + public: struct StateType + { + int QueueSelected = 0; + std::vector QueueEntries; + int CpuSchemeSelected = 0; + std::vector CpuSchemeEntries = { "Default", "Custom" }; + std::string Cpus = "1"; + bool Nomultithread = true; + int MemorySchemeSelected = 0; + std::vector MemorySchemeEntries = { "Default", "All", "Custom" }; + std::string Memory = "1"; + std::string InputFile = "main.fsp"; + }; + protected: StateType State_; + protected: struct Recommended_ { int Cpus; std::optional Memory; }; + protected: std::vector Recommendeds_; + public: virtual std::string get_name() const override { return "Lumerical FDTD"; } + public: virtual void load_config(YAML::Node node) override + { + for (auto queue : node["Queue"]) + { + State_.QueueEntries.push_back(queue["Name"].as()); + Recommendeds_.push_back(queue["Recommended"].as()); + } + } + public: virtual void try_load_state(YAML::Node node) noexcept override + { + try + { + auto saved_state = node.as(); + if (saved_state.QueueSelected < State_.QueueEntries.size()) State_.QueueSelected = saved_state.QueueSelected; + if (saved_state.CpuSchemeSelected < State_.CpuSchemeEntries.size()) + State_.CpuSchemeSelected = saved_state.CpuSchemeSelected; + State_.Cpus = saved_state.Cpus; + State_.Nomultithread = saved_state.Nomultithread; + if (saved_state.MemorySchemeSelected < State_.MemorySchemeEntries.size()) + State_.MemorySchemeSelected = saved_state.MemorySchemeSelected; + State_.Memory = saved_state.Memory; + State_.InputFile = saved_state.InputFile; + } + catch (...) {} + } + public: virtual YAML::Node save_state() const override { return YAML::Node(State_); } + public: virtual ftxui::Component get_interface() override + { + return ftxui::Container::Vertical + ({ + // 第一行:选择队列和配置 + ftxui::Container::Horizontal + ({ + // 队列 + ftxui::Menu(&State_.QueueEntries, &State_.QueueSelected) + | with_title("Queue:", ftxui::Color::GrayDark), + // CPU 设置 + ftxui::Container::Horizontal + ({ + ftxui::Menu(&State_.CpuSchemeEntries, &State_.CpuSchemeSelected), + ftxui::Container::Vertical + ({ + input(&State_.Cpus, "CPU: "), + checkbox("Disable multithread", &State_.Nomultithread) + }) + | with_list_padding | with_separator + | ftxui::Maybe([&]{ return State_.CpuSchemeSelected == 1; }) + }) | with_title("CPU:", ftxui::Color::GrayDark) | with_separator, + // 内存 + ftxui::Container::Horizontal + ({ + ftxui::Menu(&State_.MemorySchemeEntries, &State_.MemorySchemeSelected), + input(&State_.Memory, "Memory (GB): ") + | with_list_padding | with_separator + | ftxui::Maybe([&]{ return State_.MemorySchemeSelected == 2; }) + }) | with_title("Memory:", ftxui::Color::GrayDark) | with_separator + }) | with_title("Resource allocation:") | with_bottom, + // 第二行:输入文件 + ftxui::Container::Vertical({input(&State_.InputFile, "Input file: ")}) + | with_title("Misc:") + }); + } + public: virtual std::string get_submit_command() const override + { + auto recommended = Recommendeds_[State_.QueueSelected]; + auto cpu_string = [&] + { + if (State_.CpuSchemeSelected == 0) + return "--ntasks={} --cpus-per-task=1 --hint=nomultithread"_f(recommended.Cpus); + else if (State_.CpuSchemeSelected == 1) return "--ntasks={} --cpus-per-task=1{}"_f + (State_.Cpus, State_.Nomultithread ? " --hint=nomultithread" : ""); + else std::unreachable(); + }(); + auto mem_string = [&] + { + if (State_.MemorySchemeSelected == 0) return recommended.Memory ? " --mem={}G"_f(recommended.Memory) : ""; + else if (State_.MemorySchemeSelected == 1) return " --mem=0"s; + else if (State_.MemorySchemeSelected == 2) return " --mem={}G"_f(State_.Memory); + else std::unreachable(); + }(); + auto srun_string = [&] + { + if (State_.CpuSchemeSelected == 0 && recommended.Cpus) + return " --ntasks={} --cpus-per-task={}"_f(recommended.Mpi, recommended.Openmp); + else return ""s; + }(); + return + "{}sbatch --partition={} --nodes=1-1\n{}{}\n" + "--wrap=\"srun{} vasp-intel vasp-{}\""_f + ( + optcell_string, State_.QueueEntries[State_.QueueSelected], cpu_string, mem_string, + srun_string, State_.VaspEntries[State_.VaspSelected] + ); + } + }; + template void Program::register_child_(); +}