votca 2026-dev
Loading...
Searching...
No Matches
sigma_base.h
Go to the documentation of this file.
1/*
2 * Copyright 2009-2020 The VOTCA Development Team
3 * (http://www.votca.org)
4 *
5 * Licensed under the Apache License, Version 2.0 (the "License")
6 *
7 * You may not use this file except in compliance with the License.
8 * You may obtain a copy of the License at
9 *
10 * http://www.apache.org/licenses/LICENSE-2.0
11 *
12 * Unless required by applicable law or agreed to in writing, software
13 * distributed under the License is distributed on an "AS IS" BASIS,
14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 * See the License for the specific language governing permissions and
16 * limitations under the License.
17 *
18 */
19
20#pragma once
21#ifndef VOTCA_XTP_SIGMA_BASE_H
22#define VOTCA_XTP_SIGMA_BASE_H
23
24#include <functional>
25#include <string>
26
27// Local VOTCA includes
28#include "eigen.h"
29#include "exact_pole_sums.h"
30#include "screening_kernels.h"
31
32namespace votca {
33namespace xtp {
34
35class TCMatrix_gwbse;
36class RPA;
37
39 public:
40 Sigma_base(TCMatrix_gwbse& Mmn, const RPA& rpa) : Mmn_(Mmn), rpa_(rpa) {};
41
42 virtual ~Sigma_base() = default;
43
44 struct options {
50 double eta;
51 std::string quadrature_scheme; // Gaussian-quadrature scheme to use in CDA
52 Index order; // used in numerical integration of CDA Sigma
53 double alpha;
54 };
55
56 void configure(options opt) {
57 opt_ = opt;
58 qptotal_ = opt.qpmax - opt.qpmin + 1;
59 rpatotal_ = opt.rpamax - opt.rpamin + 1;
60 }
61
62 // Calculates full exchange matrix
63 Eigen::MatrixXd CalcExchangeMatrix() const;
78 Eigen::MatrixXd CalcHartreeMatrix(
79 const Eigen::MatrixXd& R = Eigen::MatrixXd()) const;
80
109 Eigen::MatrixXd CalcReactionFieldMatrix(const Eigen::MatrixXd& R) const;
110 // Calculates correlation diagonal
111 Eigen::VectorXd CalcCorrelationDiag(const Eigen::VectorXd& frequencies) const;
112 // Calculates correlation off-diagonal (diagonal left zero)
113 virtual Eigen::MatrixXd CalcCorrelationOffDiag(
114 const Eigen::VectorXd& frequencies) const;
115
124 Eigen::MatrixXd CalcCorrelationSRG(const Eigen::VectorXd& frequencies,
125 double s) const;
126
127 // Sets up the screening parametrisation
128 virtual void PrepareScreening() = 0;
129
131 virtual std::string ScreeningSummary() const { return ""; }
133 virtual bool HasOffDiagonal() const { return true; }
134
144 const double* residues;
145 const double* mode_factors;
146 double prefactor;
147 };
148 virtual bool HasPoleForm() const { return false; }
149 virtual DiagPoleForm PoleForm(Index gw_level) const;
150
158 Eigen::VectorXd omegas; // Omega_s
159 Eigen::VectorXd strength; // sum_i a_is / Omega_s: share of mode s in
160 // -Tr[eps^-1(0) - 1]
161 Eigen::VectorXd frame_weights; // w_i = 1 - 1/eps_i(0) = -(eps^-1(0)-1)_ii
162 Eigen::MatrixXd frame_moments; // (i, k): sum_s a_is Omega_s^(k-1),
163 // k = 0, 1, 2 (k = 0 equals w_i)
164 Eigen::MatrixXd frame_eps_inv_imag; // (i, j): eps^-1_ii(i nu_j) - 1
165 Eigen::VectorXd energies; // RPA input energies W was built with
166 };
167
169 void setKeepScreeningData(bool keep) { keep_screening_data_ = keep; }
170 virtual ScreeningData ScreeningDump(const Eigen::VectorXd& nu) const;
171 // Calculates Sigma_c diagonal elements
173 Index gw_level, double frequency) const = 0;
174 virtual double CalcCorrelationDiagElement(Index gw_level,
175 double frequency) const = 0;
179 virtual Eigen::VectorXd CalcCorrelationDiagElements(
180 Index gw_level, const Eigen::VectorXd& frequencies) const {
181 Eigen::VectorXd result(frequencies.size());
182 for (Index i = 0; i < frequencies.size(); ++i) {
183 result(i) = CalcCorrelationDiagElement(gw_level, frequencies(i));
184 }
185 return result;
186 }
187 // Calculates Sigma_c off-diagonal elements
188 virtual double CalcCorrelationOffDiagElement(Index gw_level1, Index gw_level2,
189 double frequency1,
190 double frequency2) const = 0;
191
194 void setPairContractionMemory(double block_bytes, double chunk_bytes) {
195 block_bytes_ = block_bytes;
196 chunk_bytes_ = chunk_bytes;
197 }
198
200 void setTimings(DFTTimings* timings) { timings_ = timings; }
201
202 void ResetDiagEvalCounter() const { diag_eval_counter_.store(0); }
203 std::size_t GetDiagEvalCounter() const { return diag_eval_counter_.load(); }
204
205 protected:
208 const RPA& rpa_;
210
214
218 static void FrameSums(const Eigen::MatrixXd& a, const Eigen::VectorXd& omegas,
219 const Eigen::VectorXd& nu, ScreeningData& data);
220
221 void CountDiagEval() const { diag_eval_counter_.fetch_add(1); }
222
228 Eigen::MatrixXd PairContraction(
229 Index nrows,
230 const std::function<void(Index, Eigen::MatrixXd&)>& makeX) const;
231
232 private:
233 double block_bytes_ = 4e9;
234 double chunk_bytes_ = 5e8;
235 mutable std::atomic<std::size_t> diag_eval_counter_{0};
236};
237} // namespace xtp
238} // namespace votca
239
240#endif // VOTCA_XTP_SIGMA_BASE_H
Wall-clock accounting for the parts of a DFT run.
Definition dfttimings.h:45
void setTimings(DFTTimings *timings)
Times the parts of PrepareScreening in these timings (optional).
Definition sigma_base.h:200
virtual std::string ScreeningSummary() const
One line about the screening just prepared (empty if nothing to say).
Definition sigma_base.h:131
virtual bool HasPoleForm() const
Definition sigma_base.h:148
std::atomic< std::size_t > diag_eval_counter_
Definition sigma_base.h:235
Eigen::MatrixXd CalcHartreeMatrix(const Eigen::MatrixXd &R=Eigen::MatrixXd()) const
void setPairContractionMemory(double block_bytes, double chunk_bytes)
Definition sigma_base.h:194
Sigma_base(TCMatrix_gwbse &Mmn, const RPA &rpa)
Definition sigma_base.h:40
static void FrameSums(const Eigen::MatrixXd &a, const Eigen::VectorXd &omegas, const Eigen::VectorXd &nu, ScreeningData &data)
Definition sigma_base.cc:98
std::size_t GetDiagEvalCounter() const
Definition sigma_base.h:203
virtual Eigen::MatrixXd CalcCorrelationOffDiag(const Eigen::VectorXd &frequencies) const
virtual double CalcCorrelationDiagElementDerivative(Index gw_level, double frequency) const =0
Eigen::MatrixXd CalcCorrelationSRG(const Eigen::VectorXd &frequencies, double s) const
DFTTimings * timings_
Definition sigma_base.h:209
virtual ScreeningData ScreeningDump(const Eigen::VectorXd &nu) const
Definition sigma_base.cc:92
virtual double CalcCorrelationOffDiagElement(Index gw_level1, Index gw_level2, double frequency1, double frequency2) const =0
virtual DiagPoleForm PoleForm(Index gw_level) const
Definition sigma_base.cc:86
void configure(options opt)
Definition sigma_base.h:56
virtual double CalcCorrelationDiagElement(Index gw_level, double frequency) const =0
virtual void PrepareScreening()=0
void setKeepScreeningData(bool keep)
Definition sigma_base.h:169
virtual bool HasOffDiagonal() const
False if CalcCorrelationOffDiag only returns zeros (CDA).
Definition sigma_base.h:133
Eigen::MatrixXd PairContraction(Index nrows, const std::function< void(Index, Eigen::MatrixXd &)> &makeX) const
Definition sigma_base.cc:41
virtual ~Sigma_base()=default
Eigen::VectorXd CalcCorrelationDiag(const Eigen::VectorXd &frequencies) const
TCMatrix_gwbse & Mmn_
Definition sigma_base.h:207
Eigen::MatrixXd CalcReactionFieldMatrix(const Eigen::MatrixXd &R) const
Static self-energy of an environment reaction field: the COH+SEX pair for v_reac, in the QP window.
Eigen::MatrixXd CalcExchangeMatrix() const
void CountDiagEval() const
Definition sigma_base.h:221
void ResetDiagEvalCounter() const
Definition sigma_base.h:202
virtual Eigen::VectorXd CalcCorrelationDiagElements(Index gw_level, const Eigen::VectorXd &frequencies) const
Definition sigma_base.h:179
Provides a means for comparing floating point numbers.
Definition basebead.h:33
Eigen::Index Index
Definition types.h:26
Pole sums of the exact (RPA spectral) correlation self-energy.