Loading...
Searching...
No Matches
factory.hpp
Go to the documentation of this file.
1#pragma once
2
3/**
4 * create_planewave_diagonalizer — factory function for planewave eigenvalue solvers.
5 *
6 * Supported solvers: "davidson" (iterative, O(N_pw·N_bands²)) and
7 * "direct" (dense LAPACK, O(N_pw³), default for small systems).
8 *
9 * An ExecutionPolicy is injected into the diagonalizer to provide
10 * band-group collective operations (dot_product, norm) — serial BLAS
11 * in serial builds; BLAS + MPI_Allreduce in MPI builds.
12 */
13
14#include <memory>
15#include <stdexcept>
16#include <string>
17
23
24namespace q3 {
25
26/**
27 * Create a diagonalizer by name with an optional execution policy.
28 *
29 * @param name "direct" or "davidson".
30 * @param execution_policy Band-group collective operations policy.
31 * Defaults to a static serial policy for backward compatibility.
32 */
33inline std::unique_ptr<PlanewaveDiagonalizer>
34create_planewave_diagonalizer(const std::string& name,
35 const execution::ExecutionPolicy& execution_policy =
37 if (name == "davidson") {
38 return std::make_unique<PlanewaveDavidsonDiagonalizer>(execution_policy);
39 }
40 if (name == "direct") {
41 return std::make_unique<PlanewaveDirectDiagonalizer>(execution_policy);
42 }
43 throw std::runtime_error("Unknown diagonalizer: '" + name +
44 "'. Supported values: 'direct', 'davidson'.");
45}
46
47} // namespace q3
static const execution::SerialExecutionPolicy default_serial_execution_policy
Definition davidson.hpp:354
std::unique_ptr< PlanewaveDiagonalizer > create_planewave_diagonalizer(const std::string &name, const execution::ExecutionPolicy &execution_policy=PlanewaveDavidsonDiagonalizer::default_serial_execution_policy)
Definition factory.hpp:34