3
#define GA_DATA_TYPE C_DBL
5
static int sTmpVar = 0;
9
* Constructors and Destructor of GlobalArray
13
GA::GlobalArray::GlobalArray(int type, int ndim, int dims[], char *arrayname,
15
mHandle = NGA_Create(type, ndim, dims, arrayname, chunk);
16
if(!mHandle) GA_Error((char *)" GA creation failed",0);
19
GA::GlobalArray::GlobalArray(int type, int ndim, int dims[], char *arrayname,
20
int block[], int maps[]) {
21
mHandle = NGA_Create_irreg(type, ndim, dims, arrayname, block, maps);
22
if(!mHandle) GA_Error((char *)" GA creation failed",0);
25
GA::GlobalArray::GlobalArray(int type, int ndim, int dims[], int width[],
26
char *arrayname, int chunk[], char ghosts) {
27
mHandle = NGA_Create_ghosts(type, ndim, dims, width, arrayname, chunk);
28
if(!mHandle) GA_Error((char *)" GA creation failed",0);
31
GA::GlobalArray::GlobalArray(int type, int ndim, int dims[], int width[],
32
char *arrayname, int block[], int maps[],
34
mHandle = NGA_Create_ghosts_irreg(type, ndim, dims, width, arrayname, block,
36
if(!mHandle) GA_Error((char *)" GA creation failed",0);
39
GA::GlobalArray::GlobalArray(const GA::GlobalArray &g_a, char *arrayname) {
40
mHandle = GA_Duplicate(g_a.mHandle, arrayname);
41
if(!mHandle) GA_Error((char *)" GA creation failed",0);
44
GA::GlobalArray::GlobalArray(const GA::GlobalArray &g_a) {
47
sprintf(temp_name, "tmpGA%d", sTmpVar++);
48
mHandle = GA_Duplicate(g_a.mHandle, temp_name);
49
if(!mHandle) GA_Error((char *)" GA creation failed",0);
50
GA_Copy(g_a.mHandle, mHandle);
53
GA::GlobalArray::GlobalArray() {
58
sprintf(temp_name, "tmpGA%d", sTmpVar++);
60
dimensions = new int [n_dim];
61
for(int i=0; i<n_dim; i++) dimensions[i] = DEF_DIMS;
62
mHandle = NGA_Create(GA_DATA_TYPE, n_dim, dimensions, temp_name, NULL);
63
if(!mHandle) GA_Error((char *)" GA creation failed",0);
68
GA::GlobalArray::~GlobalArray() {
73
/*********************************************************************
74
* Member functions of GA::GlobalArray *
75
*********************************************************************/
78
GA::GlobalArray::acc(int lo[], int hi[], void *buf, int ld[], void *alpha) const {
79
NGA_Acc(mHandle, lo, hi, buf, ld, alpha);
83
GA::GlobalArray::access(int lo[], int hi[], void *ptr, int ld[]) const {
84
NGA_Access(mHandle, lo, hi, ptr, ld);
88
GA::GlobalArray::accessGhosts(int dims[], void *ptr, int ld[]) const {
89
NGA_Access_ghosts(mHandle, dims, ptr, ld);
93
GA::GlobalArray::accessGhostElement(void *ptr, int subscript[], int ld[]) const {
94
NGA_Access_ghost_element(mHandle, ptr, subscript, ld);
98
GA::GlobalArray::add(void *alpha, const GA::GlobalArray * g_a,
99
void *beta, const GA::GlobalArray * g_b) const {
100
GA_Add(alpha, g_a->mHandle, beta, g_b->mHandle, mHandle);
104
GA::GlobalArray::addPatch (void *alpha,
105
const GA::GlobalArray * g_a, int alo[], int ahi[],
107
const GA::GlobalArray * g_b, int blo[], int bhi[],
108
int clo[], int chi[]) const {
109
NGA_Add_patch(alpha, g_a->mHandle, alo, ahi, beta,
110
g_b->mHandle, blo, bhi, mHandle, clo, chi);
114
GA::GlobalArray::checkHandle(char* string) const {
115
GA_Check_handle(mHandle, string);
119
GA::GlobalArray::compareDistr(const GA::GlobalArray *g_a) const {
120
return GA_Compare_distr(mHandle, g_a->mHandle);
124
GA::GlobalArray::copy(const GA::GlobalArray *g_a) const {
125
GA_Copy(g_a->mHandle, mHandle);
129
GA::GlobalArray::copyPatch(char trans, const GA::GlobalArray* ga, int alo[],
130
int ahi[], int blo[], int bhi[]) const {
131
NGA_Copy_patch(trans, ga->mHandle, alo, ahi, mHandle, blo, bhi);
135
GA::GlobalArray::ddot(const GA::GlobalArray * g_a) const {
136
return GA_Ddot(mHandle, g_a->mHandle);
140
GA::GlobalArray::ddotPatch(char ta, int alo[], int ahi[],
141
const GA::GlobalArray * g_a, char tb,
142
int blo[], int bhi[]) const {
143
return NGA_Ddot_patch(mHandle, ta, alo, ahi, g_a->mHandle, tb, blo, bhi);
147
GA::GlobalArray::destroy() const {
152
GA::GlobalArray::dgemm(char ta, char tb, int m, int n, int k, double alpha,
153
const GA::GlobalArray *g_a, const GA::GlobalArray *g_b,
155
GA_Dgemm(ta, tb, m, n, k, alpha, g_a->mHandle, g_b->mHandle,
160
GA::GlobalArray::diag(const GA::GlobalArray *g_s, GA::GlobalArray *g_v,
162
GA_Diag(mHandle, g_s->mHandle, g_v->mHandle, eval);
166
GA::GlobalArray::diagReuse(int control, const GA::GlobalArray *g_s,
167
GA::GlobalArray *g_v, void *eval) const {
168
GA_Diag_reuse(control, mHandle, g_s->mHandle, g_v->mHandle, eval);
172
GA::GlobalArray::diagStd(GlobalArray *g_v, void *eval) const {
173
GA_Diag_std(mHandle, g_v->mHandle, eval);
177
GA::GlobalArray::diagSeq(const GA::GlobalArray * g_s,
178
const GA::GlobalArray * g_v, void *eval) const {
179
GA_Diag_seq(mHandle, g_s->mHandle, g_v->mHandle, eval);
183
GA::GlobalArray::diagStdSeq(const GA::GlobalArray * g_v, void *eval) const {
184
GA_Diag_std_seq(mHandle, g_v->mHandle, eval);
188
GA::GlobalArray::distribution(int me, int* lo, int* hi) const {
189
NGA_Distribution(mHandle, me, lo, hi);
193
GA::GlobalArray::fdot(const GA::GlobalArray * g_a) const {
194
return GA_Fdot(mHandle, g_a->mHandle);
198
GA::GlobalArray::fdotPatch(char t_a, int alo[], int ahi[],
199
const GA::GlobalArray * g_b, char t_b, int blo[],
201
return NGA_Fdot_patch(mHandle, t_a, alo, ahi,
202
g_b->mHandle, t_b, blo, bhi);
206
GA::GlobalArray::fill(void *value) const {
207
GA_Fill(mHandle, value);
211
GA::GlobalArray::fillPatch (int lo[], int hi[], void *val) const {
212
NGA_Fill_patch(mHandle, lo, hi, val);
216
GA::GlobalArray::gather(void *v, int * subsarray[], int n) const {
217
NGA_Gather(mHandle, v, subsarray, n);
221
GA::GlobalArray::get(int lo[], int hi[], void *buf, int ld[]) const {
222
NGA_Get(mHandle, lo, hi, buf, ld);
226
GA::GlobalArray::hasGhosts() const {
227
return GA_Has_ghosts(mHandle);
231
GA::GlobalArray::idot(const GA::GlobalArray * g_a) const {
232
return GA_Idot(mHandle, g_a->mHandle);
236
GA::GlobalArray::idotPatch(char ta, int alo[], int ahi[],
237
const GA::GlobalArray * g_a, char tb,
238
int blo[], int bhi[]) const {
239
return NGA_Idot_patch(mHandle, ta, alo, ahi, g_a->mHandle, tb, blo, bhi);
243
GA::GlobalArray::inquire(int *type, int *ndim, int dims[]) const {
244
NGA_Inquire(mHandle, type, ndim, dims);
248
GA::GlobalArray::inquireName() const {
249
return GA_Inquire_name(mHandle);
253
GA::GlobalArray::ldot(const GA::GlobalArray * g_a) const {
254
return GA_Ldot(mHandle, g_a->mHandle);
258
GA::GlobalArray::lltSolve(const GA::GlobalArray * g_a) const {
259
return GA_Llt_solve(g_a->mHandle, mHandle);
263
GA::GlobalArray::locate(int subscript[]) const {
264
return NGA_Locate(mHandle, subscript);
268
GA::GlobalArray::locateRegion(int lo[], int hi[], int map[], int procs[]) const {
269
return NGA_Locate_region(mHandle, lo, hi, map, procs);
273
GA::GlobalArray::luSolve(char trans, const GA::GlobalArray * g_a) const {
274
GA_Lu_solve(trans, g_a->mHandle, mHandle);
278
GA::GlobalArray::matmulPatch(char transa, char transb, void* alpha,
279
void *beta, const GA::GlobalArray *g_a,
280
int ailo, int aihi, int ajlo, int ajhi,
281
const GA::GlobalArray *g_b,
282
int bilo, int bihi, int bjlo, int bjhi,
283
int cilo, int cihi, int cjlo, int cjhi) const {
284
GA_Matmul_patch(transa, transb, alpha, beta,
285
g_a->mHandle, ailo, aihi, ajlo, ajhi,
286
g_b->mHandle, bilo, bihi, bjlo, bjhi,
287
mHandle, cilo, cihi, cjlo, cjhi);
291
GA::GlobalArray::matmulPatch(char transa, char transb, void* alpha, void *beta,
292
const GA::GlobalArray *g_a, int *alo, int *ahi,
293
const GA::GlobalArray *g_b, int *blo, int *bhi,
294
int *clo, int *chi) const {
295
NGA_Matmul_patch(transa, transb, alpha, beta, g_a->mHandle, alo, ahi,
296
g_b->mHandle, blo, bhi, mHandle, clo, chi);
300
GA::GlobalArray::nblock(int numblock[]) const {
301
GA_Nblock(mHandle, numblock);
305
GA::GlobalArray::ndim() const {
306
return GA_Ndim(mHandle);
310
GA::GlobalArray::periodicAcc(int lo[], int hi[], void* buf, int ld[],
312
NGA_Periodic_acc(mHandle, lo, hi, buf, ld, alpha);
316
GA::GlobalArray::periodicGet(int lo[], int hi[], void* buf, int ld[]) const {
317
NGA_Periodic_get(mHandle, lo, hi, buf, ld);
321
GA::GlobalArray::periodicPut(int lo[], int hi[], void* buf, int ld[]) const {
322
NGA_Periodic_put(mHandle, lo, hi, buf, ld);
326
GA::GlobalArray::print() const {
331
GA::GlobalArray::printDistribution() const {
332
GA_Print_distribution(mHandle);
336
GA::GlobalArray::printFile(FILE *file) const {
337
GA_Print_file(file, mHandle);
341
GA::GlobalArray::printPatch(int* lo, int* hi, int pretty) const {
342
NGA_Print_patch(mHandle, lo, hi, pretty);
346
GA::GlobalArray::procTopology(int proc, int coord[]) const {
347
NGA_Proc_topology(mHandle, proc, coord);
351
GA::GlobalArray::put(int lo[], int hi[], void *buf, int ld[]) const {
352
NGA_Put(mHandle, lo, hi, buf, ld);
356
GA::GlobalArray::readInc(int subscript[], long inc) const {
357
return NGA_Read_inc(mHandle, subscript, inc);
361
GA::GlobalArray::release(int lo[], int hi[]) const {
362
NGA_Release(mHandle, lo, hi);
366
GA::GlobalArray::releaseUpdate(int lo[], int hi[]) const {
367
NGA_Release_update(mHandle, lo, hi);
371
GA::GlobalArray::scale(void *value) const {
372
GA_Scale(mHandle, value);
376
GA::GlobalArray::scalePatch (int lo[], int hi[], void *val) const {
377
NGA_Scale_patch(mHandle, lo, hi, val);
381
GA::GlobalArray::scatter(void *v, int *subsarray[], int n) const {
382
NGA_Scatter(mHandle, v, subsarray, n);
386
GA::GlobalArray::solve(const GA::GlobalArray * g_a) const {
387
return GA_Solve(g_a->mHandle, mHandle);
391
GA::GlobalArray::spdInvert() const {
392
return GA_Spd_invert(mHandle);
396
GA::GlobalArray::selectElem(char *op, void* val, int index[]) const {
397
NGA_Select_elem(mHandle, op, val, index);
401
GA::GlobalArray::sgemm(char ta, char tb, int m, int n, int k, float alpha,
402
const GA::GlobalArray *g_a, const GA::GlobalArray *g_b,
404
GA_Sgemm(ta, tb, m, n, k, alpha, g_a->mHandle, g_b->mHandle,
409
GA::GlobalArray::symmetrize() const {
410
GA_Symmetrize(mHandle);
414
GA::GlobalArray::transpose(const GA::GlobalArray * g_a) const {
415
GA_Transpose(mHandle, g_a->mHandle);
419
GA::GlobalArray::updateGhosts() const {
420
GA_Update_ghosts(mHandle);
424
GA::GlobalArray::updateGhostDir(int dimension, int idir, int cflag) const {
425
return NGA_Update_ghost_dir(mHandle, dimension, idir, cflag);
429
GA::GlobalArray::zdot(const GA::GlobalArray * g_a) const {
430
return GA_Zdot(mHandle, g_a->mHandle);
434
GA::GlobalArray::zdotPatch(char ta, int alo[], int ahi[],
435
const GA::GlobalArray * g_a, char tb,
436
int blo[], int bhi[]) const {
437
return NGA_Zdot_patch(mHandle, ta, alo, ahi, g_a->mHandle, tb, blo, bhi);
441
GA::GlobalArray::zero() const {
446
GA::GlobalArray::zeroPatch (int lo[], int hi[]) const {
447
NGA_Zero_patch(mHandle, lo, hi);
451
GA::GlobalArray::zgemm(char ta, char tb, int m, int n, int k,
453
const GA::GlobalArray *g_a, const GA::GlobalArray *g_b,
454
DoubleComplex beta) const {
455
GA_Zgemm(ta, tb, m, n, k, alpha, g_a->mHandle, g_b->mHandle,
459
/* recent additions */
462
GA::GlobalArray::absValue() const {
463
GA_Abs_value(mHandle);
467
GA::GlobalArray::addConstant(void* alpha) const {
468
GA_Add_constant(mHandle, alpha);
472
GA::GlobalArray::recip() const {
477
GA::GlobalArray::elemMultiply(const GA::GlobalArray * g_a,
478
const GA::GlobalArray * g_b) const {
479
GA_Elem_multiply(g_a->mHandle, g_b->mHandle, mHandle);
483
GA::GlobalArray::elemDivide(const GA::GlobalArray * g_a,
484
const GA::GlobalArray * g_b) const {
485
GA_Elem_divide(g_a->mHandle, g_b->mHandle, mHandle);
490
GA::GlobalArray::elemMaximum(const GA::GlobalArray * g_a,
491
const GA::GlobalArray * g_b) const {
492
GA_Elem_maximum(g_a->mHandle, g_b->mHandle, mHandle);
497
GA::GlobalArray::elemMinimum(const GA::GlobalArray * g_a,
498
const GA::GlobalArray * g_b) const {
499
GA_Elem_minimum(g_a->mHandle, g_b->mHandle, mHandle);
503
GA::GlobalArray::absValuePatch(int *lo, int *hi) const {
504
GA_Abs_value_patch(mHandle, lo, hi);
508
GA::GlobalArray::addConstantPatch(int *lo,int *hi, void *alpha) const {
509
GA_Add_constant_patch(mHandle, lo, hi, alpha);
513
GA::GlobalArray::recipPatch(int *lo, int *hi) const {
514
GA_Recip_patch(mHandle, lo, hi);
518
GA::GlobalArray::stepMax(const GA::GlobalArray * g_a, double *step) const {// CHECK all Step Max functions
519
GA_Step_max(mHandle, g_a->mHandle, step);
523
GA::GlobalArray::stepMaxPatch(int *alo, int *ahi,
524
const GA::GlobalArray * g_b, int *blo, int *bhi,
525
double *step) const {
526
GA_Step_max_patch(mHandle, alo, ahi, g_b->mHandle, blo, bhi, step);
530
GA::GlobalArray::elemMultiplyPatch(const GA::GlobalArray * g_a,
532
const GA::GlobalArray * g_b,
534
int *clo,int *chi) const {
535
GA_Elem_multiply_patch(g_a->mHandle, alo, ahi, g_b->mHandle, blo, bhi,
540
GA::GlobalArray::elemDividePatch(const GA::GlobalArray * g_a,int *alo,int *ahi,
541
const GA::GlobalArray * g_b,int *blo,int *bhi,
542
int *clo,int *chi) const {
543
GA_Elem_divide_patch(g_a->mHandle, alo, ahi, g_b->mHandle, blo, bhi,
548
GA::GlobalArray::elemMaximumPatch(const GA::GlobalArray * g_a,
550
const GA::GlobalArray * g_b,
552
int *clo,int *chi) const {
553
GA_Elem_maximum_patch(g_a->mHandle, alo, ahi, g_b->mHandle, blo, bhi,
558
GA::GlobalArray::elemMinimumPatch(const GA::GlobalArray * g_a,
560
const GA::GlobalArray * g_b,
562
int *clo,int *chi) const {
563
GA_Elem_minimum_patch(g_a->mHandle, alo, ahi, g_b->mHandle, blo, bhi,
569
/*Added by Limin for matrix operations*/
572
GA::GlobalArray::shiftDiagonal(void *c) const {
573
GA_Shift_diagonal(mHandle, c);
577
GA::GlobalArray::setDiagonal(const GA::GlobalArray * g_v) const {
578
GA_Set_diagonal(mHandle, g_v->mHandle);
582
GA::GlobalArray::zeroDiagonal() const {
583
GA_Zero_diagonal(mHandle);
587
GA::GlobalArray::addDiagonal(const GA::GlobalArray * g_v) const {
588
GA_Add_diagonal(mHandle, g_v->mHandle);
592
GA::GlobalArray::getDiagonal(const GA::GlobalArray * g_a) const {
593
GA_Get_diag(g_a->mHandle, mHandle);
597
GA::GlobalArray::scaleRows(const GA::GlobalArray * g_v) const {
598
GA_Scale_rows(mHandle, g_v->mHandle);
602
GA::GlobalArray::scaleCols(const GA::GlobalArray * g_v) const {
603
GA_Scale_cols(mHandle, g_v->mHandle);
607
GA::GlobalArray::norm1(double *nm) const {
608
GA_Norm1(mHandle, nm);
612
GA::GlobalArray::normInfinity(double *nm) const {
613
GA_Norm_infinity(mHandle, nm);
617
GA::GlobalArray::median(const GA::GlobalArray * g_a,
618
const GA::GlobalArray * g_b,
619
const GA::GlobalArray * g_c) const {
620
GA_Median(g_a->mHandle, g_b->mHandle, g_c->mHandle, mHandle);
624
GA::GlobalArray::medianPatch(const GA::GlobalArray * g_a, int *alo, int *ahi,
625
const GA::GlobalArray * g_b, int *blo, int *bhi,
626
const GA::GlobalArray * g_c, int *clo, int *chi,
627
int *mlo, int *mhi) const {
628
GA_Median_patch(g_a->mHandle, alo, ahi, g_b->mHandle, blo, bhi,
629
g_c->mHandle, clo, chi, mHandle, mlo, mhi);