source: ThirdParty/mpqc_open/src/lib/chemistry/qc/wfn/density.h@ bbc982

Action_Thermostats Add_AtomRandomPerturbation Add_RotateAroundBondAction Add_SelectAtomByNameAction Adding_Graph_to_ChangeBondActions Adding_MD_integration_tests Adding_StructOpt_integration_tests AutomationFragmentation_failures Candidate_v1.6.0 Candidate_v1.6.1 ChangeBugEmailaddress ChangingTestPorts ChemicalSpaceEvaluator Combining_Subpackages Debian_Package_split Debian_package_split_molecuildergui_only Disabling_MemDebug Docu_Python_wait EmpiricalPotential_contain_HomologyGraph_documentation Enable_parallel_make_install Enhance_userguide Enhanced_StructuralOptimization Enhanced_StructuralOptimization_continued Example_ManyWaysToTranslateAtom Exclude_Hydrogens_annealWithBondGraph FitPartialCharges_GlobalError Fix_ChronosMutex Fix_StatusMsg Fix_StepWorldTime_single_argument Fix_Verbose_Codepatterns ForceAnnealing_goodresults ForceAnnealing_oldresults ForceAnnealing_tocheck ForceAnnealing_with_BondGraph ForceAnnealing_with_BondGraph_continued ForceAnnealing_with_BondGraph_continued_betteresults ForceAnnealing_with_BondGraph_contraction-expansion GeometryObjects Gui_displays_atomic_force_velocity IndependentFragmentGrids_IntegrationTest JobMarket_RobustOnKillsSegFaults JobMarket_StableWorkerPool JobMarket_unresolvable_hostname_fix ODR_violation_mpqc_open PartialCharges_OrthogonalSummation PythonUI_with_named_parameters QtGui_reactivate_TimeChanged_changes Recreated_GuiChecks RotateToPrincipalAxisSystem_UndoRedo StoppableMakroAction Subpackage_levmar Subpackage_vmg ThirdParty_MPQC_rebuilt_buildsystem TremoloParser_IncreasedPrecision TremoloParser_MultipleTimesteps Ubuntu_1604_changes stable
Last change on this file since bbc982 was 860145, checked in by Frederik Heber <heber@…>, 8 years ago

Merge commit '0b990dfaa8c6007a996d030163a25f7f5fc8a7e7' as 'ThirdParty/mpqc_open'

  • Property mode set to 100644
