30 Real smearing_width = 0.0,
31 int methfessel_paxton_order = 1) {
32 if (name ==
"fixed" || name ==
"none" || name.empty()) {
33 return std::make_unique<FixedOccupation>();
35 if (name ==
"gaussian" || name ==
"gauss") {
36 return std::make_unique<GaussianSmearing>(smearing_width);
38 if (name ==
"methfessel-paxton" || name ==
"m-p" || name ==
"mp") {
39 return std::make_unique<MethfesselPaxtonSmearing>(smearing_width, methfessel_paxton_order);
41 if (name ==
"marzari-vanderbilt" || name ==
"cold" || name ==
"m-v" || name ==
"mv") {
42 return std::make_unique<MarzariVanderbiltSmearing>(smearing_width);
44 if (name ==
"fermi-dirac" || name ==
"f-d" || name ==
"fd") {
45 return std::make_unique<FermiDiracSmearing>(smearing_width);
47 throw std::runtime_error(
48 "Unknown smearing: " + name +
49 ". Options: fixed, gaussian, methfessel-paxton, marzari-vanderbilt, fermi-dirac");
std::unique_ptr< SmearingScheme > create_smearing(const std::string &name, Real smearing_width=0.0, int methfessel_paxton_order=1)
Factory for smearing schemes.