54std::unique_ptr<GPUBLAS>
59std::unique_ptr<GPUEigensolver>
64std::unique_ptr<GPUFFTGrid>
68int main(
int argc,
char* argv[]) {
72 auto policy = std::make_unique<execution::PlanewaveMPIExecutionPolicy>();
75 if (options.print_version) {
79 if (!options.log_level.empty()) {
83 bool use_mixed_precision =
false;
84 if (options.precision ==
"mixed") {
85 use_mixed_precision =
true;
86 }
else if (!options.precision.empty() && options.precision !=
"double") {
87 log::error(
"Unknown precision: {}. Use 'double' or 'mixed'.", options.precision);
96 if (!input.hubbard.empty()) {
97 log::error(
"DFT+U (hubbard) is not yet supported on GPU. Run on CPU instead.");
107 int requested_number_of_pools = options.number_of_kpoint_pools_was_set
108 ? options.number_of_kpoint_pools
109 : input.number_of_kpoint_pools;
110 policy->configure_topology(requested_number_of_pools);
111 if (options.distribute_bands) {
112 policy->enable_band_distribution();
114 int ranks_per_pool = policy->world_size() / std::max(policy->number_of_pools(), 1);
115 log::info(
"MPI topology: {} rank(s), {} k-point pool(s), {} rank(s) per pool, "
116 "one CUDA device each",
117 policy->world_size(),
118 policy->number_of_pools(),
127 bool is_root = policy->is_root();
131 auto gpu_davidson = std::make_unique<PlanewaveDavidsonDiagonalizer>(
132 policy_reference, *gpu_blas, gpu_fft_grid.get(), *gpu_eigensolver, device_backend);
133 if (use_mixed_precision) {
134 gpu_davidson->set_use_mixed_precision(
true);
136 iterator->set_diagonalizer(std::move(gpu_davidson));
139 auto flavor =
create_flavor(input.calculation, std::move(iterator_factory));
141 log::info(
" Calculation type: {}", input.calculation);
143 generated::Results results = flavor->run(input);
146 input.output_directory +
"/" + input.prefix +
"_results.json");
151 }
catch (
const std::exception& error) {
int main(int argc, char *argv[])
void register_all()
No add-on is compiled in, so there is nothing to register.
Options parse_options(int argc, char *argv[], const std::string &binary_name)
void print_version(const std::string &binary_name)
InputData read_input(Options &options, const std::string &binary_name)
void print_timestamped_banner(const std::string &label_prefix)
std::unique_ptr< GPUBLAS > create_cuda_gpu_blas(std::shared_ptr< device::GPUDeviceBackend > device_backend)
std::shared_ptr< GPUDeviceBackend > create_gpu_device_backend()
std::unique_ptr< GPUEigensolver > create_cuda_gpu_eigensolver(std::shared_ptr< device::GPUDeviceBackend > device_backend)
std::unique_ptr< GPUFFTGrid > create_cuda_gpu_fft_grid(std::shared_ptr< execution::gpu::device::GPUDeviceBackend > device_backend)
void init_mpi(const std::string &log_file="")
void error(spdlog::format_string_t< Args... > fmt, Args &&... args)
void info(spdlog::format_string_t< Args... > fmt, Args &&... args)
void set_level(const std::string &level)
Set log level: "trace", "debug", "info", "warn", "error", "off".
void write_results_json(const generated::Results &results, const std::string &output_path)
Write the results to output_path as results.json.
std::unique_ptr< Flavor > create_flavor(const std::string &calculation_type, IteratorFactory iterator_factory={})
std::function< std::unique_ptr< PlanewaveKohnShamSCFIterator >(const InputData &)> IteratorFactory
void write_companion_outputs(const InputData &input, const generated::Results &results)
Write the companion outputs of the format input was read from, if it has any.
std::unique_ptr< PlanewaveKohnShamSCFIterator > create_kohn_sham_iterator(const InputData &input, const execution::PlanewaveExecutionPolicy &execution_policy)
void print_summary() const
static ProfilingCounters & instance()
DavidsonTimingAccumulator davidson_timing