8#ifndef SRC_APPS_CHEM_OEP_H_
9#define SRC_APPS_CHEM_OEP_H_
71 return std::vector<Tensor<double> > (1,U);
82 static constexpr char const *
tag =
"oep";
88 initialize<bool>(
"no_compute",
false,
"read from previous OEP calculation, no computation");
89 initialize<double>(
"levelshift",0.0,
"shift occupied orbital energies in the BSH operator");
98 initialize<unsigned int>(
"save_iter_orbs",0,
"if > 0 save all orbitals every ... iterations (needs a lot of storage!");
115 return std::string(
"oep");
128 print(
"levelshift > 0.0 in oep parameters\n\n");
203 auto ref=std::make_shared<Nemo>(
world,parser);
204 ref->get_calc()->param.set_derived_value(
"convergence_criteria",
convergence_crit);
210 std::string
name()
const override {
return "oep";}
214 print(
"The oep code computes local exchange potentials based on a Hartree-Fock calculation from nemo");
215 print(
"oep --print_parameters\n");
216 print(
"You can perform a simple calculation by running\n");
217 print(
"oep --geometry=h2o.xyz\n");
218 print(
"provided you have an xyz file in your directory.");
224 print(
"default parameters for the oep program are");
225 param.print(
"oep",
"end");
226 print(
"\n\nthe molecular geometry must be specified in a separate block:");
239 for (
auto w : what) {
241 else if (
w==
"reference")
reference->get_calc_param().print(
"dft");
252 return value(
calc->molecule.get_all_coords());
285 for (
const auto& r :
results) {
313 return (model==
"ocep")
or (model==
"dcep")
or (model==
"mrks");
317 return (model==
"dcep");
321 return (model==
"mrks");
326 for (
long i =
orbens.size() - 1; i >= 0; i--) {
353 K.set_bra_and_ket(
R_square * nemo, nemo);
399 for (
int idim=0; idim<3; ++idim) {
422 std::vector<vecfuncT>
grad_nemo(nemo.size());
423 for (
size_t i = 0; i < nemo.size(); i++) {
432 for (
size_t i = 0; i < nemo.size(); i++) {
433 for (
size_t j = i + 1; j < nemo.size(); j++) {
457 if (
fockKS.normf()<1.e-10) {
464 double homoKS = -eval.max();
554 op.square_denominator=
true;
639 const double E_nuc =
calc->molecule.nuclear_repulsion_energy();
644 printf(
" electron-nuclear attraction energy %15.8f Eh\n",
E_ext);
645 printf(
" Coulomb energy %15.8f Eh\n",
E_J);
646 printf(
" exchange energy %15.8f Eh\n",
E_X);
647 printf(
" nuclear-nuclear repulsion energy %15.8f Eh\n",
E_nuc);
663 for (
long i = 0; i <
eigvals.size(); i++) {
680 const double E_nuc =
calc->molecule.nuclear_repulsion_energy();
double w(double t, double eps)
Definition DKops.h:22
Operators for the molecular HF and DFT code.
Definition SCFOperators.h:379
Function< T, NDIM > compute_potential(const Function< T, NDIM > &density) const
given a density compute the Coulomb potential
Definition SCFOperators.h:477
const real_function_3d & potential() const
getter for the Coulomb potential
Definition SCFOperators.h:466
Implements derivatives operators with variety of boundary conditions on simulation domain.
Definition derivative.h:266
Definition SCFOperators.h:105
Exchange & set_bra_and_ket(const vecfuncT &bra, const vecfuncT &ket)
Definition SCFOperators.cc:714
bool compressed
Definition mra.h:1198
Key is the index for a node of the 2^NDIM-tree.
Definition key.h:69
static void print_parameters()
Definition molecule.cc:115
real_function_3d R_square
the square of the nuclear correlation factor
Definition nemo.h:319
double compute_kinetic_energy(const std::vector< Function< T, NDIM > > &nemo) const
compute kinetic energy as square of the "analytical" expectation value
Definition nemo.h:183
World & world
Definition nemo.h:310
The Nemo class.
Definition nemo.h:326
void set_protocol(const double thresh)
adapt the thresholds consistently to a common value
Definition nemo.h:637
const NemoCalculationParameters & get_nemo_param() const
Definition nemo.h:503
std::shared_ptr< SCF > get_calc() const
Definition nemo.h:501
const CalculationParameters & get_calc_param() const
Definition nemo.h:504
std::shared_ptr< SCF > calc
Definition nemo.h:588
void load_mos(World &w)
Definition nemo.h:414
Molecule & molecule()
return a reference to the molecule
Definition nemo.h:512
functor for a local U1 dot U1 potential
Definition correlationfactor.h:532
Definition SCFOperators.h:500
OEP_Parameters(World &world, const commandlineparser &parser)
Definition oep.h:107
static constexpr char const * tag
Definition oep.h:82
std::vector< std::string > model() const
Definition oep.h:134
unsigned int maxiter() const
Definition oep.h:138
double dens_thresh_inv() const
Definition oep.h:143
bool restart() const
Definition oep.h:136
OEP_Parameters(const OEP_Parameters &other)=default
bool no_compute() const
Definition oep.h:137
unsigned int save_iter_corrections() const
Definition oep.h:145
void set_derived_values(const CalculationParameters &cparam)
Definition oep.h:119
unsigned int saving_amount() const
Definition oep.h:144
double dens_thresh_hi() const
Definition oep.h:141
OEP_Parameters()
Definition oep.h:84
std::vector< double > kain_param() const
Definition oep.h:147
double levelshift() const
Definition oep.h:139
std::string get_tag() const override
Definition oep.h:114
double dens_thresh_lo() const
Definition oep.h:142
bool need_mrks_correction(const std::string &model) const
Definition oep.h:320
void set_reference(const std::shared_ptr< Nemo > reference1)
Definition oep.h:230
OEP_Parameters oep_param
parameters for this OEP calculation
Definition oep.h:157
static void help()
Definition oep.h:212
double compute_exchange_energy_vir(const vecfuncT &nemo, const real_function_3d Vx) const
compute Evir using Levy-Perdew virial relation (Kohut_2014, (43) or Ospadov_2017, (25))
Definition oep.h:594
std::shared_ptr< Fock< double, 3 > > make_fock_operator() const override
the OEP Fock operator is the HF Fock operator without exchange but with the OEP
Definition madness/chem/oep.cc:122
real_function_3d compute_total_kinetic_density(const vecfuncT &nemo) const
compute the total kinetic energy density of equation (6) from Kohut
Definition oep.h:384
void save_restartdata(const Tensor< double > &fock) const
Definition madness/chem/oep.cc:74
Tensor< double > compute_fock_diagonal_elements(const Tensor< double > &KS_eigvals, const vecfuncT &phi, const vecfuncT &Kphi, const real_function_3d &Vx) const
compute diagonal elements of Fock matrix
Definition oep.h:655
double compute_exchange_energy_conv(const vecfuncT phi, const vecfuncT Kphi) const
compute exchange energy using the expectation value of the exchange operator
Definition oep.h:614
double compute_delta_rho(const real_function_3d rho_HF, const real_function_3d rho_KS) const
compute Delta rho as an indicator for the result's quality
Definition oep.h:342
void print_parameters(std::vector< std::string > what) const
Definition oep.h:238
void compute_nemo_potentials(const vecfuncT &nemo, vecfuncT &Jnemo, vecfuncT &Unemo) const
compute all potentials from given nemos except kinetic energy
Definition oep.h:561
real_function_3d compute_slater_potential(const vecfuncT &nemo) const
compute Slater potential (Kohut, 2014, equation (15))
Definition oep.h:350
bool need_dcep_correction(const std::string &model) const
Definition oep.h:316
OEPResults iterate(const std::string model, const vecfuncT &HF_nemo, const tensorT &HF_eigvals, vecfuncT &KS_nemo, tensorT &KS_Fock, real_function_3d &Voep, const real_function_3d Vs) const
Definition madness/chem/oep.cc:217
real_function_3d compute_energy_weighted_density_local(const vecfuncT &nemo, const tensorT &fock) const
return without the NCF and factor 2 for closed shell !
Definition oep.h:501
real_function_3d compute_mrks_correction(const real_function_3d &mrks_numerator_HF, const vecfuncT &nemoHF, const vecfuncT &nemoKS) const
compute correction of the given model
Definition oep.h:533
std::tuple< Tensor< double >, vecfuncT > recompute_HF(const vecfuncT &HF_nemo) const
Definition madness/chem/oep.cc:110
double compute_E_first(const vecfuncT phi, const vecfuncT Jphi, const vecfuncT Kphi, const real_function_3d Vx) const
compute E^(1) = 1/2*\sum_ij <ij||ij> - \sum_i <i|J + Vx|i> = \sum_i <i|- 0.5*J - 0....
Definition oep.h:671
real_function_3d compute_Pauli_kinetic_density(const vecfuncT &nemo) const
compute the Pauli kinetic energy density divided by the density tau_P/rho with equation (16) from Osp...
Definition oep.h:417
OEP(World &world, const OEP_Parameters &oepparam, const std::shared_ptr< const Nemo > &reference)
Definition oep.h:171
void compute_coulomb_potential(const vecfuncT &nemo, vecfuncT &Jnemo) const
compute Coulomb potential
Definition oep.h:573
std::shared_ptr< const Nemo > get_reference() const
Definition oep.h:234
void print_orbens(const tensorT orbens) const
print orbital energies in reverse order with optional shift
Definition oep.h:325
nlohmann::json analyze() const override
results are computed in compute_and_print_final_energies
Definition oep.h:282
void load_restartdata(Tensor< double > &fock)
Definition madness/chem/oep.cc:92
double compute_E_zeroth(const tensorT eigvals) const
cumpute E^(0) = \sum_i \epsilon_i^KS
Definition oep.h:661
real_function_3d compute_density(const vecfuncT &nemo) const
compute density from orbitals with ragularization (Bischoff, 2014_1, equation (19))
Definition oep.h:336
static void print_parameters()
Definition oep.h:222
real_function_3d get_final_potential() const
Definition oep.h:247
real_function_3d Vfinal
the final local potential
Definition oep.h:164
std::vector< OEPResults > results
collection of results
Definition oep.h:167
std::shared_ptr< const Nemo > reference
the wave function reference that determines the local potential
Definition oep.h:161
double value() override
Definition oep.h:251
OEP(World &world, const commandlineparser &parser)
Definition oep.h:191
void compute_exchange_potential(const vecfuncT &nemo, vecfuncT &Knemo) const
compute exchange potential (needed for Econv)
Definition oep.h:584
void output_calc_info_schema(const double &energy) const
update the json file with calculation input and output
Definition madness/chem/oep.cc:64
std::vector< double > compute_energy(const vecfuncT &nemo, const double E_X) const
Definition oep.h:623
bool need_ocep_correction(const std::string &model) const
Definition oep.h:312
OEPResults compute_and_print_final_energies(const std::string model, const real_function_3d &Voep, const vecfuncT &KS_nemo, const tensorT &KS_Fock, const vecfuncT &HF_nemo, const tensorT &HF_Fock) const
Definition madness/chem/oep.cc:130
real_function_3d compute_dcep_correction(const real_function_3d &dcep_numerator_HF, const vecfuncT &nemoHF, const vecfuncT &nemoKS) const
compute correction of the given model
Definition oep.h:507
virtual double value(const Tensor< double > &x) override
Should return the value of the objective function.
Definition oep.h:259
std::string name() const override
Definition oep.h:210
real_function_3d compute_ocep_correction(const real_function_3d &ocep_numerator_HF, const vecfuncT &nemoHF, const vecfuncT &nemoKS, const tensorT &fockHF, const tensorT &fockKS) const
compute correction of the given model
Definition oep.h:453
double solve(const vecfuncT &HF_nemo)
Definition madness/chem/oep.cc:22
bool selftest() override
The following function tests all essential parts of the OEP program qualitatively and some also quant...
Definition madness/chem/oep.cc:405
class for holding the parameters for calculation
Definition QCCalculationParametersBase.h:295
void read_input_and_commandline_options(World &world, const commandlineparser &parser, const std::string tag)
Definition QCCalculationParametersBase.h:331
T get(const std::string key) const
Definition QCCalculationParametersBase.h:305
void print(const std::string header="", const std::string footer="") const
print all parameters
Definition QCCalculationParametersBase.cc:22
void set_derived_value(const std::string &key, const T &value)
Definition QCCalculationParametersBase.h:409
virtual real_function_3d density() const
Definition QCPropertyInterface.h:25
A tensor is a multidimensional array.
Definition tensor.h:317
Tensor< T > & fill(T x)
Inplace fill with a scalar (legacy name)
Definition tensor.h:562
A parallel world class.
Definition world.h:132
ProcessID rank() const
Returns the process rank in this World (same as MPI_Comm_rank()).
Definition world.h:320
double(* energy)()
Definition derivatives.cc:58
static double lo
Definition dirac-hatom.cc:23
real_function_3d mask
Definition dirac-hatom.cc:27
vecfuncT K(vecfuncT &ket, vecfuncT &bra, vecfuncT &vf)
Tensor< double > op(const Tensor< double > &x)
Definition kain.cc:508
#define MADNESS_EXCEPTION(msg, value)
Macro for throwing a MADNESS exception.
Definition madness_exception.h:119
#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
void print_header2(const std::string &s)
medium section heading
Definition print.cc:54
double abs(double x)
Definition complexfun.h:48
Function< T, NDIM > square(const Function< T, NDIM > &f, bool fence=true)
Create a new function that is the square of f - global comm only if not reconstructed.
Definition mra.h:2793
std::vector< Function< T, NDIM > > grad_bspline_one(const Function< T, NDIM > &f, bool refine=false, bool fence=true)
Definition vmra.h:2094
void truncate(World &world, response_space &v, double tol, bool fence)
Definition basic_operators.cc:31
std::vector< Function< TENSOR_RESULT_TYPE(T, R), NDIM > > transform(World &world, const std::vector< Function< T, NDIM > > &v, const Tensor< R > &c, bool fence=true)
Transforms a vector of functions according to new[i] = sum[j] old[j]*c[j,i].
Definition vmra.h:707
std::vector< Function< T, NDIM > > multi_to_multi_op_values(const opT &op, const std::vector< Function< T, NDIM > > &vin, const bool fence=true)
apply op on the input vector yielding an output vector of functions
Definition vmra.h:1883
FunctionFactory< double, 3 > real_factory_3d
Definition functypedefs.h:108
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:226
response_space apply(World &world, std::vector< std::vector< std::shared_ptr< real_convolution_3d > > > &op, response_space &f)
Definition basic_operators.cc:43
void refine(World &world, const std::vector< Function< T, NDIM > > &vf, bool fence=true)
refine the functions according to the autorefine criteria
Definition vmra.h:196
Function< TENSOR_RESULT_TYPE(T, R), NDIM > dot(World &world, const std::vector< Function< T, NDIM > > &a, const std::vector< Function< R, NDIM > > &b, bool fence=true)
Multiplies and sums two vectors of functions r = \sum_i a[i] * b[i].
Definition vmra.h:1565
double inner(response_space &a, response_space &b)
Definition response_functions.h:639
vector< functionT > vecfuncT
Definition corepotential.cc:58
void refine_to_common_level(World &world, std::vector< Function< T, NDIM > > &vf, bool fence=true)
refine all functions to a common (finest) level
Definition vmra.h:206
std::vector< Function< T, NDIM > > grad(const Function< T, NDIM > &f, bool refine=false, bool fence=true)
shorthand gradient operator
Definition vmra.h:2034
static XNonlinearSolver< std::vector< Function< T, NDIM > >, T, vector_function_allocator< T, NDIM > > nonlinear_vector_solver(World &world, const long nvec)
Definition nonlinsol.h:371
void save(const Function< T, NDIM > &f, const std::string name)
Definition mra.h:2886
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:2096
void syev(const Tensor< T > &A, Tensor< T > &V, Tensor< typename Tensor< T >::scalar_type > &e)
Real-symmetric or complex-Hermitian eigenproblem.
Definition lapack.cc:969
Definition test_ar.cc:204
Definition CalculationParameters.h:51
int nalpha() const
Definition CalculationParameters.h:170
int nbeta() const
Definition CalculationParameters.h:171
very simple command line parser
Definition commandlineparser.h:15
Class to compute terms of the potential.
Definition oep.h:22
double log_high
Definition oep.h:27
std::vector< Tensor< double > > operator()(const Key< 3 > &key, const std::vector< Tensor< double > > &t) const
Definition oep.h:40
double log_low
Definition oep.h:27
bool square_denominator
Definition oep.h:28
std::size_t get_result_size() const
Definition oep.h:34
double eps_regularize
Definition oep.h:26
divide_add_interpolate(double hi, double lo, double eps_regularize)
Definition oep.h:30
double thresh_high
Definition oep.h:24
double thresh_low
Definition oep.h:25
Definition dirac-hatom.cc:112
InputParameters param
Definition tdse.cc:203
#define ITERATOR(t, exp)
Definition tensor_macros.h:249
#define IND
Definition tensor_macros.h:204
AtomicInt sum
Definition test_atomicint.cc:46
constexpr coord_t one(1.0)