Quantum 3xplorer (Q3)
An AI-native quantum simulation engine
Loading...
Searching...
No Matches
main.cpp
Go to the documentation of this file.
2#include <chrono>
3#include <filesystem>
4#include <string>
5
7#include "io/cli.hpp"
9#include "io/logger.hpp"
12#include "utils/time.hpp"
13
14using namespace q3;
15
16// ─── CLI helpers ──────────────────────────────────────────────────────────────
17
18/**
19 * Report what an input resolved to, for `--check`.
20 *
21 * Deliberately says what the *calculation* is rather than echoing keys back:
22 * the failure this exists to catch is a deck being read as a different
23 * calculation than it describes, and the keys a user would have to compare by
24 * hand to see that are exactly these.
25 */
26static void report_resolved_input(const InputData& input) {
27 log::info("Input reads as:");
28 log::info(" calculation {}", input.calculation);
29 log::info(" functional {}",
31 ? "unresolved: named nowhere, and a species has no pseudopotential to state it"
33 log::info(" cutoffs wavefunction {} Ry, density {} Ry",
36 log::info(" spin components {}", input.number_of_spin_components);
37 log::info(" atoms {} in {} species", input.atoms.size(), input.species.size());
38 // An explicit list takes precedence over the grid, so it is the one reported.
39 if (!input.kpoints_list.empty())
40 log::info(" k-points {} listed explicitly", input.kpoints_list.size());
41 else
42 log::info(" k-point grid {}x{}x{} shifted {}{}{}",
49 if (!input.hubbard.empty()) {
50 for (const auto& hubbard : input.hubbard)
51 log::info(" DFT+U {} {} U = {} Ry ({} projectors)",
52 hubbard.species_symbol,
53 hubbard.orbital_label,
54 hubbard.u_rydberg,
56 }
57 if (input.dispersion_correction != "none")
58 log::info(" dispersion {}", input.dispersion_correction);
59 if (input.isolated_system_correction != "none")
60 log::info(" isolated system {}", input.isolated_system_correction);
61 if (input.disable_symmetry)
62 log::info(" symmetry disabled");
63}
64
65// ─── Entry point ──────────────────────────────────────────────────────────────
66
67int main(int argc, char* argv[]) {
69 auto options = cli::parse_options(argc, argv, "q3");
70
71 q3::log::init(options.log_file);
72
73 /**
74 * Answered before the input is resolved. `--version` must work in a
75 * directory holding no input, where cli::read_input() fails.
76 */
77 if (options.print_version) {
79 return 0;
80 }
81
82 if (!options.log_level.empty()) {
83 log::set_level(options.log_level);
84 }
86
87 int exit_code = 0;
88 try {
89 auto input = cli::read_input(options, "q3");
90
91 if (options.check_only) {
94 return 0;
95 }
96
97 // Dispatch based on calculation type.
98 const std::string& calculation_type = input.calculation;
99 log::info(" Calculation type: {}", calculation_type);
100
101 /**
102 * Dispatch to the appropriate flavor (scf or non_self_consistent_field).
103 * Multi-step workflows (band_structure, dos, relaxation) are orchestrated by the
104 * Python layer, which chains these single-flavor runs.
105 */
106 generated::Results results = run_flavor(input);
107 write_results_json(results, input.output_directory + "/" + input.prefix + "_results.json");
108 write_companion_outputs(input, results);
109
110 } catch (const std::exception& e) {
111 log::error("Error: {}", e.what());
112 exit_code = 1;
113 }
114
115 auto& profiling = q3::ProfilingCounters::instance();
116 q3::log::info(" Total FFT calls: {}", profiling.fft_call_count.load());
117 q3::log::info(" Total Davidson iterations: {}",
118 profiling.davidson_iteration_count.load());
119 q3::log::info(" Total Hamiltonian applications: {}",
120 profiling.hamiltonian_application_count.load());
121 profiling.print_memory_summary();
122 profiling.davidson_timing.print_summary();
124 return exit_code;
125}
int main(int argc, char *argv[])
Definition main.cpp:67
static void report_resolved_input(const InputData &input)
Definition main.cpp:26
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)
Definition cli.hpp:175
void print_version(const std::string &binary_name)
Definition cli.hpp:45
InputData read_input(Options &options, const std::string &binary_name)
Definition cli.hpp:239
void print_footer()
Definition cli.hpp:278
void print_header()
Definition cli.hpp:274
void init(const std::string &log_file="")
Definition logger.hpp:59
void error(spdlog::format_string_t< Args... > fmt, Args &&... args)
Definition logger.hpp:192
void info(spdlog::format_string_t< Args... > fmt, Args &&... args)
Definition logger.hpp:183
void set_level(const std::string &level)
Set log level: "trace", "debug", "info", "warn", "error", "off".
Definition logger.hpp:94
void write_results_json(const generated::Results &results, const std::string &output_path)
Write the results to output_path as results.json.
Definition results.hpp:191
generated::Results run_flavor(const InputData &input)
Definition factory.hpp:109
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.
Parsed input data — holds raw values read from input files.
Definition data.hpp:27
std::string dispersion_correction
Definition data.hpp:78
int kpoint_grid_dimension_3
Definition data.hpp:159
Real charge_density_energy_cutoff
Definition data.hpp:111
int kpoint_grid_shift_1
Definition data.hpp:160
std::vector< AtomSpecies > species
Definition data.hpp:153
int kpoint_grid_dimension_1
Definition data.hpp:159
std::vector< Atom > atoms
Definition data.hpp:156
std::vector< std::pair< Vector3D, Real > > kpoints_list
Definition data.hpp:125
bool disable_symmetry
Definition data.hpp:192
std::vector< HubbardSpecification > hubbard
Definition data.hpp:85
int kpoint_grid_dimension_2
Definition data.hpp:159
std::string calculation
Definition data.hpp:116
std::string isolated_system_correction
Definition data.hpp:209
std::string hubbard_projector_type
Definition data.hpp:93
int kpoint_grid_shift_2
Definition data.hpp:160
int kpoint_grid_shift_3
Definition data.hpp:160
Real wavefunction_energy_cutoff
Definition data.hpp:110
std::string exchange_correlation_functional
Definition data.hpp:41
int number_of_spin_components
Definition data.hpp:42
static ProfilingCounters & instance()
Definition counters.hpp:220