MADNESS 0.10.1
zcis.h
Go to the documentation of this file.
1/*
2 * Complexcis.h
3 *
4 * Created on: 21 Nov 2018
5 * Author: fbischoff
6 */
7
8#ifndef SRC_APPS_CHEM_ZCIS_H_
9#define SRC_APPS_CHEM_ZCIS_H_
10
12#include<madness/mra/mra.h>
13#include<tuple>
15
16
17namespace madness {
18
19
20
22public:
23
24 /// ctor reading out the input file
26 read_input_and_commandline_options(world,parser,"response");
27 }
28
30
31 /// the parameters with the enum key, the constructor taking the input file key and a default value
32 initialize<std::string>("guess_excitation_operators","dipole+");
33 initialize<std::vector<std::string> >("exops",{"x 1.0","y 1.0","z 1.0","x 2.0 , y 2.0 , z 2.0"});
34 initialize<int>("freeze",0);
35 initialize<int>("guess_excitations",4);
36 initialize<int>("guess_maxiter",4);
37 initialize<double>("thresh",FunctionDefaults<3>::get_thresh());
38 initialize<double>("omega",0.0);
39 initialize<int>("maxiter",10);
40 initialize<bool>("swap_ab",false);
41 initialize<double>("dconv",1.e-3);
42 initialize<int>("printlevel",1);
43
44 }
45
46 std::string get_tag() const override {
47 return std::string("response");
48 }
49
50
51 std::string guess_excitation_operators() const {return get<std::string>("guess_excitation_operators");};
52 std::vector<std::string> exops() const {return get<std::vector<std::string> >("exops");};
53 int freeze() const {return get<int>("freeze");};
54 int guess_excitations() const {return get<int>("guess_excitations");};
55 double thresh() const {return get<double>("thresh");};
56 double omega() const {return get<double>("omega");};
57 int maxiter() const {return get<int>("maxiter");};
58 int guess_maxiter() const {return get<int>("guess_maxiter");};
59 bool swap_ab() const {return get<bool>("swap_ab");};
60 double dconv() const {return get<double>("dconv");};
61 int printlevel() const {return get<int>("printlevel");};
62
63
64};
65
66
67class Zcis : public QCPropertyInterface {
68public:
69
70 struct root {
71 std::vector<complex_function_3d> afunction;
72 std::vector<complex_function_3d> bfunction;
73 std::vector<complex_function_3d> apot;
74 std::vector<complex_function_3d> bpot;
75 double omega=0.0;
76 double delta=1.e3; // last wave function error
77 double energy_change=1.e3; // last energy_change
78
79 /// inner product for the KAIN solver
80 friend
81 double_complex inner(const root& f, const root& g){
82 MADNESS_ASSERT(f.afunction.size()==g.afunction.size());
83 MADNESS_ASSERT(f.bfunction.size()==g.bfunction.size());
84 double_complex result=inner(f.afunction,g.afunction) + inner(f.bfunction,g.bfunction);
85 return result;
86 }
87
88
89 };
90
91 static std::vector<root> transform(World& world,
92 const std::vector<root>& v,
94 bool fence=true) {
95
96 int n = v.size(); // n is the old dimension
97 int m = c.dim(1); // m is the new dimension
98
99 int nocca=v.front().afunction.size();
100 int noccb=v.front().bfunction.size();
101
102 std::vector<root> result(m);
103
104 for (auto&& r : result) {
105 r.afunction= zero_functions_compressed<double_complex,3>(world, nocca, false);
106 r.bfunction= zero_functions_compressed<double_complex,3>(world, noccb, false);
107 r.apot= zero_functions_compressed<double_complex,3>(world, nocca, false);
108 r.bpot= zero_functions_compressed<double_complex,3>(world, noccb, false);
109 }
110 for (auto&& vv : v) {
111 compress(world, vv.afunction,false);
112 compress(world, vv.bfunction,false);
113 compress(world, vv.apot,false);
114 compress(world, vv.bpot,false);
115 }
116 world.gop.fence();
117
118 for (int i=0; i<m; ++i) {
119 for (int j=0; j<n; ++j) {
120 gaxpy(world,double_complex(1.0),result[i].afunction,c(j,i),v[j].afunction,false);
121 gaxpy(world,double_complex(1.0),result[i].bfunction,c(j,i),v[j].bfunction,false);
122 if (v[j].apot.size()>0) gaxpy(world,double_complex(1.0),result[i].apot,c(j,i),v[j].apot,false);
123 if (v[j].bpot.size()>0) gaxpy(world,double_complex(1.0),result[i].bpot,c(j,i),v[j].bpot,false);
124 }
125 }
126
127 if (fence) world.gop.fence();
128 return result;
129 }
130
131
132
133 Zcis(World& w, const commandlineparser& parser, std::shared_ptr<Znemo> n) : world(w), cis_param(world, parser), nemo(n),
134 Qa(nemo->amo,nemo->amo), Qb(nemo->bmo,nemo->bmo) {
135 cis_param.print("response","end");
136 print("Qa projector",Qa.get_ket_vector().size());
137 print("Qb projector",Qb.get_ket_vector().size());
138
139 }
140
141 virtual ~Zcis() {};
142
143 double value();
144
145 static void help() {
146 print_header2("help page for ZCIS");
147 print("The zcis code computes excited states for a znemo calculation in the CIS approximation");
148 print("\nYou can print all available calculation parameters by running\n");
149 print("zcis --print_parameters\n");
150 print("You can perform a simple calculation by running\n");
151 print("zcis --geometry=h2o.xyz\n");
152 print("provided you have an xyz file in your directory.");
153
154 }
155
156 static void print_parameters() {
158 print("The zcis program requires converged znemo orbitals");
159 print("\ndefault parameters for the response part of the zcis program are");
160 param.print("response","end");
161 print("\n\nthe molecular geometry must be specified in a separate block:");
163 }
164
165
166 std::string name() const {return "zcis";};
167
168 virtual bool selftest() {
169 return true;
170 };
171 void iterate(std::vector<root>& roots) const;
172
173 void compute_potentials(std::vector<root>& roots, const real_function_3d& totdens) const;
174
175 std::vector<complex_function_3d> compute_residuals(root& root) const;
176
177 std::vector<root> read_guess() const;
178
179 void save_guess(const std::vector<root>& roots) const;
180
181 std::vector<root> make_guess() const;
182
183 void canonicalize(const std::vector<complex_function_3d>& mo, const real_function_3d& density,
184 std::vector<complex_function_3d>& virtuals, Tensor<double>& veps) const;
185
187
188 Tensor<double_complex> compute_fock_pt(const std::vector<root>& roots) const;
189
190
191 /// return the active orbitals only
193 if (eps.size()<=cis_param.freeze()) return Tensor<double>();
194 return eps(Slice(cis_param.freeze(),-1,1));
195 }
196
197 /// return the active orbitals only
198 std::vector<complex_function_3d> active_mo(const std::vector<complex_function_3d>& mo) const {
199 if (mo.size()<=size_t(cis_param.freeze())) return std::vector<complex_function_3d> ();
200 std::vector<complex_function_3d> result;
201 result.insert(result.end(),mo.begin()+cis_param.freeze(),mo.end());
202 return result;
203 }
204
205 /// little helper function
206 template<typename T>
207 static Tensor<T> concatenate(const Tensor<T>& t1, const Tensor<T>& t2) {
208 MADNESS_ASSERT(t1.ndim()==1 or t1.size()==0);
209 MADNESS_ASSERT(t2.ndim()==1 or t2.size()==0);
210 Tensor<T> result(t1.size()+t2.size());
211 if (t1.size()>0) result(Slice(0,t1.size()-1,1))=t1; // slices count inclusive
212 if (t2.size()>0) result(Slice(t1.size(),-1,1))=t2;
213 return result;
214 }
215
216 template<typename T>
217 static std::tuple<Tensor<T>, Tensor<T> > split(const Tensor<T>& rhs, int dim1) {
218
219 MADNESS_ASSERT(dim1>=0 and dim1<=rhs.size());
220 if (dim1==0) return std::make_tuple(Tensor<T>(),rhs);
221 if (dim1==rhs.size()) return std::make_tuple(rhs,Tensor<T>());
222
223 Tensor<T> t1=rhs(Slice(0,dim1-1,1));
224 Tensor<T> t2=rhs(Slice(dim1,-1,1));
225 return std::make_tuple(t1,t2);
226 }
227
228 void orthonormalize(std::vector<root>& roots, const Tensor<double_complex>& fock_pt_a) const;
229
230 void orthonormalize(std::vector<root>& roots) const;
231
232 void normalize(std::vector<root>& roots) const;
233
234 void compare_to_file(const std::vector<complex_function_3d>& rhs, const std::string name) const {
235 if (nemo->get_calc_param().spin_restricted()) {
236 save_function(rhs,name);
237
238 } else {
239 std::vector<complex_function_3d> rhs_file=zero_functions_compressed<double_complex,3>(world,rhs.size());
240 std::vector<complex_function_3d> rhs_file1;
241 load_function(world,rhs_file1,name);
242 for (size_t i=0; i<rhs_file1.size(); ++i) rhs_file[i]=rhs_file1[i];
243 std::vector<double> dnorm=norm2s(world,rhs-rhs_file);
244 print(name,"diffnorm",dnorm);
245 }
246 }
247
248
249 static std::tuple<std::vector<complex_function_3d>, std::vector<complex_function_3d> >
250 split(const std::vector<complex_function_3d>& rhs, int dim1) {
251
252 MADNESS_ASSERT(dim1>=0 and size_t(dim1)<=rhs.size());
253 if (dim1==0) return std::make_tuple(std::vector<complex_function_3d>(),rhs);
254 if (size_t(dim1)==rhs.size()) return std::make_tuple(rhs,std::vector<complex_function_3d>());
255
256 std::vector<complex_function_3d> t1,t2;
257 copy(rhs.begin(),rhs.begin()+dim1,back_inserter(t1));
258 copy(rhs.begin()+dim1,rhs.end(),back_inserter(t2));
259
260 return std::make_tuple(t1,t2);
261 }
262
263 /// the world
265
266 /// the parameters
268
269 /// the reference
270 std::shared_ptr<Znemo> nemo;
271
272 /// orthogonality projector
274
275 /// the x vectors
276 std::vector<root> roots;
277
278};
279
280} /* namespace madness */
281
282#endif /* SRC_APPS_CHEM_ZCIS_H_ */
double w(double t, double eps)
Definition DKops.h:22
std::complex< double > double_complex
Definition cfft.h:14
long ndim() const
Returns the number of dimensions in the tensor.
Definition basetensor.h:144
long size() const
Returns the number of elements in the tensor.
Definition basetensor.h:138
int guess_maxiter() const
Definition zcis.h:58
int guess_excitations() const
Definition zcis.h:54
std::vector< std::string > exops() const
Definition zcis.h:52
std::string guess_excitation_operators() const
Definition zcis.h:51
double dconv() const
Definition zcis.h:60
std::string get_tag() const override
Definition zcis.h:46
bool swap_ab() const
Definition zcis.h:59
Complex_CIS_Parameters(World &world, const commandlineparser &parser)
ctor reading out the input file
Definition zcis.h:25
double omega() const
Definition zcis.h:56
int freeze() const
Definition zcis.h:53
int maxiter() const
Definition zcis.h:57
Complex_CIS_Parameters()
Definition zcis.h:29
double thresh() const
Definition zcis.h:55
int printlevel() const
Definition zcis.h:61
FunctionDefaults holds default paramaters as static class members.
Definition funcdefaults.h:100
static void print_parameters()
Definition molecule.cc:115
class for holding the parameters for calculation
Definition QCCalculationParametersBase.h:294
virtual void read_input_and_commandline_options(World &world, const commandlineparser &parser, const std::string tag)
Definition QCCalculationParametersBase.h:330
void print(const std::string header="", const std::string footer="") const
print all parameters
Definition QCCalculationParametersBase.cc:22
class implementing properties of QC models
Definition QCPropertyInterface.h:11
virtual real_function_3d density() const
Definition QCPropertyInterface.h:25
orthogonality projector
Definition projector.h:186
vecfuncT get_ket_vector() const
Definition projector.h:243
A slice defines a sub-range or patch of a dimension.
Definition slice.h:103
A tensor is a multidimensional array.
Definition tensor.h:317
void fence(bool debug=false)
Synchronizes all processes in communicator AND globally ensures no pending AM or tasks.
Definition worldgop.cc:161
A parallel world class.
Definition world.h:132
ProcessID size() const
Returns the number of processes in this World (same as MPI_Comm_size()).
Definition world.h:330
WorldGopInterface & gop
Global operations.
Definition world.h:207
Definition zcis.h:67
std::vector< root > make_guess() const
Definition madness/chem/zcis.cc:345
void compute_potentials(std::vector< root > &roots, const real_function_3d &totdens) const
Definition madness/chem/zcis.cc:152
virtual ~Zcis()
Definition zcis.h:141
virtual bool selftest()
Definition zcis.h:168
Tensor< double_complex > make_CIS_matrix(const Tensor< double > &veps, const Tensor< double > &oeps) const
Definition madness/chem/zcis.cc:511
static void print_parameters()
Definition zcis.h:156
QProjector< double_complex, 3 > Qa
orthogonality projector
Definition zcis.h:273
Tensor< double > noct(const Tensor< double > &eps) const
return the active orbitals only
Definition zcis.h:192
void canonicalize(const std::vector< complex_function_3d > &mo, const real_function_3d &density, std::vector< complex_function_3d > &virtuals, Tensor< double > &veps) const
Definition madness/chem/zcis.cc:491
static Tensor< T > concatenate(const Tensor< T > &t1, const Tensor< T > &t2)
little helper function
Definition zcis.h:207
std::vector< complex_function_3d > active_mo(const std::vector< complex_function_3d > &mo) const
return the active orbitals only
Definition zcis.h:198
double value()
Definition madness/chem/zcis.cc:14
static std::tuple< std::vector< complex_function_3d >, std::vector< complex_function_3d > > split(const std::vector< complex_function_3d > &rhs, int dim1)
Definition zcis.h:250
static std::tuple< Tensor< T >, Tensor< T > > split(const Tensor< T > &rhs, int dim1)
Definition zcis.h:217
Complex_CIS_Parameters cis_param
the parameters
Definition zcis.h:267
static void help()
Definition zcis.h:145
void normalize(std::vector< root > &roots) const
Definition madness/chem/zcis.cc:599
std::string name() const
Definition zcis.h:166
Tensor< double_complex > compute_fock_pt(const std::vector< root > &roots) const
Definition madness/chem/zcis.cc:219
void iterate(std::vector< root > &roots) const
iterate the roots
Definition madness/chem/zcis.cc:32
void orthonormalize(std::vector< root > &roots, const Tensor< double_complex > &fock_pt_a) const
Definition madness/chem/zcis.cc:541
std::vector< root > roots
the x vectors
Definition zcis.h:276
World & world
the world
Definition zcis.h:264
Zcis(World &w, const commandlineparser &parser, std::shared_ptr< Znemo > n)
Definition zcis.h:133
std::vector< complex_function_3d > compute_residuals(root &root) const
Definition madness/chem/zcis.cc:244
static std::vector< root > transform(World &world, const std::vector< root > &v, const Tensor< double_complex > &c, bool fence=true)
Definition zcis.h:91
std::vector< root > read_guess() const
Definition madness/chem/zcis.cc:303
void compare_to_file(const std::vector< complex_function_3d > &rhs, const std::string name) const
Definition zcis.h:234
QProjector< double_complex, 3 > Qb
Definition zcis.h:273
std::shared_ptr< Znemo > nemo
the reference
Definition zcis.h:270
void save_guess(const std::vector< root > &roots) const
Definition madness/chem/zcis.cc:326
static const double v
Definition hatom_sf_dirac.cc:20
#define MADNESS_ASSERT(condition)
Assert a condition that should be free of side-effects since in release builds this might be a no-op.
Definition madness_exception.h:134
Main include file for MADNESS and defines Function interface.
Namespace for all elements and tools of MADNESS.
Definition DFParameters.h:10
void save_function(const std::vector< Function< T, NDIM > > &f, const std::string name)
save a vector of functions
Definition vmra.h:2295
void print_header2(const std::string &s)
medium section heading
Definition print.cc:54
std::vector< double > norm2s(World &world, const std::vector< Function< T, NDIM > > &v)
Computes the 2-norms of a vector of functions.
Definition vmra.h:845
void compress(World &world, const std::vector< Function< T, NDIM > > &v, bool fence=true)
Compress a vector of functions.
Definition vmra.h:149
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:225
NDIM & f
Definition mra.h:2481
NDIM const Function< R, NDIM > & g
Definition mra.h:2481
void load_function(World &world, std::vector< Function< T, NDIM > > &f, const std::string name)
load a vector of functions
Definition vmra.h:2283
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:2066
void gaxpy(const double a, ScalarResult< T > &left, const double b, const T &right, const bool fence=true)
the result type of a macrotask must implement gaxpy
Definition macrotaskq.h:245
static const double c
Definition relops.cc:10
static const double m
Definition relops.cc:9
Definition zcis.h:70
std::vector< complex_function_3d > afunction
Definition zcis.h:71
double omega
Definition zcis.h:75
friend double_complex inner(const root &f, const root &g)
inner product for the KAIN solver
Definition zcis.h:81
double delta
Definition zcis.h:76
std::vector< complex_function_3d > bpot
Definition zcis.h:74
std::vector< complex_function_3d > apot
Definition zcis.h:73
std::vector< complex_function_3d > bfunction
Definition zcis.h:72
double energy_change
Definition zcis.h:77
very simple command line parser
Definition commandlineparser.h:15
InputParameters param
Definition tdse.cc:203