MADNESS 0.10.1
CalculationParameters.h
Go to the documentation of this file.
1/*
2 This file is part of MADNESS.
3
4 Copyright (C) 2007,2010 Oak Ridge National Laboratory
5
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2 of the License, or
9 (at your option) any later version.
10
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
19
20 For more information please contact:
21
22 Robert J. Harrison
23 Oak Ridge National Laboratory
24 One Bethel Valley Road
25 P.O. Box 2008, MS-6367
26
27 email: harrisonrj@ornl.gov
28 tel: 865-241-3937
29 fax: 865-572-0680
30
31
32 $Id$
33 */
34
35/// \file CalculationParameters
36/// \brief solution parameters for SCF calculations
37
38
39
40#ifndef MADNESS_CHEM_CALCULATIONPARAMETERS_H__INCLUDED
41#define MADNESS_CHEM_CALCULATIONPARAMETERS_H__INCLUDED
42
47
48
49namespace madness {
50
52 static constexpr char const* tag = "dft";
53
55
57 read_input_and_commandline_options(world, parser, "dft");
58 // convenience option -- needs to be moved to the MolecularOptimizer class
59 if (parser.key_exists("optimize")) set_user_defined_value("gopt",true);
60 std::string inputfile=parser.value("input");
61 // std::string prefix=commandlineparser::remove_extension(commandlineparser::base_name(inputfile));
62 // if (prefix!="input") set_derived_value("prefix",prefix);
63 }
64
65 /// ctor reading out the input file
67 initialize<std::string>("prefix","mad","prefixes your output/restart/json/plot/etc files");
68 initialize<double>("charge",0.0,"total molecular charge");
69 initialize<std::string> ("xc","hf","XC input line");
70 initialize<std::string> ("hfexalg","multiworld_row","hf exchange algorithm",{"multiworld","multiworld_row","fetch_compute","smallmem","largemem"});
71 initialize<std::vector<std::string>>("memory",{"storefunction","nodereplicated","distributed"},"memory algorithm for storing functions (storing,cloud,target)");
72 initialize<double>("smear",0.0,"smearing parameter");
73 initialize<double>("econv",1.e-5,"energy convergence");
74 initialize<double>("dconv",1.e-4,"density convergence");
75 initialize<std::vector<std::string> >("convergence_criteria",{"bsh_residual","total_energy"},"possible values are: bsh_residual, total_energy, each_energy, density");
76 initialize<int> ("k",-1,"polynomial order");
77 initialize<double>("l",20,"user coordinates box size");
78 initialize<std::string>("deriv","abgv","derivative method",{"abgv","bspline","ble"});
79 initialize<std::string>("dft_deriv","abgv","derivative method for gga potentials",{"abgv","bspline","ble"});
80 initialize<double>("maxrotn",0.25,"step restriction used in autoshift algorithm");
81 initialize<int> ("nvalpha",0,"number of alpha virtuals to compute");
82 initialize<int> ("nvbeta",0,"number of beta virtuals to compute");
83 initialize<int> ("nopen",0,"number of unpaired electrons = nalpha-nbeta");
84 initialize<int> ("maxiter",25,"maximum number of iterations");
85 initialize<int> ("nio",1,"no. of io servers to use");
86 initialize<bool> ("spin_restricted",true,"true if spin restricted");
87 initialize<int> ("plotlo",0,"range of MOs to print (for both spins if polarized");
88 initialize<int> ("plothi",-1,"range of MOs to print (for both spins if polarized");
89 initialize<bool> ("plotdens",false,"If true print the density at convergence");
90 initialize<bool> ("plotcoul",false,"If true plot the total coulomb potential at convergence");
91 initialize<bool> ("plotcube",false,"If true also write Gaussian .cube files (for Avogadro/VMD) alongside .dx");
92 initialize<std::string> ("localize","new","localization method",{"pm","boys","new","canon"});
93 initialize<std::string> ("pointgroup","c1","use point (sub) group symmetry if not localized",{"c1","c2","ci","cs","c2v","c2h","d2","d2h"});
94 initialize<bool> ("restart",false,"if true restart from orbitals on disk");
95 initialize<bool> ("restartao",false,"if true restart from orbitals projected into AO basis (STO3G) on disk");
96 initialize<bool> ("no_compute",false,"if true use orbitals on disk, set value to computed");
97 initialize<bool> ("save",true,"if true save orbitals to disk");
98 initialize<int> ("maxsub",10,"size of iterative subspace ... set to 0 or 1 to disable");
99 initialize<double> ("orbitalshift",0.0,"scf orbital shift: shift the occ orbitals to lower energies");
100 initialize<int> ("npt_plot",101,"no. of points to use in each dim for plots");
101// initialize<Tensor<double> > ("plot_cell",Tensor<double>(),"lo hi in each dimension for plotting (default is all space)");
102 initialize<std::vector<double> > ("plot_cell",std::vector<double>(),"lo hi in each dimension for plotting (default is all space)");
103 initialize<std::string> ("aobasis","6-31g","AO basis used for initial guess (6-31gss, 6-31g, 3-21g, sto-6g, sto-3g)");
104 initialize<bool> ("derivatives",false,"if true calculate nuclear derivatives");
105 initialize<bool> ("dipole",false,"if true calculate dipole moment");
106 initialize<bool> ("conv_only_dens",false,"if true remove bsh_residual from convergence criteria (deprecated)");
107 initialize<bool> ("psp_calc",false,"pseudopotential calculation for all atoms");
108 initialize<std::string> ("pcm_data","none","do a PCM (solvent) calculation");
109 initialize<std::string> ("ac_data","none","do a calculation with asymptotic correction (see ACParameters class in chem/AC.h for details)");
110 initialize<bool> ("pure_ae",true,"pure all electron calculation with no pseudo-atoms");
111 initialize<int> ("print_level",3,"0: no output; 1: final energy; 2: iterations; 3: timings; 10: debug");
112 initialize<std::string> ("molecular_structure","inputfile","where to read the molecule from: inputfile or name from the library");
113
114 // Next list inferred parameters
115 initialize<int> ("nalpha",-1,"number of alpha spin electrons");
116 initialize<int> ("nbeta",-1,"number of beta spin electrons");
117 initialize<int> ("nmo_alpha",-1,"number of alpha spin molecular orbitals");
118 initialize<int> ("nmo_beta",-1,"number of beta spin molecular orbitals");
119 initialize<double> ("lo",1.e-10,"smallest length scale we need to resolve");
120 initialize<std::vector<double> > ("protocol",{1.e-4,1.e-6},"calculation protocol");
121
122 // geometry optimization parameters
123 // @TODO: need to be moved to molecular optimizer class
124 initialize<bool> ("gopt",false,"geometry optimizer");
125 initialize<double> ("gtol",1.e-4,"geometry tolerance");
126 initialize<bool> ("gtest",false,"geometry tolerance");
127 initialize<double> ("gval",1.e-5,"value precision");
128 initialize<double> ("gprec",1.e-4,"gradient precision");
129 initialize<int> ("gmaxiter",20,"optimization maxiter");
130 initialize<bool> ("ginitial_hessian",false,"compute inital hessian for optimization");
131 initialize<std::string> ("algopt","bfgs","algorithm used for optimization",{"bfgs","cg"});
132 initialize<int> ("nv_factor",1,"factor to multiply number of virtual orbitals with when automatically decreasing nvirt");
133 initialize<int> ("vnucextra",2,"load balance parameter for nuclear pot");
134 initialize<int> ("loadbalparts",2,"??");
135
136 //Keyword to use nwchem output for initial guess
137 initialize<std::string> ("nwfile","none","Base name of nwchem output files (.out and .movecs extensions) to read from");
138
139 }
140
141 std::string get_tag() const override {
142 return tag;
143 }
144
145 public:
147
148 std::string prefix() const {return get<std::string>("prefix");}
149
150 double econv() const {return get<double>("econv");}
151 double dconv() const {return get<double>("dconv");}
152
153 bool converge_density() const {
154 std::vector<std::string> criteria=get<std::vector<std::string> >("convergence_criteria");
155 return std::find(criteria.begin(),criteria.end(),"density")!=criteria.end();
156 }
158 std::vector<std::string> criteria=get<std::vector<std::string> >("convergence_criteria");
159 return std::find(criteria.begin(),criteria.end(),"bsh_residual")!=criteria.end();
160 }
162 std::vector<std::string> criteria=get<std::vector<std::string> >("convergence_criteria");
163 return std::find(criteria.begin(),criteria.end(),"total_energy")!=criteria.end();
164 }
165 bool converge_each_energy() const {
166 std::vector<std::string> criteria=get<std::vector<std::string> >("convergence_criteria");
167 return std::find(criteria.begin(),criteria.end(),"each_energy")!=criteria.end();
168 }
169
170 int nopen() const {return get<int>("nopen");}
171 int nalpha() const {return get<int>("nalpha");}
172 int nbeta() const {return get<int>("nbeta");}
173
174 int nvalpha() const {return get<int>("nvalpha");}
175 int nvbeta() const {return get<int>("nvbeta");}
176 int nv_factor() const {return get<int>("nv_factor");}
177
178 int nmo_alpha() const {return get<int>("nmo_alpha");}
179 int nmo_beta() const {return get<int>("nmo_beta");}
180
181 bool have_beta() const {return (nbeta()>0) and (not spin_restricted());}
182
183 bool spin_restricted() const {return get<bool>("spin_restricted");}
184 bool no_compute() const {return get<bool>("no_compute");}
185
186 double lo() const {return get<double>("lo");}
187 double L() const {return get<double>("l");}
188 int k() const {return get<int>("k");}
189
190 std::string localize_method() const {return get<std::string>("localize");}
191 bool do_localize() const {return (localize_method()!="canon");}
192 bool localize_pm() const {return (localize_method()=="pm");}
193
194 std::string pointgroup() const {return get<std::string>("pointgroup");}
195 bool do_symmetry() const {return (pointgroup()!="c1");}
196 double charge() const {return get<double>("charge");}
197 int print_level() const {return get<int>("print_level");}
198
199 int maxiter() const {return get<int>("maxiter");}
200 double orbitalshift() const {return get<double>("orbitalshift");}
201
202 std::string deriv() const {return get<std::string>("deriv");}
203 std::string dft_deriv() const {return get<std::string>("dft_deriv");}
204 std::string pcm_data() const {return get<std::string>("pcm_data");}
205 std::string ac_data() const {return get<std::string>("ac_data");}
206 std::string xc() const {return get<std::string>("xc");}
207 std::string hfexalg() const {return get<std::string>("hfexalg");}
208
209 std::vector<std::string> memory() const {return get<std::vector<std::string>>("memory");}
210
211 std::string aobasis() const {return get<std::string>("aobasis");}
212
213 std::vector<double> protocol() const {return get<std::vector<double> >("protocol");}
214 bool save() const {return get<bool>("save");}
215 bool restart() const {return get<bool>("restart");}
216 bool restartao() const {return get<bool>("restartao");}
217 bool restart_cphf() const {return get<bool>("restart_cphf");}
218
219 int maxsub() const {return get<int>("maxsub");}
220 double maxrotn() const {return get<double>("maxrotn");}
221
222 int vnucextra() const {return get<int>("vnucextra");}
223 int loadbalparts() const {return get<int>("loadbalparts");}
224
225
226 bool derivatives() const {return get<bool>("derivatives");}
227 bool dipole() const {return get<bool>("dipole");}
228
229 bool gopt() const {return get<bool>("gopt");}
230 std::string algopt() const {return get<std::string>("algopt");}
231 int gmaxiter() const {return get<int>("gmaxiter");}
232 double gtol() const {return get<double>("gtol");}
233 double gval() const {return get<double>("gval");}
234 double gprec() const {return get<double>("gprec");}
235 bool ginitial_hessian() const {return get<bool>("ginitial_hessian");}
236
237 std::string nwfile() const {return get<std::string>("nwfile");}
238
240 std::vector<double> vcell=get<std::vector<double> >("plot_cell");
241 if (vcell.size()==0) return Tensor<double>();
242 Tensor<double> cell(3,2);
243 cell(0,0)=vcell[0];
244 cell(0,1)=vcell[1];
245 cell(1,0)=vcell[2];
246 cell(1,1)=vcell[3];
247 cell(2,0)=vcell[4];
248 cell(2,1)=vcell[5];
249 return cell;
250 }
251
252
254
255 for (size_t iatom = 0; iatom < molecule.natom(); iatom++) {
256 if (molecule.get_pseudo_atom(iatom)){
257 set_derived_value("pure_ae",false);
258 continue;
259 }
260 }
261 set_derived_value("aobasis",molecule.guess_file());;
262 const int n_core = molecule.n_core_orb_all();
263
264
265 std::vector<double> proto=get<std::vector<double> >("protocol");
266 // No ... The accuracy of computation is INDEPENDENT of the convergence requirement
267 // --- actually need more precision than convergence threshold in order to have
268 // variational principle working and for robust convergence
269 //proto.back()=get<double>("econv");
270 set_derived_value("protocol",proto);
271 // No ... the energy is variational! Don't need more accuracy in dconv --- in fact the opposite is true.
272 // set_derived_value("dconv",sqrt(get<double>("econv"))*0.1);
273
274 double z = molecule.total_nuclear_charge();
275 const double charge=get<double>("charge");
276 int nelec = int(z - charge - n_core*2);
277 if (fabs(nelec+charge+n_core*2-z) > 1e-6) {
278 error("non-integer number of electrons?", nelec+charge+n_core*2-z);
279 }
280
281 set_derived_value("nalpha",(nelec + nopen())/2);
282 set_derived_value("nbeta",(nelec - nopen())/2);
283
284 if (nalpha() < 0) error("negative number of alpha electrons?", nalpha());
285 if (nbeta() < 0) error("negative number of beta electrons?", nbeta());
286 if ((nalpha()+nbeta()) != nelec) error("nalpha+nbeta != nelec", nalpha()+nbeta());
287 if (nalpha() != nbeta()) set_derived_value("spin_restricted",false);
288
289 set_derived_value("nmo_alpha",nalpha() + nvalpha());
290 set_derived_value("nmo_beta",nbeta() + nvbeta());
291
292 // Unless overridden by the user use a cell big enough to
293 // have exp(-sqrt(2*I)*r) decay to 1e-6 with I=1ev=0.037Eh
294 // --> need 50 a.u. either side of the molecule
295 set_derived_value("l",molecule.bounding_cube() + 50.0);
296
297 //set_derived_value("lo",molecule.smallest_length_scale());
298
299 // set highest possible point group for symmetry
300 if (do_localize()) set_derived_value("pointgroup",std::string("c1"));
301 else set_derived_value("pointgroup",molecule.get_pointgroup());
302
303 // above two lines will not override user input, so check input is sane
304 if (do_localize() and do_symmetry()) {
305 error("\n\nsymmetry and localization cannot be used at the same time\n"
306 "switch from local to canonical orbitals (keyword canon)\n\n");
307 }
308
309 //NWChem interface doesn't support geometry optimization
310 if (get<bool>("gopt") && nwfile() != "none") error("NWchem initialization only supports single point energy calculations.");
311
312 //NWChem only supports Boys localization (or canonical)
313 if (nwfile() != "none") {
314 set_derived_value("localize",std::string("boys"));
315 //Error if user requested something other than Boys
316 if(localize_method() != "boys" and localize_method() != "canon") error("NWchem initialization only supports Boys localization");
317 }
318 }
319};
320
321
322} // namespace madness
323
324#endif /* MADNESS_CHEM_CALCULATIONPARAMETERS_H__INCLUDED */
Definition molecule.h:129
class for holding the parameters for calculation
Definition chem/QCCalculationParametersBase.h:296
void read_input_and_commandline_options(World &world, const commandlineparser &parser, const std::string tag)
Definition chem/QCCalculationParametersBase.h:332
void set_user_defined_value(const std::string &key, const T &value)
Definition chem/QCCalculationParametersBase.h:542
void set_derived_value(const std::string &key, const T &value)
Definition chem/QCCalculationParametersBase.h:429
A tensor is a multidimensional array.
Definition tensor.h:318
A parallel world class.
Definition world.h:132
Namespace for all elements and tools of MADNESS.
Definition DFParameters.h:10
void error(const char *msg)
Definition world.cc:143
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
Definition test_QCCalculationParametersBase.cc:62
Definition CalculationParameters.h:51
double gval() const
Definition CalculationParameters.h:233
bool converge_each_energy() const
Definition CalculationParameters.h:165
std::vector< double > protocol() const
Definition CalculationParameters.h:213
double charge() const
Definition CalculationParameters.h:196
CalculationParameters(const CalculationParameters &other)=default
void read_input_and_commandline_options(World &world, const commandlineparser &parser, const std::string tag)
Definition chem/QCCalculationParametersBase.h:332
bool converge_density() const
Definition CalculationParameters.h:153
int nv_factor() const
Definition CalculationParameters.h:176
bool do_symmetry() const
Definition CalculationParameters.h:195
bool localize_pm() const
Definition CalculationParameters.h:192
bool gopt() const
Definition CalculationParameters.h:229
void set_derived_values(const Molecule &molecule)
Definition CalculationParameters.h:253
int k() const
Definition CalculationParameters.h:188
bool converge_bsh_residual() const
Definition CalculationParameters.h:157
std::vector< std::string > memory() const
Definition CalculationParameters.h:209
CalculationParameters()
ctor reading out the input file
Definition CalculationParameters.h:66
bool converge_total_energy() const
Definition CalculationParameters.h:161
Tensor< double > plot_cell() const
Definition CalculationParameters.h:239
std::string nwfile() const
Definition CalculationParameters.h:237
static constexpr char const * tag
Definition CalculationParameters.h:52
std::string prefix() const
Definition CalculationParameters.h:148
std::string ac_data() const
Definition CalculationParameters.h:205
int nmo_alpha() const
Definition CalculationParameters.h:178
int nopen() const
Definition CalculationParameters.h:170
bool dipole() const
Definition CalculationParameters.h:227
bool save() const
Definition CalculationParameters.h:214
double dconv() const
Definition CalculationParameters.h:151
std::string algopt() const
Definition CalculationParameters.h:230
double econv() const
Definition CalculationParameters.h:150
int nvalpha() const
Definition CalculationParameters.h:174
int vnucextra() const
Definition CalculationParameters.h:222
int print_level() const
Definition CalculationParameters.h:197
std::string deriv() const
Definition CalculationParameters.h:202
bool do_localize() const
Definition CalculationParameters.h:191
std::string hfexalg() const
Definition CalculationParameters.h:207
double L() const
Definition CalculationParameters.h:187
int gmaxiter() const
Definition CalculationParameters.h:231
std::string localize_method() const
Definition CalculationParameters.h:190
bool ginitial_hessian() const
Definition CalculationParameters.h:235
int loadbalparts() const
Definition CalculationParameters.h:223
std::string aobasis() const
Definition CalculationParameters.h:211
int nalpha() const
Definition CalculationParameters.h:171
std::string dft_deriv() const
Definition CalculationParameters.h:203
int maxsub() const
Definition CalculationParameters.h:219
int nvbeta() const
Definition CalculationParameters.h:175
double gprec() const
Definition CalculationParameters.h:234
bool derivatives() const
Definition CalculationParameters.h:226
int nbeta() const
Definition CalculationParameters.h:172
int nmo_beta() const
Definition CalculationParameters.h:179
double gtol() const
Definition CalculationParameters.h:232
bool have_beta() const
Definition CalculationParameters.h:181
bool no_compute() const
Definition CalculationParameters.h:184
bool spin_restricted() const
Definition CalculationParameters.h:183
int maxiter() const
Definition CalculationParameters.h:199
double orbitalshift() const
Definition CalculationParameters.h:200
double lo() const
Definition CalculationParameters.h:186
std::string pcm_data() const
Definition CalculationParameters.h:204
bool restart() const
Definition CalculationParameters.h:215
bool restart_cphf() const
Definition CalculationParameters.h:217
bool restartao() const
Definition CalculationParameters.h:216
std::string get_tag() const override
Definition CalculationParameters.h:141
std::string pointgroup() const
Definition CalculationParameters.h:194
double maxrotn() const
Definition CalculationParameters.h:220
std::string xc() const
Definition CalculationParameters.h:206
CalculationParameters(World &world, const commandlineparser &parser)
Definition CalculationParameters.h:56
very simple command line parser
Definition commandlineparser.h:28
std::string value(const std::string key) const
Definition commandlineparser.h:84
bool key_exists(std::string key) const
Definition commandlineparser.h:80
void e()
Definition test_sig.cc:75
static Molecule molecule
Definition testperiodicdft.cc:39