mirror of
https://github.com/CHN-beta/nixos.git
synced 2026-01-12 01:09:24 +08:00
packages.sbatch-tui: add fdtd support
This commit is contained in:
@@ -12,7 +12,7 @@ endif()
|
||||
find_package(ftxui REQUIRED)
|
||||
find_package(biu REQUIRED)
|
||||
|
||||
add_executable(sbatch-tui src/main.cpp src/vasp_gpu.cpp src/vasp_cpu.cpp src/mumax3.cpp)
|
||||
add_executable(sbatch-tui src/main.cpp src/vasp_gpu.cpp src/vasp_cpu.cpp src/mumax3.cpp src/fdtd.cpp)
|
||||
target_compile_features(sbatch-tui PUBLIC cxx_std_23)
|
||||
target_link_libraries(sbatch-tui PRIVATE ftxui::screen ftxui::dom ftxui::component biu::biu)
|
||||
target_include_directories(sbatch-tui PRIVATE $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>)
|
||||
|
||||
@@ -14,3 +14,9 @@ Program:
|
||||
Queue:
|
||||
- Name: localhost
|
||||
Gpu: [ "4060" ]
|
||||
Fdtd:
|
||||
Queue:
|
||||
- Name: localhost
|
||||
Recommended:
|
||||
Cpus: 16
|
||||
Memory: 64
|
||||
|
||||
115
packages/sbatch-tui/src/fdtd.cpp
Normal file
115
packages/sbatch-tui/src/fdtd.cpp
Normal file
@@ -0,0 +1,115 @@
|
||||
# include <sbatch-tui.hpp>
|
||||
|
||||
namespace sbatch
|
||||
{
|
||||
class Fdtd : public Program
|
||||
{
|
||||
public: struct StateType
|
||||
{
|
||||
int QueueSelected = 0;
|
||||
std::vector<std::string> QueueEntries;
|
||||
int CpuSchemeSelected = 0;
|
||||
std::vector<std::string> CpuSchemeEntries = { "Default", "Custom" };
|
||||
std::string Cpus = "1";
|
||||
bool Nomultithread = true;
|
||||
int MemorySchemeSelected = 0;
|
||||
std::vector<std::string> MemorySchemeEntries = { "Default", "All", "Custom" };
|
||||
std::string Memory = "1";
|
||||
std::string InputFile = "input.fsp";
|
||||
};
|
||||
protected: StateType State_;
|
||||
protected: struct Recommended_ { int Cpus; std::optional<int> Memory; };
|
||||
protected: std::vector<Recommended_> 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<std::string>());
|
||||
Recommendeds_.push_back(queue["Recommended"].as<Recommended_>());
|
||||
}
|
||||
}
|
||||
public: virtual void try_load_state(YAML::Node node) noexcept override
|
||||
{
|
||||
try
|
||||
{
|
||||
auto saved_state = node.as<decltype(State_)>();
|
||||
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::vector<std::string> get_submit_command(std::string extra_sbatch_parameter) 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();
|
||||
}();
|
||||
return
|
||||
{
|
||||
"sbatch"s,
|
||||
"--partition={} --nodes=1-1"_f(State_.QueueEntries[State_.QueueSelected]),
|
||||
cpu_string, mem_string,
|
||||
"--wrap=\"srun fdtd-engine-ompi-lcl {}\""_f(escape(State_.InputFile)),
|
||||
extra_sbatch_parameter
|
||||
};
|
||||
}
|
||||
};
|
||||
template void Program::register_child_<Fdtd>();
|
||||
}
|
||||
Reference in New Issue
Block a user