File size: 8.0 KB
Line 
1//
2// density.h
3//
4// Copyright (C) 1996 Limit Point Systems, Inc.
5//
6// Author: Curtis Janssen <cljanss@limitpt.com>
7// Maintainer: LPS
8//
9// This file is part of the SC Toolkit.
10//
11// The SC Toolkit is free software; you can redistribute it and/or modify
12// it under the terms of the GNU Library General Public License as published by
13// the Free Software Foundation; either version 2, or (at your option)
14// any later version.
15//
16// The SC Toolkit is distributed in the hope that it will be useful,
17// but WITHOUT ANY WARRANTY; without even the implied warranty of
18// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19// GNU Library General Public License for more details.
20//
21// You should have received a copy of the GNU Library General Public License
22// along with the SC Toolkit; see the file COPYING.LIB. If not, write to
23// the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
24//
25// The U.S. Government is granted a limited license as per AL 91-7.
26//
27
28#ifndef _chemistry_qc_wfn_density_h
29#define _chemistry_qc_wfn_density_h
30
31#ifdef __GNUC__
32#pragma interface
33#endif
34
35#include <math/isosurf/volume.h>
36#include <chemistry/qc/wfn/wfn.h>
37#include <chemistry/qc/basis/extent.h>
38#include <chemistry/molecule/molrender.h>
39
40namespace sc {
41
42/** This is a Volume that computer the electron density. It
43 can be used to generate isodensity surfaces. */
44class ElectronDensity: public Volume {
45 protected:
46 Ref<Wavefunction> wfn_;
47 virtual void compute();
48 public:
49 ElectronDensity(const Ref<KeyVal>&);
50 ElectronDensity(const Ref<Wavefunction>&);
51 ~ElectronDensity();
52 virtual void boundingbox(double valuemin,
53 double valuemax,
54 SCVector3& p1, SCVector3& p2);
55};
56
57/** This a more highly optimized than ElectronDensity since
58 everything is precomputed. However, it cannot be used
59 if the density and/or geometry might change between
60 computations of the density or bounding box, unless the
61 obsolete member is called. */
62class BatchElectronDensity: public Volume {
63 void zero_pointers();
64 protected:
65 Ref<Wavefunction> wfn_;
66
67 Ref<GaussianBasisSet> basis_;
68
69 // shared between threads
70 double *alpha_dmat_;
71 double *beta_dmat_;
72 double *dmat_bound_;
73 ShellExtent *extent_;
74
75 // private data
76 GaussianBasisSet::ValueData *valdat_;
77 int ncontrib_;
78 int *contrib_;
79 int ncontrib_bf_;
80 int *contrib_bf_;
81 double *bs_values_;
82 double *bsg_values_;
83 double *bsh_values_;
84
85 int nshell_;
86 int nbasis_;
87 int spin_polarized_;
88 int linear_scaling_;
89 int use_dmat_bound_;
90
91 bool need_hessian_, need_gradient_;
92 bool need_basis_hessian_, need_basis_gradient_;
93
94 bool using_shared_data_;
95
96 double accuracy_;
97 virtual void init_common_data(bool initialize_density_matrices);
98 // this must be called after common data is initialized,
99 // either with init_common_data or by copying
100 virtual void init_scratch_data();
101 void compute_basis_values(const SCVector3&r);
102 void compute_spin_density(const double *dmat,
103 double *rho, double *grad, double *hess);
104
105 virtual void compute();
106 public:
107
108 /** This gives the elements of gradient arrays. */
109 enum {X=0, Y=1, Z=2};
110 /** This gives the elements of hessian arrays. */
111 enum {XX=0, YX=1, YY=2, ZX=3, ZY=4, ZZ=5};
112
113 BatchElectronDensity(const Ref<KeyVal>&);
114 BatchElectronDensity(const Ref<Wavefunction>&, double accuracy=DBL_EPSILON);
115 /** This will construct copies of this. If reference_parent_data is
116 true, then data that do not change, such as the density matrices
117 and shell extent, are referenced rather than copied. In this case,
118 the original object that allocated this items must be valid while
119 copied objects are used to compute densities. Also d must have
120 already been intialized and the resulting copy is already initialized
121 (and cannot be reinitialized).
122
123 If reference_parent_data is false, then init must be called on this
124 object before it is used. */
125 BatchElectronDensity(const Ref<BatchElectronDensity>& d,
126 bool reference_parent_data=false);
127 ~BatchElectronDensity();
128 /** Returns the bounding box. */
129 virtual void boundingbox(double valuemin,
130 double valuemax,
131 SCVector3& p1, SCVector3& p2);
132
133 /** This will cause all stratch storage to be released. */
134 void clear();
135
136 /** This is a alternate to the Volume interface that avoids some of the
137 overhead of that interface. */
138 void compute_density(const SCVector3 &r,
139 double *alpha_density,
140 double *alpha_density_grad,
141 double *alpha_density_hessian,
142 double *beta_density,
143 double *beta_density_grad,
144 double *beta_density_hessian);
145
146 /** This is called to finish initialization of the object. It must not
147 be called with objects that created in a way that they share parent
148 data, those objects are initialized when they are constructed. This
149 member is usually called automatically, however, if it will be used
150 to initial other objects that share parent data, then it must be
151 initialized first and this return is the way to do that. If
152 initialize_density_matrices is false, then the density matrices
153 will be allocated, but not filled in. They must be later filled in
154 with set_densities. */
155 virtual void init(bool initialize_density_matrices = true);
156
157 /** This will fill in the internel copies of the density matrices with
158 new values. aden is the alpha density matrix and bden is the beta
159 density matrix. bden is ignored if the wavefunction is not spin
160 polarized. */
161 virtual void set_densities(const RefSymmSCMatrix &aden,
162 const RefSymmSCMatrix &bden);
163
164 /** Turn linear scaling algorithm on/off. The effect of this will be
165 delayed until the next time init() is called. */
166 void set_linear_scaling(bool b) { linear_scaling_ = b; }
167
168 /** Sets the accuracy. */
169 void set_accuracy(double a) { accuracy_ = a; }
170
171 /** Turn use of density matrix bounds on/off. */
172 void set_use_dmat_bound(bool b) { use_dmat_bound_ = b; }
173
174 /** @name DFT Support Members.
175 These return some of the internal data, some of which is
176 only value after a density has been computed. This data
177 is needed by the density functional theory code. */
178 //@{
179 /** Return the alpha density matrix. */
180 double *alpha_density_matrix() { return alpha_dmat_; }
181 /** Return the beta density matrix. */
182 double *beta_density_matrix()
183 { return (spin_polarized_?beta_dmat_:alpha_dmat_); }
184 int ncontrib() { return ncontrib_; }
185 int *contrib() { return contrib_; }
186 int ncontrib_bf() { return ncontrib_bf_; }
187 int *contrib_bf() { return contrib_bf_; }
188 double *bs_values() { return bs_values_; }
189 double *bsg_values() { return bsg_values_; }
190 double *bsh_values() { return bsh_values_; }
191 /** To ensure that that the basis functions gradients are computed,
192 use this. */
193 void set_need_basis_gradient(bool b) { need_basis_gradient_ = b; }
194 void set_need_basis_hessian(bool b) { need_basis_hessian_ = b; }
195 //@}
196};
197
198class DensityColorizer: public MoleculeColorizer {
199 protected:
200 Ref<Wavefunction> wfn_;
201 double scale_;
202 double reference_;
203 int have_scale_;
204 int have_reference_;
205 public:
206 DensityColorizer(const Ref<KeyVal>&);
207 ~DensityColorizer();
208
209 void colorize(const Ref<RenderedPolygons> &);
210};
211
212class GradDensityColorizer: public MoleculeColorizer {
213 protected:
214 Ref<Wavefunction> wfn_;
215 double scale_;
216 double reference_;
217 int have_scale_;
218 int have_reference_;
219 public:
220 GradDensityColorizer(const Ref<KeyVal>&);
221 ~GradDensityColorizer();
222
223 void colorize(const Ref<RenderedPolygons> &);
224};
225
226}
227
228#endif
229
230// Local Variables:
231// mode: c++
232// c-file-style: "CLJ"
233// End:
Note: See TracBrowser for help on using the repository browser.