source: ThirdParty/mpqc_open/src/lib/math/optimize/scextrapmat.cc@ 1513599

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 1513599 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: 9.9 KB
Line 
1//
2// scextrapmat.cc
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#include <util/state/stateio.h>
29#include <math/scmat/elemop.h>
30#include <math/scmat/blocked.h>
31#include <math/optimize/scextrapmat.h>
32
33using namespace sc;
34
35static ClassDesc SymmSCMatrixSCExtrapData_cd(
36 typeid(SymmSCMatrixSCExtrapData),"SymmSCMatrixSCExtrapData",1,"public SCExtrapData",
37 0, 0, create<SymmSCMatrixSCExtrapData>);
38
39SymmSCMatrixSCExtrapData::SymmSCMatrixSCExtrapData(StateIn& s) :
40 SCExtrapData(s)
41{
42 Ref<SCMatrixKit> k = SCMatrixKit::default_matrixkit();
43 RefSCDimension dim;
44 dim << SavableState::restore_state(s);
45
46 int blocked;
47 s.get(blocked);
48
49 if (blocked)
50 k = new BlockedSCMatrixKit(SCMatrixKit::default_matrixkit());
51
52 m = k->symmmatrix(dim);
53 m.restore(s);
54}
55
56SymmSCMatrixSCExtrapData::SymmSCMatrixSCExtrapData(const RefSymmSCMatrix& mat)
57{
58 m = mat;
59}
60
61void
62SymmSCMatrixSCExtrapData::save_data_state(StateOut& s)
63{
64 SCExtrapData::save_data_state(s);
65 SavableState::save_state(m.dim().pointer(),s);
66
67 int blocked = (dynamic_cast<BlockedSymmSCMatrix*>(m.pointer())) ? 1 : 0;
68 s.put(blocked);
69
70 m.save(s);
71}
72
73void
74SymmSCMatrixSCExtrapData::zero()
75{
76 m.assign(0.0);
77}
78
79SCExtrapData*
80SymmSCMatrixSCExtrapData::copy()
81{
82 return new SymmSCMatrixSCExtrapData(m.copy());
83}
84
85void
86SymmSCMatrixSCExtrapData::accumulate_scaled(double scale,
87 const Ref<SCExtrapData>& data)
88{
89 SymmSCMatrixSCExtrapData* a
90 = require_dynamic_cast<SymmSCMatrixSCExtrapData*>(
91 data.pointer(), "SymmSCMatrixSCExtrapData::accumulate_scaled");
92
93 RefSymmSCMatrix am = a->m.copy();
94 am.scale(scale);
95 m.accumulate(am);
96}
97
98///////////////////////////////////////////////////////////////////////////
99
100static ClassDesc SymmSCMatrix2SCExtrapData_cd(
101 typeid(SymmSCMatrix2SCExtrapData),"SymmSCMatrix2SCExtrapData",1,"public SCExtrapData",
102 0, 0, create<SymmSCMatrix2SCExtrapData>);
103
104SymmSCMatrix2SCExtrapData::SymmSCMatrix2SCExtrapData(StateIn&s) :
105 SCExtrapData(s)
106{
107 Ref<SCMatrixKit> k = SCMatrixKit::default_matrixkit();
108 RefSCDimension dim;
109 dim << SavableState::restore_state(s);
110
111 int blocked;
112 s.get(blocked);
113
114 if (blocked)
115 k = new BlockedSCMatrixKit(SCMatrixKit::default_matrixkit());
116
117 m1 = k->symmmatrix(dim);
118 m2 = k->symmmatrix(dim);
119 m1.restore(s);
120 m2.restore(s);
121}
122
123SymmSCMatrix2SCExtrapData::SymmSCMatrix2SCExtrapData(
124 const RefSymmSCMatrix& mat1,
125 const RefSymmSCMatrix& mat2)
126{
127 m1 = mat1;
128 m2 = mat2;
129}
130
131void
132SymmSCMatrix2SCExtrapData::save_data_state(StateOut& s)
133{
134 SCExtrapData::save_data_state(s);
135 SavableState::save_state(m1.dim().pointer(),s);
136
137 int blocked = (dynamic_cast<BlockedSymmSCMatrix*>(m1.pointer())) ? 1 : 0;
138 s.put(blocked);
139
140 m1.save(s);
141 m2.save(s);
142}
143
144void
145SymmSCMatrix2SCExtrapData::zero()
146{
147 m1.assign(0.0);
148 m2.assign(0.0);
149}
150
151SCExtrapData*
152SymmSCMatrix2SCExtrapData::copy()
153{
154 return new SymmSCMatrix2SCExtrapData(m1.copy(), m2.copy());
155}
156
157void
158SymmSCMatrix2SCExtrapData::accumulate_scaled(double scale,
159 const Ref<SCExtrapData>& data)
160{
161 SymmSCMatrix2SCExtrapData* a
162 = require_dynamic_cast<SymmSCMatrix2SCExtrapData*>(
163 data.pointer(), "SymmSCMatrix2SCExtrapData::accumulate_scaled");
164
165 RefSymmSCMatrix am = a->m1.copy();
166 am.scale(scale);
167 m1.accumulate(am);
168 am = 0;
169
170 am = a->m2.copy();
171 am.scale(scale);
172 m2.accumulate(am);
173}
174
175///////////////////////////////////////////////////////////////////////////
176
177static ClassDesc SymmSCMatrix4SCExtrapData_cd(
178 typeid(SymmSCMatrix4SCExtrapData),"SymmSCMatrix4SCExtrapData",1,"public SCExtrapData",
179 0, 0, create<SymmSCMatrix4SCExtrapData>);
180
181SymmSCMatrix4SCExtrapData::SymmSCMatrix4SCExtrapData(StateIn&s) :
182 SCExtrapData(s)
183{
184 Ref<SCMatrixKit> k = SCMatrixKit::default_matrixkit();
185 RefSCDimension dim;
186 dim << SavableState::restore_state(s);
187
188 int blocked;
189 s.get(blocked);
190
191 if (blocked)
192 k = new BlockedSCMatrixKit(SCMatrixKit::default_matrixkit());
193
194 m1 = k->symmmatrix(dim);
195 m2 = k->symmmatrix(dim);
196 m3 = k->symmmatrix(dim);
197 m4 = k->symmmatrix(dim);
198 m1.restore(s);
199 m2.restore(s);
200 m3.restore(s);
201 m4.restore(s);
202}
203
204SymmSCMatrix4SCExtrapData::SymmSCMatrix4SCExtrapData(
205 const RefSymmSCMatrix& mat1,
206 const RefSymmSCMatrix& mat2,
207 const RefSymmSCMatrix& mat3,
208 const RefSymmSCMatrix& mat4)
209{
210 m1 = mat1;
211 m2 = mat2;
212 m3 = mat3;
213 m4 = mat4;
214}
215
216void
217SymmSCMatrix4SCExtrapData::save_data_state(StateOut& s)
218{
219 SCExtrapData::save_data_state(s);
220 SavableState::save_state(m1.dim().pointer(),s);
221
222 int blocked = (dynamic_cast<BlockedSymmSCMatrix*>(m1.pointer())) ? 1 : 0;
223 s.put(blocked);
224
225 m1.save(s);
226 m2.save(s);
227 m3.save(s);
228 m4.save(s);
229}
230
231void
232SymmSCMatrix4SCExtrapData::zero()
233{
234 m1.assign(0.0);
235 m2.assign(0.0);
236 m3.assign(0.0);
237 m4.assign(0.0);
238}
239
240SCExtrapData*
241SymmSCMatrix4SCExtrapData::copy()
242{
243 return new SymmSCMatrix4SCExtrapData(m1.copy(), m2.copy(),
244 m3.copy(), m4.copy());
245}
246
247void
248SymmSCMatrix4SCExtrapData::accumulate_scaled(double scale,
249 const Ref<SCExtrapData>& data)
250{
251 SymmSCMatrix4SCExtrapData* a
252 = require_dynamic_cast<SymmSCMatrix4SCExtrapData*>(
253 data.pointer(), "SymmSCMatrix4SCExtrapData::accumulate_scaled");
254
255 RefSymmSCMatrix am = a->m1.copy();
256 am.scale(scale);
257 m1.accumulate(am);
258 am = 0;
259
260 am = a->m2.copy();
261 am.scale(scale);
262 m2.accumulate(am);
263
264 am = a->m3.copy();
265 am.scale(scale);
266 m3.accumulate(am);
267
268 am = a->m4.copy();
269 am.scale(scale);
270 m4.accumulate(am);
271}
272
273///////////////////////////////////////////////////////////////////////////
274
275static ClassDesc SymmSCMatrixNSCExtrapData_cd(
276 typeid(SymmSCMatrixNSCExtrapData),"SymmSCMatrixNSCExtrapData",1,"public SCExtrapData",
277 0, 0, create<SymmSCMatrixNSCExtrapData>);
278
279SymmSCMatrixNSCExtrapData::SymmSCMatrixNSCExtrapData(StateIn&s) :
280 SCExtrapData(s)
281{
282 s.get(n_);
283
284 Ref<SCMatrixKit> k = SCMatrixKit::default_matrixkit();
285 RefSCDimension dim;
286 dim << SavableState::restore_state(s);
287
288 int blocked;
289 s.get(blocked);
290
291 if (blocked)
292 k = new BlockedSCMatrixKit(SCMatrixKit::default_matrixkit());
293
294 m = new RefSymmSCMatrix[n_];
295
296 for (int i=0; i < n_; i++) {
297 m[i] = k->symmmatrix(dim);
298 m[i].restore(s);
299 }
300}
301
302SymmSCMatrixNSCExtrapData::SymmSCMatrixNSCExtrapData(int n,
303 RefSymmSCMatrix *mats)
304{
305 n_=n;
306 m = new RefSymmSCMatrix[n_];
307 for (int i=0; i < n_; i++)
308 m[i] = mats[i];
309}
310
311void
312SymmSCMatrixNSCExtrapData::save_data_state(StateOut& s)
313{
314 SCExtrapData::save_data_state(s);
315
316 s.put(n_);
317 SavableState::save_state(m[0].dim().pointer(),s);
318
319 int blocked = (dynamic_cast<BlockedSymmSCMatrix*>(m[0].pointer())) ? 1 : 0;
320 s.put(blocked);
321
322 for (int i=0; i < n_; i++)
323 m[i].save(s);
324}
325
326void
327SymmSCMatrixNSCExtrapData::zero()
328{
329 for (int i=0; i < n_; i++)
330 m[i].assign(0.0);
331}
332
333SCExtrapData*
334SymmSCMatrixNSCExtrapData::copy()
335{
336 RefSymmSCMatrix *m2 = new RefSymmSCMatrix[n_];
337 for (int i=0; i < n_; i++)
338 m2[i] = m[i].copy();
339
340 SCExtrapData *ret = new SymmSCMatrixNSCExtrapData(n_, m2);
341 delete[] m2;
342
343 return ret;
344}
345
346void
347SymmSCMatrixNSCExtrapData::accumulate_scaled(double scale,
348 const Ref<SCExtrapData>& data)
349{
350 SymmSCMatrixNSCExtrapData* a
351 = require_dynamic_cast<SymmSCMatrixNSCExtrapData*>(
352 data.pointer(), "SymmSCMatrixNSCExtrapData::accumulate_scaled");
353
354 for (int i=0; i < n_; i++) {
355 RefSymmSCMatrix am = a->m[i].copy();
356 am.scale(scale);
357 m[i].accumulate(am);
358 }
359}
360
361///////////////////////////////////////////////////////////////////////////
362
363static ClassDesc SymmSCMatrixSCExtrapError_cd(
364 typeid(SymmSCMatrixSCExtrapError),"SymmSCMatrixSCExtrapError",1,"public SCExtrapError",
365 0, 0, create<SymmSCMatrixSCExtrapError>);
366
367SymmSCMatrixSCExtrapError::SymmSCMatrixSCExtrapError(StateIn& s) :
368 SCExtrapError(s)
369{
370 Ref<SCMatrixKit> k = SCMatrixKit::default_matrixkit();
371 RefSCDimension dim;
372 dim << SavableState::restore_state(s);
373
374 int blocked;
375 s.get(blocked);
376
377 if (blocked)
378 k = new BlockedSCMatrixKit(SCMatrixKit::default_matrixkit());
379
380 m = k->symmmatrix(dim);
381 m.restore(s);
382}
383
384SymmSCMatrixSCExtrapError::SymmSCMatrixSCExtrapError(
385 const RefSymmSCMatrix& mat)
386{
387 m = mat;
388}
389
390void
391SymmSCMatrixSCExtrapError::save_data_state(StateOut& s)
392{
393 SCExtrapError::save_data_state(s);
394 SavableState::save_state(m.dim().pointer(),s);
395
396 int blocked = (dynamic_cast<BlockedSymmSCMatrix*>(m.pointer())) ? 1 : 0;
397 s.put(blocked);
398
399 m.save(s);
400}
401
402double
403SymmSCMatrixSCExtrapError::error()
404{
405 return m->maxabs();
406}
407
408double
409SymmSCMatrixSCExtrapError::scalar_product(const Ref<SCExtrapError>& arg)
410{
411 SymmSCMatrixSCExtrapError* a
412 = require_dynamic_cast<SymmSCMatrixSCExtrapError*>(
413 arg.pointer(), "SymmSCMatrixSCExtrapError::scalar_product");
414 Ref<SCElementScalarProduct> sp(new SCElementScalarProduct);
415 m->element_op(sp.pointer(), a->m.pointer());
416 return sp->result();
417}
418
419/////////////////////////////////////////////////////////////////////////////
420
421// Local Variables:
422// mode: c++
423// c-file-style: "CLJ"
424// End:
Note: See TracBrowser for help on using the repository browser.