📄 block.cc
字号:
return ret;}double *SCMatrixDiagBlock::dat(){ return data;}intSCMatrixDiagBlock::ndat() const{ return iend-istart;}SCMatrixDiagBlock::~SCMatrixDiagBlock(){ delete[] data;}voidSCMatrixDiagBlock::process(SCElementOp*op){ SCMatrixDiagBlockIter i(this); op->process(i);}voidSCMatrixDiagBlock::process(SCElementOp2*op, SCMatrixBlock* b){ SCMatrixDiagBlockIter i(this); SCMatrixDiagBlockIter j((SCMatrixDiagBlock*)b); op->process(i,j);}voidSCMatrixDiagBlock::process(SCElementOp3*op, SCMatrixBlock* b1, SCMatrixBlock* b2){ SCMatrixDiagBlockIter i(this); SCMatrixDiagBlockIter j((SCMatrixDiagBlock*)b1); SCMatrixDiagBlockIter k((SCMatrixDiagBlock*)b2); op->process(i,j,k);}/////////////////////////////////////////////////////////////////////////////// SCMatrixDiagSubBlock member functionsstatic ClassDesc SCMatrixDiagSubBlock_cd( typeid(SCMatrixDiagSubBlock),"SCMatrixDiagSubBlock",1,"public SCMatrixBlock", 0, 0, create<SCMatrixDiagSubBlock>);SCMatrixDiagSubBlock::SCMatrixDiagSubBlock(int s, int e, int o, double* d): istart(s), jstart(s), iend(e), offset(o), data(d){}SCMatrixDiagSubBlock::SCMatrixDiagSubBlock(int is, int ie, int js, int o, double* d): istart(is), jstart(js), iend(ie), offset(o), data(d){}SCMatrixDiagSubBlock::SCMatrixDiagSubBlock(StateIn&s): SCMatrixBlock(s){ s.get(istart); s.get(jstart); s.get(iend); s.get(offset); data = 0;}voidSCMatrixDiagSubBlock::save_data_state(StateOut&s){ SCMatrixBlock::save_data_state(s); s.put(istart); s.put(jstart); s.put(iend); s.put(offset);}SCMatrixDiagSubBlock::~SCMatrixDiagSubBlock(){}voidSCMatrixDiagSubBlock::process(SCElementOp*op){ SCMatrixDiagSubBlockIter i(this); op->process(i);}voidSCMatrixDiagSubBlock::process(SCElementOp2*op, SCMatrixBlock* b){ SCMatrixDiagSubBlockIter i(this); SCMatrixDiagSubBlockIter j((SCMatrixDiagSubBlock*)b); op->process(i,j);}voidSCMatrixDiagSubBlock::process(SCElementOp3*op, SCMatrixBlock* b1, SCMatrixBlock* b2){ SCMatrixDiagSubBlockIter i(this); SCMatrixDiagSubBlockIter j((SCMatrixDiagSubBlock*)b1); SCMatrixDiagSubBlockIter k((SCMatrixDiagSubBlock*)b2); op->process(i,j,k);}/////////////////////////////////////////////////////////////////////////////// SCVectorSimpleBlock member functionsstatic ClassDesc SCVectorSimpleBlock_cd( typeid(SCVectorSimpleBlock),"SCVectorSimpleBlock",1,"public SCMatrixBlock", 0, 0, create<SCVectorSimpleBlock>);SCVectorSimpleBlock::SCVectorSimpleBlock(int s, int e): istart(s), iend(e){ data = new double[e-s];}SCVectorSimpleBlock::SCVectorSimpleBlock(StateIn&s): SCMatrixBlock(s){ s.get(istart); s.get(iend); s.get(data);}voidSCVectorSimpleBlock::save_data_state(StateOut&s){ SCMatrixBlock::save_data_state(s); s.put(istart); s.put(iend); s.put(data,iend-istart);}SCMatrixBlock *SCVectorSimpleBlock::deepcopy() const{ SCVectorSimpleBlock *ret = new SCVectorSimpleBlock(istart,iend); ret->blocki = blocki; ret->blockj = blockj; memcpy(ret->data, data, sizeof(double)*ndat()); return ret;}double *SCVectorSimpleBlock::dat(){ return data;}intSCVectorSimpleBlock::ndat() const{ return iend-istart;}SCVectorSimpleBlock::~SCVectorSimpleBlock(){ delete[] data;}voidSCVectorSimpleBlock::process(SCElementOp*op){ SCVectorSimpleBlockIter i(this); op->process(i);}voidSCVectorSimpleBlock::process(SCElementOp2*op, SCMatrixBlock* b){ SCVectorSimpleBlockIter i(this); SCVectorSimpleBlockIter j((SCVectorSimpleBlock*)b); op->process(i,j);}voidSCVectorSimpleBlock::process(SCElementOp3*op, SCMatrixBlock* b1, SCMatrixBlock* b2){ SCVectorSimpleBlockIter i(this); SCVectorSimpleBlockIter j((SCVectorSimpleBlock*)b1); SCVectorSimpleBlockIter k((SCVectorSimpleBlock*)b2); op->process(i,j,k);}/////////////////////////////////////////////////////////////////////////////// SCVectorSimpleSubBlock member functionsstatic ClassDesc SCVectorSimpleSubBlock_cd( typeid(SCVectorSimpleSubBlock),"SCVectorSimpleSubBlock",1,"public SCMatrixBlock", 0, 0, create<SCVectorSimpleSubBlock>);SCVectorSimpleSubBlock::SCVectorSimpleSubBlock(int s, int e, int o, double* d): istart(s), iend(e), offset(o), data(d){}SCVectorSimpleSubBlock::SCVectorSimpleSubBlock(StateIn&s): SCMatrixBlock(s){ s.get(istart); s.get(iend); s.get(offset); data = 0;}voidSCVectorSimpleSubBlock::save_data_state(StateOut&s){ SCMatrixBlock::save_data_state(s); s.put(istart); s.put(iend); s.put(offset);}SCVectorSimpleSubBlock::~SCVectorSimpleSubBlock(){}voidSCVectorSimpleSubBlock::process(SCElementOp*op){ SCVectorSimpleSubBlockIter i(this); op->process(i);}voidSCVectorSimpleSubBlock::process(SCElementOp2*op, SCMatrixBlock* b){ SCVectorSimpleSubBlockIter i(this); SCVectorSimpleSubBlockIter j((SCVectorSimpleSubBlock*)b); op->process(i,j);}voidSCVectorSimpleSubBlock::process(SCElementOp3*op, SCMatrixBlock* b1, SCMatrixBlock* b2){ SCVectorSimpleSubBlockIter i(this); SCVectorSimpleSubBlockIter j((SCVectorSimpleSubBlock*)b1); SCVectorSimpleSubBlockIter k((SCVectorSimpleSubBlock*)b2); op->process(i,j,k);}///////////////////////////////////////////////////////////////////////// SCMatrixSubblockIter// inlined or pure virtual///////////////////////////////////////////////////////////////////////// SCMatrixSimpleSubblockIterSCMatrixSimpleSubblockIter::SCMatrixSimpleSubblockIter( Access access_, const Ref<SCMatrixBlock> &b): SCMatrixSubblockIter(access_){ block_ = b;}voidSCMatrixSimpleSubblockIter::begin(){ if (block_.nonnull()) ready_ = 1; else ready_ = 0;}intSCMatrixSimpleSubblockIter::ready(){ return ready_;}voidSCMatrixSimpleSubblockIter::next(){ ready_ = 0;}SCMatrixBlock *SCMatrixSimpleSubblockIter::block(){ return block_.pointer();}///////////////////////////////////////////////////////////////////////// SCMatrixListSubblockIterSCMatrixListSubblockIter::SCMatrixListSubblockIter( Access access, const Ref<SCMatrixBlockList> &list ): SCMatrixSubblockIter(access), list_(list){}voidSCMatrixListSubblockIter::begin(){ iter_ = list_->begin();}intSCMatrixListSubblockIter::ready(){ return iter_ != list_->end();}voidSCMatrixListSubblockIter::next(){ iter_++;}SCMatrixBlock *SCMatrixListSubblockIter::block(){ return iter_.block();}///////////////////////////////////////////////////////////////////////// SCMatrixNullSubblockIterSCMatrixNullSubblockIter::SCMatrixNullSubblockIter(): SCMatrixSubblockIter(None){}SCMatrixNullSubblockIter::SCMatrixNullSubblockIter(Access access): SCMatrixSubblockIter(access){}voidSCMatrixNullSubblockIter::begin(){}intSCMatrixNullSubblockIter::ready(){ return 0;}voidSCMatrixNullSubblockIter::next(){}SCMatrixBlock *SCMatrixNullSubblockIter::block(){ return 0;}///////////////////////////////////////////////////////////////////////// SCMatrixCompositeSubblockIterSCMatrixCompositeSubblockIter::SCMatrixCompositeSubblockIter( Ref<SCMatrixSubblockIter>& i1, Ref<SCMatrixSubblockIter>& i2): SCMatrixSubblockIter(None){ niters_ = 0; if (i1.nonnull()) { niters_++; } if (i2.nonnull()) { niters_++; } iters_ = new Ref<SCMatrixSubblockIter>[niters_]; iiter_ = 0; if (i1.nonnull()) { iters_[iiter_] = i1; iiter_++; } if (i2.nonnull()) { iters_[iiter_] = i2; iiter_++; } if (niters_) access_ = iters_[0]->access(); for (int i=0; i<niters_; i++) { if (iters_[i]->access() != access_) { ExEnv::errn() << "SCMatrixCompositeSubblockIter: access not compatible" << endl; abort(); } }}SCMatrixCompositeSubblockIter::SCMatrixCompositeSubblockIter( Access access_, int niters): SCMatrixSubblockIter(access_){ niters_ = niters; iters_ = new Ref<SCMatrixSubblockIter>[niters_];}SCMatrixCompositeSubblockIter::~SCMatrixCompositeSubblockIter(){ delete[] iters_;}voidSCMatrixCompositeSubblockIter::set_iter(int i, const Ref<SCMatrixSubblockIter>& iter){ iters_[i] = iter; if (iters_[i]->access() != access_) { ExEnv::errn() << "SCMatrixCompositeSubblockIter: access not compatible" << endl; abort(); }}voidSCMatrixCompositeSubblockIter::begin(){ if (niters_ == 0) return; iiter_ = 0; iters_[iiter_]->begin(); while (!iters_[iiter_]->ready()) { if (iiter_ < niters_-1) { iiter_++; iters_[iiter_]->begin(); } else break; }}intSCMatrixCompositeSubblockIter::ready(){ return iters_[iiter_]->ready();}voidSCMatrixCompositeSubblockIter::next(){ iters_[iiter_]->next(); while (!iters_[iiter_]->ready()) { if (iiter_ < niters_-1) { iiter_++; iters_[iiter_]->begin(); } else break; }}SCMatrixBlock *SCMatrixCompositeSubblockIter::block(){ return iters_[iiter_]->block();}///////////////////////////////////////////////////////////////////////// SCMatrixJointSubblockIterSCMatrixJointSubblockIter::SCMatrixJointSubblockIter( const Ref<SCMatrixSubblockIter>& i1, const Ref<SCMatrixSubblockIter>& i2, const Ref<SCMatrixSubblockIter>& i3, const Ref<SCMatrixSubblockIter>& i4, const Ref<SCMatrixSubblockIter>& i5): SCMatrixSubblockIter(None){ niters_ = 0; if (i1.nonnull()) { niters_++; } if (i2.nonnull()) { niters_++; } if (i3.nonnull()) { niters_++; } if (i4.nonnull()) { niters_++; } if (i5.nonnull()) { niters_++; } iters_ = new Ref<SCMatrixSubblockIter>[niters_]; int i = 0; if (i1.nonnull()) { iters_[i] = i1; i++; } if (i2.nonnull()) { iters_[i] = i2; i++; } if (i3.nonnull()) { iters_[i] = i3; i++; } if (i4.nonnull()) { iters_[i] = i4; i++; } if (i5.nonnull()) { iters_[i] = i5; i++; }}SCMatrixJointSubblockIter::~SCMatrixJointSubblockIter(){ delete[] iters_;}voidSCMatrixJointSubblockIter::begin(){ for (int i=0; i<niters_; i++) { iters_[i]->begin(); }}intSCMatrixJointSubblockIter::ready(){ int nready = 0; for (int i=0; i<niters_; i++) { nready += (iters_[i]->ready()?1:0); } if (nready == niters_) return 1; else if (!nready) return 0; ExEnv::errn() << "SCMatrixJointSubblockIter: incompatible iterators" << endl; abort(); return 0;}voidSCMatrixJointSubblockIter::next(){ for (int i=0; i<niters_; i++) { iters_[i]->next(); }}SCMatrixBlock *SCMatrixJointSubblockIter::block(){ return block(0);}SCMatrixBlock *SCMatrixJointSubblockIter::block(int b){ return iters_[b]->block();}/////////////////////////////////////////////////////////////////////////////// Local Variables:// mode: c++// c-file-style: "CLJ"// End:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -