source: ThirdParty/mpqc_open/src/lib/math/scmat/abstract.h@ 00f983

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 00f983 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: 23.7 KB
Line 
1//
2// abstract.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 _math_scmat_abstract_h
29#define _math_scmat_abstract_h
30
31#ifdef __GNUC__
32#pragma interface
33#endif
34
35#include <util/group/message.h>
36
37#include <util/state/state.h>
38#include <math/scmat/dim.h>
39#include <math/scmat/block.h>
40#include <iostream>
41
42namespace sc {
43
44class SCMatrix;
45class SymmSCMatrix;
46class DiagSCMatrix;
47class SCVector;
48
49class SCElementOp;
50class SCElementOp2;
51class SCElementOp3;
52
53class RefSCDimension;
54
55/** The SCMatrixKit abstract class acts as a factory for producing
56matrices. By using one of these, the program makes sure that all of the
57matrices are consistent. */
58class SCMatrixKit: public DescribedClass {
59 protected:
60 Ref<MessageGrp> grp_;
61
62 public:
63 SCMatrixKit();
64 SCMatrixKit(const Ref<KeyVal>&);
65 ~SCMatrixKit();
66
67 // these members are default in local.cc
68 /** This returns a LocalSCMatrixKit, unless the
69 default has been changed with set_default_matrixkit. */
70 static SCMatrixKit* default_matrixkit();
71 static void set_default_matrixkit(const Ref<SCMatrixKit> &);
72
73 Ref<MessageGrp> messagegrp() const;
74
75 /// Given the dimensions, create matrices or vectors.
76 virtual SCMatrix* matrix(const RefSCDimension&,const RefSCDimension&) = 0;
77 virtual SymmSCMatrix* symmmatrix(const RefSCDimension&) = 0;
78 virtual DiagSCMatrix* diagmatrix(const RefSCDimension&) = 0;
79 virtual SCVector* vector(const RefSCDimension&) = 0;
80
81 /** Given the dimensions and a StateIn object,
82 restore matrices or vectors. */
83 SCMatrix* restore_matrix(StateIn&,
84 const RefSCDimension&,
85 const RefSCDimension&);
86 SymmSCMatrix* restore_symmmatrix(StateIn&,
87 const RefSCDimension&);
88 DiagSCMatrix* restore_diagmatrix(StateIn&,
89 const RefSCDimension&);
90 SCVector* restore_vector(StateIn&,
91 const RefSCDimension&);
92};
93
94
95/** The SCVector class is the abstract base class for
96 double valued vectors. */
97class SCVector: public DescribedClass {
98 protected:
99 RefSCDimension d;
100 Ref<SCMatrixKit> kit_;
101 public:
102 SCVector(const RefSCDimension&, SCMatrixKit *);
103
104 /// Save and restore this in an implementation independent way.
105 virtual void save(StateOut&);
106 virtual void restore(StateIn&);
107
108 /// Return the SCMatrixKit used to create this object.
109 Ref<SCMatrixKit> kit() const { return kit_; }
110
111 // concrete functions (some can be overridden)
112 /// Return a vector with the same dimension and same elements.
113 virtual SCVector* copy();
114 /// Return a vector with the same dimension but uninitialized memory.
115 virtual SCVector* clone();
116
117 virtual ~SCVector();
118 /// Return the length of the vector.
119 int n() const { return d->n(); }
120 /// Return the maximum absolute value element of this vector.
121 virtual double maxabs() const;
122 /// Normalize this.
123 virtual void normalize();
124 /// Assign each element to a random number between -1 and 1
125 virtual void randomize();
126 /// Assign all elements of this to val.
127 void assign(double val) { assign_val(val); }
128 /// Assign element i to v[i] for all i.
129 void assign(const double* v) { assign_p(v); }
130 /** Make this have the same elements as v. The dimensions must
131 match. */
132 void assign(SCVector* v) { assign_v(v); }
133 /// Overridden to implement the assign functions.
134 virtual void assign_val(double val);
135 virtual void assign_p(const double* v);
136 virtual void assign_v(SCVector *v);
137 /// Assign v[i] to element i for all i.
138 virtual void convert(double* v) const;
139 /** Convert an SCVector of a different specialization
140 to this specialization and possibly accumulate the data. */
141 virtual void convert(SCVector*);
142 virtual void convert_accumulate(SCVector*);
143 /// Multiply each element by val.
144 virtual void scale(double val);
145
146 /// Return the RefSCDimension corresponding to this vector.
147 RefSCDimension dim() const { return d; }
148 /// Set element i to val.
149 virtual void set_element(int i,double val) = 0;
150 /// Add val to element i.
151 virtual void accumulate_element(int,double) = 0;
152 /// Return the value of element i.
153 virtual double get_element(int i) const = 0;
154 /// Sum the result of m times v into this.
155 void accumulate_product(SymmSCMatrix* m, SCVector* v)
156 { accumulate_product_sv(m,v); }
157 void accumulate_product(SCMatrix* m, SCVector* v)
158 { accumulate_product_rv(m,v); }
159 virtual void accumulate_product_sv(SymmSCMatrix* m, SCVector* v);
160 virtual void accumulate_product_rv(SCMatrix* m, SCVector* v) = 0;
161 /// Sum v into this.
162 virtual void accumulate(const SCVector*v) = 0;
163 /// Sum m into this. One of m's dimensions must be 1.
164 virtual void accumulate(const SCMatrix*m) = 0;
165 /// Return the dot product.
166 virtual double scalar_product(SCVector*) = 0;
167 /// Perform the element operation op on each element of this.
168 virtual void element_op(const Ref<SCElementOp>&) = 0;
169 virtual void element_op(const Ref<SCElementOp2>&,
170 SCVector*) = 0;
171 virtual void element_op(const Ref<SCElementOp3>&,
172 SCVector*,SCVector*) = 0;
173 /// Print out the vector.
174 void print(std::ostream&o=ExEnv::out0()) const;
175 void print(const char* title=0,std::ostream&out=ExEnv::out0(),int=10) const;
176 virtual void vprint(const char*title=0,std::ostream&out=ExEnv::out0(),
177 int=10) const = 0;
178
179 /// Returns the message group used by the matrix kit
180 Ref<MessageGrp> messagegrp() const;
181
182 /** Returns iterators for the local (rapidly accessible) blocks used in
183 this vector. Only one iterator is allowed for a matrix is it has
184 Accum or Write access is allowed. Multiple Read iterators are
185 permitted. */
186 virtual Ref<SCMatrixSubblockIter> local_blocks(
187 SCMatrixSubblockIter::Access) = 0;
188 /// Returns iterators for the all blocks used in this vector.
189 virtual Ref<SCMatrixSubblockIter> all_blocks(SCMatrixSubblockIter::Access) = 0;
190};
191
192/** The SCMatrix class is the abstract base class for general double valued
193 n by m matrices. For symmetric matrices use SymmSCMatrix and for
194 diagonal matrices use DiagSCMatrix. */
195class SCMatrix: public DescribedClass {
196 protected:
197 RefSCDimension d1,d2;
198 Ref<SCMatrixKit> kit_;
199 public:
200 // used to control transformations
201 enum Transform { NormalTransform = 0, TransposeTransform = 1 };
202
203 // concrete functions (some can be overridden)
204 SCMatrix(const RefSCDimension&, const RefSCDimension&, SCMatrixKit *);
205 virtual ~SCMatrix();
206
207 /// Save and restore this in an implementation independent way.
208 virtual void save(StateOut&);
209 virtual void restore(StateIn&);
210
211 /// Return the SCMatrixKit used to create this object.
212 Ref<SCMatrixKit> kit() const { return kit_; }
213
214 /// Return the number of rows.
215 int nrow() const { return d1->n(); }
216 /// Return the number of columns.
217 int ncol() const { return d2->n(); }
218 /// Return the maximum absolute value element.
219 virtual double maxabs() const;
220 /// Assign each element to a random number between -1 and 1
221 virtual void randomize();
222 /// Set all elements to val.
223 void assign(double val) { assign_val(val); }
224 /// Assign element i, j to m[ir*nrow()+j].
225 void assign(const double* m) { assign_p(m); }
226 /// Assign element i, j to m[i][j].
227 void assign(const double** m) { assign_pp(m); }
228 /// Make this have the same elements as m. The dimensions must match.
229 void assign(SCMatrix* m) { assign_r(m); }
230 /// Overridden to implement to assign members.
231 virtual void assign_val(double val);
232 virtual void assign_p(const double* m);
233 virtual void assign_pp(const double** m);
234 virtual void assign_r(SCMatrix* m);
235 /** Like the assign members, but these write values to the
236 arguments. */
237 virtual void convert(double*) const;
238 virtual void convert(double**) const;
239 /** Convert an SCMatrix of a different specialization to this
240 specialization and possibly accumulate the data. */
241 virtual void convert(SCMatrix*);
242 virtual void convert_accumulate(SCMatrix*);
243 /// Multiply all elements by val.
244 virtual void scale(double val);
245 /// Scale the diagonal elements by val.
246 virtual void scale_diagonal(double val);
247 /// Shift the diagonal elements by val.
248 virtual void shift_diagonal(double val);
249 /// Make this equal to the unit matrix.
250 virtual void unit();
251 /// Return a matrix with the same dimension and same elements.
252 virtual SCMatrix* copy();
253 /// Return a matrix with the same dimension but uninitialized memory.
254 virtual SCMatrix* clone();
255
256 // pure virtual functions
257 /// Return the row or column dimension.
258 RefSCDimension rowdim() const { return d1; }
259 RefSCDimension coldim() const { return d2; }
260 /// Return or modify an element.
261 virtual double get_element(int,int) const = 0;
262 virtual void set_element(int,int,double) = 0;
263 virtual void accumulate_element(int,int,double) = 0;
264
265 /** Return a subblock of this. The subblock is defined as
266 the rows starting at br and ending at er, and the
267 columns beginning at bc and ending at ec. */
268 virtual SCMatrix * get_subblock(int br, int er, int bc, int ec) =0;
269
270 /// Assign m to a subblock of this.
271 virtual void assign_subblock(SCMatrix *m, int, int, int, int, int=0, int=0) =0;
272
273 /// Sum m into a subblock of this.
274 virtual void accumulate_subblock(SCMatrix *m, int, int, int, int, int=0,int=0) =0;
275
276 /// Return a row or column of this.
277 virtual SCVector * get_row(int i) =0;
278 virtual SCVector * get_column(int i) =0;
279
280 /// Assign v to a row or column of this.
281 virtual void assign_row(SCVector *v, int i) =0;
282 virtual void assign_column(SCVector *v, int i) =0;
283
284 /// Sum v to a row or column of this.
285 virtual void accumulate_row(SCVector *v, int i) =0;
286 virtual void accumulate_column(SCVector *v, int i) =0;
287
288 /// Sum m into this.
289 virtual void accumulate(const SCMatrix* m) = 0;
290 virtual void accumulate(const SymmSCMatrix* m) = 0;
291 virtual void accumulate(const DiagSCMatrix* m) = 0;
292 virtual void accumulate(const SCVector*) = 0;
293 /// Sum into this the products of various vectors or matrices.
294 virtual void accumulate_outer_product(SCVector*,SCVector*) = 0;
295 void accumulate_product(SCMatrix*m1,SCMatrix*m2)
296 { accumulate_product_rr(m1,m2); }
297 void accumulate_product(SCMatrix*m1,SymmSCMatrix*m2)
298 { accumulate_product_rs(m1,m2); }
299 void accumulate_product(SCMatrix*m1,DiagSCMatrix*m2)
300 { accumulate_product_rd(m1,m2); }
301 void accumulate_product(SymmSCMatrix*m1,SCMatrix*m2)
302 { accumulate_product_sr(m1,m2); }
303 void accumulate_product(DiagSCMatrix*m1,SCMatrix*m2)
304 { accumulate_product_dr(m1,m2); }
305 void accumulate_product(SymmSCMatrix*m1,SymmSCMatrix*m2)
306 { accumulate_product_ss(m1,m2); }
307 virtual void accumulate_product_rr(SCMatrix*,SCMatrix*) = 0;
308 virtual void accumulate_product_rs(SCMatrix*,SymmSCMatrix*);
309 virtual void accumulate_product_rd(SCMatrix*,DiagSCMatrix*);
310 virtual void accumulate_product_sr(SymmSCMatrix*,SCMatrix*);
311 virtual void accumulate_product_dr(DiagSCMatrix*,SCMatrix*);
312 virtual void accumulate_product_ss(SymmSCMatrix*,SymmSCMatrix*);
313 /// Transpose this.
314 virtual void transpose_this() = 0;
315 /// Return the trace.
316 virtual double trace() =0;
317 /// Invert this.
318 virtual double invert_this() = 0;
319 /// Return the determinant of this. this is overwritten.
320 virtual double determ_this() = 0;
321
322 /** Compute the singular value decomposition for this,
323 possibly destroying this. */
324 virtual void svd_this(SCMatrix *U, DiagSCMatrix *sigma, SCMatrix *V);
325 virtual double solve_this(SCVector*) = 0;
326 virtual void gen_invert_this();
327
328 /** Schmidt orthogonalize this. S is the overlap matrix.
329 n is the number of columns to orthogonalize. */
330 virtual void schmidt_orthog(SymmSCMatrix*, int n) =0;
331
332 /** Schmidt orthogonalize this. S is the overlap matrix. tol is the
333 tolerance. The number of linearly independent vectors is
334 returned. */
335 virtual int schmidt_orthog_tol(SymmSCMatrix*, double tol, double*res=0)=0;
336
337 /// Perform the element operation op on each element of this.
338 virtual void element_op(const Ref<SCElementOp>&) = 0;
339 virtual void element_op(const Ref<SCElementOp2>&,
340 SCMatrix*) = 0;
341 virtual void element_op(const Ref<SCElementOp3>&,
342 SCMatrix*,SCMatrix*) = 0;
343 /// Print out the matrix.
344 void print(std::ostream&o=ExEnv::out0()) const;
345 void print(const char* title=0,std::ostream& out=ExEnv::out0(),
346 int =10) const;
347 virtual void vprint(const char*title=0,
348 std::ostream&out=ExEnv::out0(),int =10) const = 0;
349
350 /// Returns the message group used by the matrix kit
351 Ref<MessageGrp> messagegrp() const;
352
353 /** Returns iterators for the local (rapidly accessible)
354 blocks used in this matrix. */
355 virtual Ref<SCMatrixSubblockIter> local_blocks(
356 SCMatrixSubblockIter::Access) = 0;
357 /// Returns iterators for the all blocks used in this matrix.
358 virtual Ref<SCMatrixSubblockIter> all_blocks(
359 SCMatrixSubblockIter::Access) = 0;
360};
361
362/** The SymmSCMatrix class is the abstract base class for symmetric
363 double valued matrices. */
364class SymmSCMatrix: public DescribedClass {
365 protected:
366 RefSCDimension d;
367 Ref<SCMatrixKit> kit_;
368 public:
369 SymmSCMatrix(const RefSCDimension&, SCMatrixKit *);
370 ~SymmSCMatrix();
371
372 /// Return the SCMatrixKit object that created this object.
373 Ref<SCMatrixKit> kit() const { return kit_; }
374
375 /// Save and restore this in an implementation independent way.
376 virtual void save(StateOut&);
377 virtual void restore(StateIn&);
378 /// Return the maximum absolute value element of this vector.
379 virtual double maxabs() const;
380 /// Assign each element to a random number between -1 and 1
381 virtual void randomize();
382 /// Set all elements to val.
383 void assign(double val) { assign_val(val); }
384 /** Assign element i, j to m[i*(i+1)/2+j]. */
385 void assign(const double* m) { assign_p(m); }
386 /// Assign element i, j to m[i][j].
387 void assign(const double** m) { assign_pp(m); }
388 /** Make this have the same elements as m. The dimensions must
389 match. */
390 void assign(SymmSCMatrix* m) { assign_s(m); }
391 /// Overridden to implement the assign functions
392 virtual void assign_val(double val);
393 virtual void assign_p(const double* m);
394 virtual void assign_pp(const double** m);
395 virtual void assign_s(SymmSCMatrix* m);
396 /// Like the assign members, but these write values to the arguments.
397 virtual void convert(double*) const;
398 virtual void convert(double**) const;
399 /** Convert an SCSymmSCMatrix of a different specialization
400 to this specialization and possibly accumulate the data. */
401 virtual void convert(SymmSCMatrix*);
402 virtual void convert_accumulate(SymmSCMatrix*);
403 /// Multiply all elements by val.
404 virtual void scale(double);
405 /// Scale the diagonal elements by val.
406 virtual void scale_diagonal(double);
407 /// Shift the diagonal elements by val.
408 virtual void shift_diagonal(double);
409 /// Make this equal to the unit matrix.
410 virtual void unit();
411 /// Return the dimension.
412 int n() const { return d->n(); }
413 /// Return a matrix with the same dimension and same elements.
414 virtual SymmSCMatrix* copy();
415 /// Return a matrix with the same dimension but uninitialized memory.
416 virtual SymmSCMatrix* clone();
417
418 // pure virtual functions
419 /// Return the dimension.
420 RefSCDimension dim() const { return d; }
421 /// Return or modify an element.
422 virtual double get_element(int,int) const = 0;
423 virtual void set_element(int,int,double) = 0;
424 virtual void accumulate_element(int,int,double) = 0;
425
426 /** Return a subblock of this. The subblock is defined as the rows
427 starting at br and ending at er, and the columns beginning at bc
428 and ending at ec. */
429 virtual SCMatrix * get_subblock(int br, int er, int bc, int ec) =0;
430 virtual SymmSCMatrix * get_subblock(int br, int er) =0;
431
432 /// Assign m to a subblock of this.
433 virtual void assign_subblock(SCMatrix *m, int, int, int, int) =0;
434 virtual void assign_subblock(SymmSCMatrix *m, int, int) =0;
435
436 /// Sum m into a subblock of this.
437 virtual void accumulate_subblock(SCMatrix *m, int, int, int, int) =0;
438 virtual void accumulate_subblock(SymmSCMatrix *m, int, int) =0;
439
440 /// Return a row of this.
441 virtual SCVector * get_row(int i) =0;
442
443 /// Assign v to a row of this.
444 virtual void assign_row(SCVector *v, int i) =0;
445
446 /// Sum v to a row of this.
447 virtual void accumulate_row(SCVector *v, int i) =0;
448
449 /** Diagonalize this, placing the eigenvalues in d and the eigenvectors
450 in m. */
451 virtual void diagonalize(DiagSCMatrix*d,SCMatrix*m) = 0;
452 /// Sum m into this.
453 virtual void accumulate(const SymmSCMatrix* m) = 0;
454 /// Sum into this the products of various vectors or matrices.
455 virtual void accumulate_symmetric_sum(SCMatrix*) = 0;
456 virtual void accumulate_symmetric_product(SCMatrix*);
457 virtual void accumulate_transform(SCMatrix*,SymmSCMatrix*,
458 SCMatrix::Transform = SCMatrix::NormalTransform);
459 virtual void accumulate_transform(SCMatrix*,DiagSCMatrix*,
460 SCMatrix::Transform = SCMatrix::NormalTransform);
461 virtual void accumulate_transform(SymmSCMatrix*,SymmSCMatrix*);
462 virtual void accumulate_symmetric_outer_product(SCVector*);
463 /** Return the scalar obtained by multiplying this on the
464 left and right by v. */
465 virtual double scalar_product(SCVector* v);
466 /// Return the trace.
467 virtual double trace() = 0;
468 /// Invert this.
469 virtual double invert_this() = 0;
470 /// Return the determinant of this. this is overwritten.
471 virtual double determ_this() = 0;
472
473 virtual double solve_this(SCVector*) = 0;
474 virtual void gen_invert_this() = 0;
475
476 /// Perform the element operation op on each element of this.
477 virtual void element_op(const Ref<SCElementOp>&) = 0;
478 virtual void element_op(const Ref<SCElementOp2>&,
479 SymmSCMatrix*) = 0;
480 virtual void element_op(const Ref<SCElementOp3>&,
481 SymmSCMatrix*,SymmSCMatrix*) = 0;
482 /// Print out the matrix.
483 void print(std::ostream&o=ExEnv::out0()) const;
484 void print(const char* title=0,std::ostream& out=ExEnv::out0(),
485 int =10) const;
486 virtual void vprint(const char* title=0,
487 std::ostream& out=ExEnv::out0(), int =10) const;
488
489 /// Returns the message group used by the matrix kit
490 Ref<MessageGrp> messagegrp() const;
491
492 /** Returns iterators for the local (rapidly accessible)
493 blocks used in this matrix. */
494 virtual Ref<SCMatrixSubblockIter> local_blocks(
495 SCMatrixSubblockIter::Access) = 0;
496 /// Returns iterators for the all blocks used in this matrix.
497 virtual Ref<SCMatrixSubblockIter> all_blocks(
498 SCMatrixSubblockIter::Access) = 0;
499};
500
501/** The SymmSCMatrix class is the abstract base class for diagonal double
502 valued matrices. */
503class DiagSCMatrix: public DescribedClass {
504 protected:
505 RefSCDimension d;
506 Ref<SCMatrixKit> kit_;
507 public:
508 DiagSCMatrix(const RefSCDimension&, SCMatrixKit *);
509 ~DiagSCMatrix();
510
511 /// Return the SCMatrixKit used to create this object.
512 Ref<SCMatrixKit> kit() const { return kit_; }
513
514 /// Save and restore this in an implementation independent way.
515 virtual void save(StateOut&);
516 virtual void restore(StateIn&);
517
518 /// Return the maximum absolute value element of this vector.
519 virtual double maxabs() const;
520 /// Assign each element to a random number between -1 and 1
521 virtual void randomize();
522 /// Set all elements to val.
523 void assign(double val) { assign_val(val); }
524 /// Assign element i, i to m[i].
525 void assign(const double*p) { assign_p(p); }
526 /** Make this have the same elements as m. The dimensions must
527 match. */
528 void assign(DiagSCMatrix*d_a) { assign_d(d_a); }
529 /// Overridden to implement the assign members.
530 virtual void assign_val(double val);
531 virtual void assign_p(const double*);
532 virtual void assign_d(DiagSCMatrix*);
533 /// Like the assign member, but this writes values to the argument.
534 virtual void convert(double*) const;
535 /** Convert an SCDiagSCMatrix of a different specialization
536 to this specialization and possibly accumulate the data. */
537 virtual void convert(DiagSCMatrix*);
538 virtual void convert_accumulate(DiagSCMatrix*);
539 /// Multiply all elements by val.
540 virtual void scale(double);
541 /// Return the dimension.
542 int n() const { return d->n(); }
543 /// Return a matrix with the same dimension and same elements.
544 virtual DiagSCMatrix* copy();
545 /// Return a matrix with the same dimension but uninitialized memory.
546 virtual DiagSCMatrix* clone();
547
548 // pure virtual functions
549 /// Return the dimension.
550 RefSCDimension dim() const { return d; }
551 /// Return or modify an element.
552 virtual double get_element(int) const = 0;
553 virtual void set_element(int,double) = 0;
554 virtual void accumulate_element(int,double) = 0;
555 /// Sum m into this.
556 virtual void accumulate(const DiagSCMatrix* m) = 0;
557 /// Return the trace.
558 virtual double trace() = 0;
559 /// Return the determinant of this. this is overwritten.
560 virtual double determ_this() = 0;
561 /// Invert this.
562 virtual double invert_this() = 0;
563 /// Do a generalized inversion of this.
564 virtual void gen_invert_this() = 0;
565 /// Perform the element operation op on each element of this.
566 virtual void element_op(const Ref<SCElementOp>&) = 0;
567 virtual void element_op(const Ref<SCElementOp2>&,
568 DiagSCMatrix*) = 0;
569 virtual void element_op(const Ref<SCElementOp3>&,
570 DiagSCMatrix*,DiagSCMatrix*) = 0;
571 /// Print out the matrix.
572 void print(std::ostream&o=ExEnv::out0()) const;
573 void print(const char* title=0,
574 std::ostream& out=ExEnv::out0(), int =10) const;
575 virtual void vprint(const char* title=0,
576 std::ostream& out=ExEnv::out0(), int =10) const;
577
578 /// Returns the message group used by the matrix kit
579 Ref<MessageGrp> messagegrp() const;
580
581 /** Returns iterators for the local (rapidly accessible)
582 blocks used in this matrix. */
583 virtual Ref<SCMatrixSubblockIter> local_blocks(
584 SCMatrixSubblockIter::Access) = 0;
585 /// Returns iterators for the all blocks used in this matrix.
586 virtual Ref<SCMatrixSubblockIter> all_blocks(
587 SCMatrixSubblockIter::Access) = 0;
588};
589
590}
591
592#endif
593
594// Local Variables:
595// mode: c++
596// c-file-style: "CLJ"
597// End:
Note: See TracBrowser for help on using the repository browser.