00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
#ifdef __GNUC__
00029
#pragma interface
00030
#endif
00031
00032
#ifndef _math_scmat_dist_h
00033
#define _math_scmat_dist_h
00034
00035
#include <util/group/message.h>
00036
#include <util/group/mstate.h>
00037
00038
#include <math/scmat/block.h>
00039
#include <math/scmat/matrix.h>
00040
#include <math/scmat/abstract.h>
00041
00042
namespace sc {
00043
00046 class DistSCMatrixKit:
public SCMatrixKit {
00047
public:
00048
DistSCMatrixKit(
const Ref<MessageGrp> &grp = 0);
00049
DistSCMatrixKit(
const Ref<KeyVal>&);
00050 ~
DistSCMatrixKit();
00051
SCMatrix*
matrix(
const RefSCDimension&,
const RefSCDimension&);
00052
SymmSCMatrix* symmmatrix(
const RefSCDimension&);
00053
DiagSCMatrix* diagmatrix(
const RefSCDimension&);
00054
SCVector* vector(
const RefSCDimension&);
00055 };
00056
00057
00058
class DistSCVector:
public SCVector {
00059
friend class DistSCMatrix;
00060
friend class DistSymmSCMatrix;
00061
friend class DistDiagSCMatrix;
00062
protected:
00063
Ref<SCMatrixBlockList> blocklist;
00064
00065
void init_blocklist();
00066
double *find_element(
int i)
const;
00067
int element_to_node(
int i)
const;
00068
int block_to_node(
int) const;
00069
Ref<
SCMatrixBlock> block_to_block(
int) const;
00070
void error(const
char *);
00071 public:
00072 DistSCVector(const
RefSCDimension&,
DistSCMatrixKit*);
00073 ~DistSCVector();
00074
void assign_p(const
double*);
00075
void assign_v(
SCVector*a);
00076
void convert(
double* v) const;
00077
void convert(
SCVector *);
00078
00079
void set_element(
int,
double);
00080
void accumulate_element(
int,
double);
00081
double get_element(
int) const;
00082
void accumulate(const SCVector*);
00083
void accumulate(const
SCMatrix*m);
00084
double scalar_product(SCVector*);
00085
void accumulate_product_rv(
SCMatrix *, SCVector *);
00086
void element_op(const
Ref<
SCElementOp>&);
00087
void element_op(const
Ref<
SCElementOp2>&,
00088 SCVector*);
00089
void element_op(const
Ref<
SCElementOp3>&,
00090 SCVector*,SCVector*);
00091
void vprint(const
char* title=0,
00092 std::ostream& out=
ExEnv::out0(),
int =10) const;
00093
00094
Ref<
SCMatrixSubblockIter> local_blocks(
SCMatrixSubblockIter::Access);
00095
Ref<
SCMatrixSubblockIter> all_blocks(
SCMatrixSubblockIter::Access);
00096
00097
Ref<DistSCMatrixKit> skit();
00098 };
00099
00100 class DistSCMatrix: public SCMatrix {
00101
friend class DistSymmSCMatrix;
00102
friend class DistDiagSCMatrix;
00103
friend class DistSCVector;
00104
protected:
00105
Ref<SCMatrixBlockList> blocklist;
00106
00107
int vecoff;
00108
int nvec;
00109
double **vec;
00110
protected:
00111
00112
void init_blocklist();
00113
void error(
const char *);
00114
double *find_element(
int i,
int j)
const;
00115
int element_to_node(
int i,
int j)
const;
00116
int block_to_node(
int,
int) const;
00117
Ref<
SCMatrixBlock> block_to_block(
int,
int) const;
00118
Ref<
SCBlockInfo> rowblocks()
const {
return d1->blocks(); }
00119 Ref<SCBlockInfo> colblocks()
const {
return d2->blocks(); }
00120
00121
enum VecOp {CopyFromVec, CopyToVec, AccumFromVec, AccumToVec};
00122
enum Form { Row, Col } form;
00123
void create_vecform(Form,
int nvec = -1);
00124
void delete_vecform();
00125
void vecform_op(VecOp op,
int *ivec = 0);
00126
void vecform_zero();
00127
public:
00128 DistSCMatrix(
const RefSCDimension&,
const RefSCDimension&,
00129 DistSCMatrixKit*);
00130 ~DistSCMatrix();
00131
00132
00133
double get_element(
int,
int) const;
00134
void set_element(
int,
int,
double);
00135
void accumulate_element(
int,
int,
double);
00136 SCMatrix * get_subblock(
int,
int,
int,
int);
00137
void assign_subblock(SCMatrix*,
int,
int,
int,
int,
int=0,
int=0);
00138
void accumulate_subblock(SCMatrix*,
int,
int,
int,
int,
int=0,
int=0);
00139 SCVector * get_row(
int i);
00140 SCVector * get_column(
int i);
00141
void assign_row(SCVector *v,
int i);
00142
void assign_column(SCVector *v,
int i);
00143
void accumulate_row(SCVector *v,
int i);
00144
void accumulate_column(SCVector *v,
int i);
00145
00146
void accumulate_outer_product(SCVector*,SCVector*);
00147
void accumulate_product_rr(SCMatrix*,SCMatrix*);
00148
void accumulate(const SCMatrix*);
00149
void accumulate(const SymmSCMatrix*);
00150
void accumulate(const DiagSCMatrix*);
00151
void accumulate(const SCVector*);
00152
void transpose_this();
00153
double invert_this();
00154
double solve_this(SCVector*);
00155
double determ_this();
00156
double trace();
00157
void gen_invert_this();
00158
void schmidt_orthog(SymmSCMatrix*,
int);
00159
int schmidt_orthog_tol(SymmSCMatrix*,
double tol,
double *res=0);
00160
void element_op(const Ref<SCElementOp>&);
00161
void element_op(const Ref<SCElementOp2>&,
00162 SCMatrix*);
00163
void element_op(const Ref<SCElementOp3>&,
00164 SCMatrix*,SCMatrix*);
00165
void vprint(const
char* title=0,
00166 std::ostream& out=ExEnv::out0(),
int =10);
00167
void vprint(const
char* title=0,
00168 std::ostream& out=ExEnv::out0(),
int =10) const;
00169
00170 Ref<SCMatrixSubblockIter> local_blocks(SCMatrixSubblockIter::Access);
00171 Ref<SCMatrixSubblockIter> all_blocks(SCMatrixSubblockIter::Access);
00172
00173 Ref<DistSCMatrixKit> skit();
00174 };
00175
00176 class DistSymmSCMatrix: public SymmSCMatrix {
00177
friend class DistSCMatrix;
00178
friend class DistDiagSCMatrix;
00179
friend class DistSCVector;
00180
protected:
00181 Ref<SCMatrixBlockList> blocklist;
00182
protected:
00183
00184
void init_blocklist();
00185
double *find_element(
int i,
int j)
const;
00186
int element_to_node(
int i,
int j)
const;
00187
int block_to_node(
int,
int) const;
00188 Ref<SCMatrixBlock> block_to_block(
int,
int) const;
00189
00190
void error(const
char *msg);
00191 public:
00192 DistSymmSCMatrix(const RefSCDimension&, DistSCMatrixKit*);
00193 ~DistSymmSCMatrix();
00194
00195
00196
double get_element(
int,
int) const;
00197
void set_element(
int,
int,
double);
00198
void accumulate_element(
int,
int,
double);
00199
00200 SCMatrix * get_subblock(
int,
int,
int,
int);
00201 SymmSCMatrix * get_subblock(
int,
int);
00202
void assign_subblock(SCMatrix*,
int,
int,
int,
int);
00203
void assign_subblock(SymmSCMatrix*,
int,
int);
00204
void accumulate_subblock(SCMatrix*,
int,
int,
int,
int);
00205
void accumulate_subblock(SymmSCMatrix*,
int,
int);
00206 SCVector * get_row(
int i);
00207
void assign_row(SCVector *v,
int i);
00208
void accumulate_row(SCVector *v,
int i);
00209
00210
void accumulate_product_rr(SCMatrix*,SCMatrix*);
00211
void accumulate(const SymmSCMatrix*);
00212
double invert_this();
00213
double solve_this(SCVector*);
00214
double trace();
00215
double determ_this();
00216
void gen_invert_this();
00217
00218
void diagonalize(DiagSCMatrix*,SCMatrix*);
00219
void accumulate_symmetric_sum(SCMatrix*);
00220
void element_op(const Ref<SCElementOp>&);
00221
void element_op(const Ref<SCElementOp2>&,
00222 SymmSCMatrix*);
00223
void element_op(const Ref<SCElementOp3>&,
00224 SymmSCMatrix*,SymmSCMatrix*);
00225
00226 virtual
void convert_accumulate(SymmSCMatrix*);
00227
00228 Ref<SCMatrixSubblockIter> local_blocks(SCMatrixSubblockIter::Access);
00229 Ref<SCMatrixSubblockIter> all_blocks(SCMatrixSubblockIter::Access);
00230
00231 Ref<DistSCMatrixKit> skit();
00232 };
00233
00234 class DistDiagSCMatrix: public DiagSCMatrix {
00235
friend class DistSCMatrix;
00236
friend class DistSymmSCMatrix;
00237
friend class DistSCVector;
00238
protected:
00239 Ref<SCMatrixBlockList> blocklist;
00240
00241
void init_blocklist();
00242
double *find_element(
int i)
const;
00243
int element_to_node(
int i)
const;
00244
int block_to_node(
int) const;
00245 Ref<SCMatrixBlock> block_to_block(
int) const;
00246
void error(const
char *msg);
00247 public:
00248 DistDiagSCMatrix(const RefSCDimension&, DistSCMatrixKit*);
00249 ~DistDiagSCMatrix();
00250
00251
00252
double get_element(
int) const;
00253
void set_element(
int,
double);
00254
void accumulate_element(
int,
double);
00255
void accumulate(const DiagSCMatrix*);
00256
double invert_this();
00257
double determ_this();
00258
double trace();
00259
void gen_invert_this();
00260
00261
void element_op(const Ref<SCElementOp>&);
00262
void element_op(const Ref<SCElementOp2>&,
00263 DiagSCMatrix*);
00264
void element_op(const Ref<SCElementOp3>&,
00265 DiagSCMatrix*,DiagSCMatrix*);
00266
00267 Ref<SCMatrixSubblockIter> local_blocks(SCMatrixSubblockIter::Access);
00268 Ref<SCMatrixSubblockIter> all_blocks(SCMatrixSubblockIter::Access);
00269
00270 Ref<DistSCMatrixKit> skit();
00271 };
00272
00273 class DistSCMatrixListSubblockIter: public SCMatrixListSubblockIter {
00274
protected:
00275 Ref<MessageGrp> grp_;
00276 StateSend out_;
00277 StateRecv in_;
00278
int step_;
00279 Ref<SCMatrixBlockList> locallist_;
00280
00281
void maybe_advance_list();
00282
void advance_list();
00283
public:
00284 DistSCMatrixListSubblockIter(Access,
00285
const Ref<SCMatrixBlockList> &locallist,
00286
const Ref<MessageGrp> &grp);
00287
void begin();
00288
void next();
00289 ~DistSCMatrixListSubblockIter();
00290 };
00291
00292 }
00293
00294
#endif
00295
00296
00297
00298
00299