8#ifndef SRC_APPS_CHEM_MOLECULARORBITALS_H_
9#define SRC_APPS_CHEM_MOLECULARORBITALS_H_
20template<
typename T, std::
size_t NDIM>
class Function;
24template<
typename T, std::
size_t NDIM>
42 const std::vector<int>& set)
52 for (
int i=s.start; i<s.end+1; ++i) result.
mo.push_back(
copy(
mo[i]));
65 std::vector<Function<T,NDIM> >
get_mos()
const {
73 [[nodiscard]] std::vector<std::string>
get_irreps()
const {
123 std::size_t nmo =
mo.size();
124 std::vector<int> set = std::vector<int>(
static_cast<size_t>(nmo), 0);
125 for (
size_t i = 1; i < nmo; ++i) {
128 if (
eps(i) -
eps(i - 1) > bandwidth ||
get_occ()(i) != 1.0) ++(set[i]);
135 std::vector<Slice> blocks;
137 for (
size_t i=1; i<localized_set.size(); ++i) {
138 if (not (localized_set[i]==localized_set[i-1])) {
139 blocks.push_back(
Slice(ilo, i-1));
144 blocks.push_back(
Slice(ilo,localized_set.size()-1));
183 void pretty_print(std::string message, std::vector<std::string> flags=std::vector<std::string>())
const {
185 if (flags.size()==0) flags.resize(
mo.size());
187 if (
irreps.size()==0)
irreps=std::vector<std::string>(
mo.size(),
"unknown");
188 print(
"orbital # irrep energy occupation localize_set");
189 for (
int i=
mo.size()-1; i>=0; --i) {
191 constexpr std::size_t
bufsize=1024;
195 cout << std::string(buf) <<endl;
202 World& world=
mo.front().world();
205 if (world.
rank() == 0) {
206 auto flags=std::vector<std::string>(dummy_mo.
get_mos().size(),
"active");
207 for (
int i=0; i<freeze; ++i) flags[i]=
"frozen";
208 dummy_mo.
pretty_print(
"diagonal Fock matrix elements with core/valence separation for freezing",flags);
209 print(
"\nfreezing orbitals: ", freeze,
"\n");
218 template <
typename Archive>
220 std::size_t nmo=
mo.size();
222 if (nmo!=
mo.size())
mo.resize(nmo);
223 for (
auto&
m :
mo) ar &
m;
225 if (ar.is_input_archive) {
226 if (
irreps.size()==0)
irreps=std::vector<std::string>(nmo,
"unknown");
235 if (mo1.
mo.size()!=mo2.
mo.size())
return false;
236 if (mo1.
mo.size()==0)
return true;
238 World& world=mo1.
mo.front().world();
247 std::vector<std::string>& irrep_out,
Tensor<double>& occ_out, std::vector<int>& set_out)
const;
254 const std::size_t nmo_alpha,
const std::size_t nmo_beta) {
274 return std::make_pair(amo,bmo);
303 unsigned int nmo = 0;
309 "restart archive holds fewer orbitals than requested");
312 for (
unsigned int i = 0; i <
mo.size(); ++i)
314 unsigned int n_core =
molecule.n_core_orb_all();
315 if (nmo > nmo_from_input) {
318 mo = std::vector<Function<T,NDIM> >(
mo.begin() + n_core,
319 mo.begin() + n_core + nmo_from_input);
328 unsigned int nmo=
mo.size();
332 for (
unsigned int i = 0; i <
mo.size(); ++i)
356 std::vector<Vector<typename Tensor<T>::scalar_type,3>>
compute_center(
360 std::vector<Function<T,NDIM> >
mo;
the header of a restartdata archive, in one place
Contracted Gaussian basis.
Definition apps/periodic_old/molecularbasis.h:424
Contracted Gaussian basis.
Definition madness/chem/molecularbasis.h:469
long size() const
Returns the number of elements in the tensor.
Definition basetensor.h:138
static int get_k()
Returns the default wavelet order.
Definition funcdefaults.h:164
A multiresolution adaptive numerical function.
Definition mra.h:144
Definition MolecularOrbitals.h:25
void invalidate_eps()
Definition MolecularOrbitals.h:167
MolecularOrbitals get_subset(const int iset) const
Definition MolecularOrbitals.h:46
static void save_restartaodata(World &world, const Molecule &molecule, const MolecularOrbitals< T, NDIM > &amo, const MolecularOrbitals< T, NDIM > &bmo, const AtomicBasisSet &aobasis)
save MOs in the AO projection for geometry restart
Definition MolecularOrbitals.cc:83
std::vector< std::string > irreps
Definition MolecularOrbitals.h:362
void print_cubefiles(const std::string name, const std::vector< std::string > cubefile_header) const
Definition MolecularOrbitals.cc:66
void write_to(std::vector< Function< T, NDIM > > &mo_out, Tensor< double > &eps_out, std::vector< std::string > &irrep_out, Tensor< double > &occ_out, std::vector< int > &set_out) const
Definition MolecularOrbitals.cc:34
static std::pair< MolecularOrbitals< T, NDIM >, MolecularOrbitals< T, NDIM > > read_restartdata(World &world, const std::string filename, const Molecule &molecule, const std::size_t nmo_alpha, const std::size_t nmo_beta)
reads amo and bmo from the restartdata file
Definition MolecularOrbitals.h:253
MolecularOrbitals & update_mos(const std::vector< Function< T, NDIM > > &mo_new)
updates will keep other member variables
Definition MolecularOrbitals.h:93
MolecularOrbitals & recompute_localize_sets(const double bandwidth=1.5)
group orbitals into sets of similar orbital energies for localization
Definition MolecularOrbitals.h:121
Tensor< double > get_eps() const
Definition MolecularOrbitals.h:69
std::size_t size() const
Definition MolecularOrbitals.h:61
void save_mos(archive::ParallelOutputArchive<> &ar, const Molecule &molecule) const
legacy code
Definition MolecularOrbitals.h:326
void serialize(Archive &ar)
Definition MolecularOrbitals.h:219
friend bool similar(const MolecularOrbitals &mo1, const MolecularOrbitals &mo2, const double thresh=1.e-6)
Definition MolecularOrbitals.h:233
static std::pair< MolecularOrbitals< T, NDIM >, MolecularOrbitals< T, NDIM > > read_restartaodata(World &world, const Molecule &molecule, const bool have_beta)
uses AO-projection as a restart guess
Definition MolecularOrbitals.cc:104
void invalidate_occ()
Definition MolecularOrbitals.h:175
Tensor< double > eps
Definition MolecularOrbitals.h:361
MolecularOrbitals(const std::vector< Function< T, NDIM > > &mo)
Definition MolecularOrbitals.h:32
static std::vector< Slice > convert_set_to_slice(const std::vector< int > &localized_set)
Definition MolecularOrbitals.h:134
void invalidate_mos()
Definition MolecularOrbitals.h:163
MolecularOrbitals & set_all_orbitals_occupied()
Definition MolecularOrbitals.h:149
void invalidate_irreps()
Definition MolecularOrbitals.h:171
void invalidate_localize_sets()
Definition MolecularOrbitals.h:179
MolecularOrbitals & update_occ(const Tensor< double > &occ_new)
Definition MolecularOrbitals.h:98
MolecularOrbitals & update_localize_set(const std::vector< int > &set)
updates will keep other member variables
Definition MolecularOrbitals.h:104
MolecularOrbitals & update_mos_and_eps(const std::vector< Function< T, NDIM > > &mo_new, const Tensor< double > &eps_new)
updates will keep other member variables
Definition MolecularOrbitals.h:110
MolecularOrbitals(const std::vector< Function< T, NDIM > > &mo, const Tensor< double > &eps)
Definition MolecularOrbitals.h:36
void pretty_print(std::string message, std::vector< std::string > flags=std::vector< std::string >()) const
Definition MolecularOrbitals.h:183
MolecularOrbitals(const std::vector< Function< T, NDIM > > &mo, const Tensor< double > &eps, const std::vector< std::string > &irrep, const Tensor< double > &occ, const std::vector< int > &set)
Definition MolecularOrbitals.h:40
void project_ao(World &world, const Tensor< T > &Saomo, const std::vector< Function< double, 3 > > &aos)
Definition MolecularOrbitals.cc:141
Tensor< double > get_occ() const
Definition MolecularOrbitals.h:81
std::vector< int > get_localize_sets() const
Definition MolecularOrbitals.h:77
std::vector< Function< T, NDIM > > mo
Definition MolecularOrbitals.h:360
std::vector< Function< T, NDIM > > get_mos() const
Definition MolecularOrbitals.h:65
MolecularOrbitals(const MolecularOrbitals< T, NDIM > &other)=default
std::vector< int > localize_sets
Definition MolecularOrbitals.h:364
Tensor< double > occ
Definition MolecularOrbitals.h:363
std::vector< std::string > get_irreps() const
Definition MolecularOrbitals.h:73
MolecularOrbitals()=default
static void save_restartdata(World &world, const std::string filename, const Molecule &molecule, const MolecularOrbitals< T, NDIM > &amo, const MolecularOrbitals< T, NDIM > &bmo)
writes amo and bmo to a restartdata file
Definition MolecularOrbitals.h:284
void invalidate_all()
Definition MolecularOrbitals.h:155
void print_frozen_orbitals(const long freeze) const
Definition MolecularOrbitals.h:200
void post_process_mos(World &world, const double thresh, const int k)
Definition MolecularOrbitals.cc:53
void load_mos(archive::ParallelInputArchive<> &ar, const Molecule &molecule, const std::size_t nmo_from_input)
legacy code
Definition MolecularOrbitals.h:301
std::vector< Vector< typename Tensor< T >::scalar_type, 3 > > compute_center(const Function< typename Tensor< T >::scalar_type, NDIM > metric2=Function< typename Tensor< T >::scalar_type, NDIM >()) const
Definition MolecularOrbitals.cc:155
MolecularOrbitals & set_mos(const std::vector< Function< T, NDIM > > &mo_new)
setters will always invalidate all other member variables
Definition MolecularOrbitals.h:86
MolecularOrbitals & recompute_irreps(const std::string pointgroup, const Function< typename Tensor< T >::scalar_type, NDIM > &metric)
Definition MolecularOrbitals.cc:24
Definition molecule.h:129
A slice defines a sub-range or patch of a dimension.
Definition slice.h:103
A tensor is a multidimensional array.
Definition tensor.h:318
TensorTypeData< T >::scalar_type scalar_type
C++ typename of the real type associated with a complex type.
Definition tensor.h:410
void clear()
Frees all memory and resests to state of default constructor.
Definition tensor.h:1901
A parallel world class.
Definition world.h:134
ProcessID rank() const
Returns the process rank in this World (same as MPI_Comm_rank()).
Definition world.h:344
An archive for storing local or parallel data wrapping a BinaryFstreamOutputArchive.
Definition parallel_archive.h:321
Objects that implement their own parallel archive interface should derive from this class.
Definition parallel_archive.h:58
const std::size_t bufsize
Definition derivatives.cc:16
#define MADNESS_CHECK(condition)
Check a condition — even in a release build the condition is always evaluated so it can have side eff...
Definition madness_exception.h:182
#define MADNESS_CHECK_THROW(condition, msg)
Check a condition — even in a release build the condition is always evaluated so it can have side eff...
Definition madness_exception.h:207
Namespace for all elements and tools of MADNESS.
Definition DFParameters.h:10
static const char * filename
Definition legendre.cc:96
double norm2(World &world, const std::vector< Function< T, NDIM > > &v)
Computes the 2-norm of a vector of functions.
Definition vmra.h:921
void print(const T &t, const Ts &... ts)
Print items to std::cout (items separated by spaces) and terminate with a new line.
Definition print.h:227
std::vector< std::string > cubefile_header(std::string filename="input", const bool &no_orient=false)
Definition molecule.cc:73
std::string name(const FuncType &type, const int ex=-1)
Definition ccpairfunction.h:28
Function< T, NDIM > copy(const Function< T, NDIM > &f, const std::shared_ptr< WorldDCPmapInterface< Key< NDIM > > > &pmap, bool fence=true)
Create a new copy of the function with different distribution and optional fence.
Definition mra.h:2187
Implements ParallelInputArchive and ParallelOutputArchive for parallel serialization of data.
static const double m
Definition relops.cc:9
static const double thresh
Definition rk.cc:45
static const long k
Definition rk.cc:44
Defines and implements most of Tensor.
constexpr std::size_t NDIM
Definition testgconv.cc:54
static Molecule molecule
Definition testperiodicdft.cc:39
static AtomicBasisSet aobasis
Definition testperiodicdft.cc:40