📄 scextrapmat.cc
字号:
//// scextrapmat.cc//// Copyright (C) 1996 Limit Point Systems, Inc.//// Author: Curtis Janssen <cljanss@limitpt.com>// Maintainer: LPS//// This file is part of the SC Toolkit.//// The SC Toolkit is free software; you can redistribute it and/or modify// it under the terms of the GNU Library General Public License as published by// the Free Software Foundation; either version 2, or (at your option)// any later version.//// The SC Toolkit is distributed in the hope that it will be useful,// but WITHOUT ANY WARRANTY; without even the implied warranty of// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the// GNU Library General Public License for more details.//// You should have received a copy of the GNU Library General Public License// along with the SC Toolkit; see the file COPYING.LIB. If not, write to// the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.//// The U.S. Government is granted a limited license as per AL 91-7.//#include <util/state/stateio.h>#include <math/scmat/elemop.h>#include <math/scmat/blocked.h>#include <math/optimize/scextrapmat.h>using namespace sc;static ClassDesc SymmSCMatrixSCExtrapData_cd( typeid(SymmSCMatrixSCExtrapData),"SymmSCMatrixSCExtrapData",1,"public SCExtrapData", 0, 0, create<SymmSCMatrixSCExtrapData>);SymmSCMatrixSCExtrapData::SymmSCMatrixSCExtrapData(StateIn& s) : SCExtrapData(s){ Ref<SCMatrixKit> k = SCMatrixKit::default_matrixkit(); RefSCDimension dim; dim << SavableState::restore_state(s); int blocked; s.get(blocked); if (blocked) k = new BlockedSCMatrixKit(SCMatrixKit::default_matrixkit()); m = k->symmmatrix(dim); m.restore(s);}SymmSCMatrixSCExtrapData::SymmSCMatrixSCExtrapData(const RefSymmSCMatrix& mat){ m = mat;}voidSymmSCMatrixSCExtrapData::save_data_state(StateOut& s){ SCExtrapData::save_data_state(s); SavableState::save_state(m.dim().pointer(),s); int blocked = (dynamic_cast<BlockedSymmSCMatrix*>(m.pointer())) ? 1 : 0; s.put(blocked); m.save(s);}voidSymmSCMatrixSCExtrapData::zero(){ m.assign(0.0);}SCExtrapData*SymmSCMatrixSCExtrapData::copy(){ return new SymmSCMatrixSCExtrapData(m.copy());}voidSymmSCMatrixSCExtrapData::accumulate_scaled(double scale, const Ref<SCExtrapData>& data){ SymmSCMatrixSCExtrapData* a = require_dynamic_cast<SymmSCMatrixSCExtrapData*>( data.pointer(), "SymmSCMatrixSCExtrapData::accumulate_scaled"); RefSymmSCMatrix am = a->m.copy(); am.scale(scale); m.accumulate(am);}///////////////////////////////////////////////////////////////////////////static ClassDesc SymmSCMatrix2SCExtrapData_cd( typeid(SymmSCMatrix2SCExtrapData),"SymmSCMatrix2SCExtrapData",1,"public SCExtrapData", 0, 0, create<SymmSCMatrix2SCExtrapData>);SymmSCMatrix2SCExtrapData::SymmSCMatrix2SCExtrapData(StateIn&s) : SCExtrapData(s){ Ref<SCMatrixKit> k = SCMatrixKit::default_matrixkit(); RefSCDimension dim; dim << SavableState::restore_state(s); int blocked; s.get(blocked); if (blocked) k = new BlockedSCMatrixKit(SCMatrixKit::default_matrixkit()); m1 = k->symmmatrix(dim); m2 = k->symmmatrix(dim); m1.restore(s); m2.restore(s);}SymmSCMatrix2SCExtrapData::SymmSCMatrix2SCExtrapData( const RefSymmSCMatrix& mat1, const RefSymmSCMatrix& mat2){ m1 = mat1; m2 = mat2;}voidSymmSCMatrix2SCExtrapData::save_data_state(StateOut& s){ SCExtrapData::save_data_state(s); SavableState::save_state(m1.dim().pointer(),s); int blocked = (dynamic_cast<BlockedSymmSCMatrix*>(m1.pointer())) ? 1 : 0; s.put(blocked); m1.save(s); m2.save(s);}voidSymmSCMatrix2SCExtrapData::zero(){ m1.assign(0.0); m2.assign(0.0);}SCExtrapData*SymmSCMatrix2SCExtrapData::copy(){ return new SymmSCMatrix2SCExtrapData(m1.copy(), m2.copy());}voidSymmSCMatrix2SCExtrapData::accumulate_scaled(double scale, const Ref<SCExtrapData>& data){ SymmSCMatrix2SCExtrapData* a = require_dynamic_cast<SymmSCMatrix2SCExtrapData*>( data.pointer(), "SymmSCMatrix2SCExtrapData::accumulate_scaled"); RefSymmSCMatrix am = a->m1.copy(); am.scale(scale); m1.accumulate(am); am = 0; am = a->m2.copy(); am.scale(scale); m2.accumulate(am);}///////////////////////////////////////////////////////////////////////////static ClassDesc SymmSCMatrix4SCExtrapData_cd( typeid(SymmSCMatrix4SCExtrapData),"SymmSCMatrix4SCExtrapData",1,"public SCExtrapData", 0, 0, create<SymmSCMatrix4SCExtrapData>);SymmSCMatrix4SCExtrapData::SymmSCMatrix4SCExtrapData(StateIn&s) : SCExtrapData(s){ Ref<SCMatrixKit> k = SCMatrixKit::default_matrixkit(); RefSCDimension dim; dim << SavableState::restore_state(s); int blocked; s.get(blocked); if (blocked) k = new BlockedSCMatrixKit(SCMatrixKit::default_matrixkit()); m1 = k->symmmatrix(dim); m2 = k->symmmatrix(dim); m3 = k->symmmatrix(dim); m4 = k->symmmatrix(dim); m1.restore(s); m2.restore(s); m3.restore(s); m4.restore(s);}SymmSCMatrix4SCExtrapData::SymmSCMatrix4SCExtrapData( const RefSymmSCMatrix& mat1, const RefSymmSCMatrix& mat2, const RefSymmSCMatrix& mat3, const RefSymmSCMatrix& mat4){ m1 = mat1; m2 = mat2; m3 = mat3; m4 = mat4;}voidSymmSCMatrix4SCExtrapData::save_data_state(StateOut& s){ SCExtrapData::save_data_state(s); SavableState::save_state(m1.dim().pointer(),s); int blocked = (dynamic_cast<BlockedSymmSCMatrix*>(m1.pointer())) ? 1 : 0; s.put(blocked); m1.save(s); m2.save(s); m3.save(s); m4.save(s);}voidSymmSCMatrix4SCExtrapData::zero(){ m1.assign(0.0); m2.assign(0.0); m3.assign(0.0); m4.assign(0.0);}SCExtrapData*SymmSCMatrix4SCExtrapData::copy(){ return new SymmSCMatrix4SCExtrapData(m1.copy(), m2.copy(), m3.copy(), m4.copy());}voidSymmSCMatrix4SCExtrapData::accumulate_scaled(double scale, const Ref<SCExtrapData>& data){ SymmSCMatrix4SCExtrapData* a = require_dynamic_cast<SymmSCMatrix4SCExtrapData*>( data.pointer(), "SymmSCMatrix4SCExtrapData::accumulate_scaled"); RefSymmSCMatrix am = a->m1.copy(); am.scale(scale); m1.accumulate(am); am = 0; am = a->m2.copy(); am.scale(scale); m2.accumulate(am); am = a->m3.copy(); am.scale(scale); m3.accumulate(am); am = a->m4.copy(); am.scale(scale); m4.accumulate(am);}///////////////////////////////////////////////////////////////////////////static ClassDesc SymmSCMatrixNSCExtrapData_cd( typeid(SymmSCMatrixNSCExtrapData),"SymmSCMatrixNSCExtrapData",1,"public SCExtrapData", 0, 0, create<SymmSCMatrixNSCExtrapData>);SymmSCMatrixNSCExtrapData::SymmSCMatrixNSCExtrapData(StateIn&s) : SCExtrapData(s){ s.get(n_); Ref<SCMatrixKit> k = SCMatrixKit::default_matrixkit(); RefSCDimension dim; dim << SavableState::restore_state(s); int blocked; s.get(blocked); if (blocked) k = new BlockedSCMatrixKit(SCMatrixKit::default_matrixkit()); m = new RefSymmSCMatrix[n_]; for (int i=0; i < n_; i++) { m[i] = k->symmmatrix(dim); m[i].restore(s); }}SymmSCMatrixNSCExtrapData::SymmSCMatrixNSCExtrapData(int n, RefSymmSCMatrix *mats){ n_=n; m = new RefSymmSCMatrix[n_]; for (int i=0; i < n_; i++) m[i] = mats[i];}voidSymmSCMatrixNSCExtrapData::save_data_state(StateOut& s){ SCExtrapData::save_data_state(s); s.put(n_); SavableState::save_state(m[0].dim().pointer(),s); int blocked = (dynamic_cast<BlockedSymmSCMatrix*>(m[0].pointer())) ? 1 : 0; s.put(blocked); for (int i=0; i < n_; i++) m[i].save(s);}voidSymmSCMatrixNSCExtrapData::zero(){ for (int i=0; i < n_; i++) m[i].assign(0.0);}SCExtrapData*SymmSCMatrixNSCExtrapData::copy(){ RefSymmSCMatrix *m2 = new RefSymmSCMatrix[n_]; for (int i=0; i < n_; i++) m2[i] = m[i].copy(); SCExtrapData *ret = new SymmSCMatrixNSCExtrapData(n_, m2); delete[] m2; return ret;}voidSymmSCMatrixNSCExtrapData::accumulate_scaled(double scale, const Ref<SCExtrapData>& data){ SymmSCMatrixNSCExtrapData* a = require_dynamic_cast<SymmSCMatrixNSCExtrapData*>( data.pointer(), "SymmSCMatrixNSCExtrapData::accumulate_scaled"); for (int i=0; i < n_; i++) { RefSymmSCMatrix am = a->m[i].copy(); am.scale(scale); m[i].accumulate(am); }}///////////////////////////////////////////////////////////////////////////static ClassDesc SymmSCMatrixSCExtrapError_cd( typeid(SymmSCMatrixSCExtrapError),"SymmSCMatrixSCExtrapError",1,"public SCExtrapError", 0, 0, create<SymmSCMatrixSCExtrapError>);SymmSCMatrixSCExtrapError::SymmSCMatrixSCExtrapError(StateIn& s) : SCExtrapError(s){ Ref<SCMatrixKit> k = SCMatrixKit::default_matrixkit(); RefSCDimension dim; dim << SavableState::restore_state(s); int blocked; s.get(blocked); if (blocked) k = new BlockedSCMatrixKit(SCMatrixKit::default_matrixkit()); m = k->symmmatrix(dim); m.restore(s);}SymmSCMatrixSCExtrapError::SymmSCMatrixSCExtrapError( const RefSymmSCMatrix& mat){ m = mat;}voidSymmSCMatrixSCExtrapError::save_data_state(StateOut& s){ SCExtrapError::save_data_state(s); SavableState::save_state(m.dim().pointer(),s); int blocked = (dynamic_cast<BlockedSymmSCMatrix*>(m.pointer())) ? 1 : 0; s.put(blocked); m.save(s);}doubleSymmSCMatrixSCExtrapError::error(){ return m->maxabs();}doubleSymmSCMatrixSCExtrapError::scalar_product(const Ref<SCExtrapError>& arg){ SymmSCMatrixSCExtrapError* a = require_dynamic_cast<SymmSCMatrixSCExtrapError*>( arg.pointer(), "SymmSCMatrixSCExtrapError::scalar_product"); Ref<SCElementScalarProduct> sp(new SCElementScalarProduct); m->element_op(sp.pointer(), a->m.pointer()); return sp->result();}/////////////////////////////////////////////////////////////////////////////// Local Variables:// mode: c++// c-file-style: "CLJ"// End:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -