31
34
for(h=0; h < InBuf->params->nirreps; h++) {
33
dpd_buf4_mat_irrep_init(InBuf, h);
34
dpd_buf4_mat_irrep_rd(InBuf, h);
36
dpd_buf4_mat_irrep_init(&OutBuf, h);
39
for(row=0; row < InBuf->params->rowtot[h]; row++) {
40
for(col=0; col < InBuf->params->coltot[h^my_irrep]; col++) {
41
OutBuf.matrix[h][row][col] = InBuf->matrix[h][row][col];
46
/* Use memcpy() instead of element by element copy */
47
rowtot = InBuf->params->rowtot[h];
48
coltot = InBuf->params->coltot[h^my_irrep];
51
memcpy((void *) &(OutBuf.matrix[h][0][0]),
52
(const void *) &(InBuf->matrix[h][0][0]),
53
sizeof(double)*rowtot*coltot);
55
dpd_buf4_mat_irrep_wrt(&OutBuf, h);
57
dpd_buf4_mat_irrep_close(&OutBuf, h);
58
dpd_buf4_mat_irrep_close(InBuf, h);
36
memoryd = dpd_memfree()/2; /* use half the memory for each buf4 */
38
rowtot = InBuf->params->rowtot[h];
39
coltot = InBuf->params->coltot[h^my_irrep];
41
if(rowtot && coltot) {
43
rows_per_bucket = memoryd/coltot;
44
/* enough memory for the whole matrix? */
45
if(rows_per_bucket > rowtot)
46
rows_per_bucket = rowtot;
48
if(!rows_per_bucket) dpd_error("buf4_scmcopy: Not enough memory for one row!", stderr);
50
nbuckets = (int) ceil(((double) rowtot)/((double) rows_per_bucket));
52
rows_left = rowtot % rows_per_bucket;
58
fprintf(stderr, "buf4_copy: memory information.\n");
59
fprintf(stderr, "buf4_copy: rowtot[%d] = %d.\n", h, InBuf->params->rowtot[h]);
60
fprintf(stderr, "buf4_copy: nbuckets = %d\n", nbuckets);
61
fprintf(stderr, "buf4_copy: rows_per_bucket = %d\n", rows_per_bucket);
62
fprintf(stderr, "buf4_copy: rows_left = %d\n", rows_left);
63
fprintf(stderr, "buf4_copy: out-of-core algorithm used\n");
70
dpd_buf4_mat_irrep_init(InBuf, h);
71
dpd_buf4_mat_irrep_rd(InBuf, h);
73
dpd_buf4_mat_irrep_init(&OutBuf, h);
76
memcpy((void *) &(OutBuf.matrix[h][0][0]),
77
(const void *) &(InBuf->matrix[h][0][0]),
78
sizeof(double)*rowtot*coltot);
80
dpd_buf4_mat_irrep_wrt(&OutBuf, h);
82
dpd_buf4_mat_irrep_close(&OutBuf, h);
83
dpd_buf4_mat_irrep_close(InBuf, h);
87
dpd_buf4_mat_irrep_init_block(InBuf, h, rows_per_bucket);
88
dpd_buf4_mat_irrep_init_block(&OutBuf, h, rows_per_bucket);
90
coltot = InBuf->params->coltot[h^my_irrep];
91
size = ((long) rows_per_bucket)*((long) coltot);
93
for(n=0; n < (rows_left ? nbuckets-1 : nbuckets); n++) {
95
dpd_buf4_mat_irrep_rd_block(InBuf, h, n*rows_per_bucket, rows_per_bucket);
97
memcpy((void *) &(OutBuf.matrix[h][0][0]), (const void *) &(InBuf->matrix[h][0][0]),
98
((long) sizeof(double))*size);
100
dpd_buf4_mat_irrep_wrt_block(&OutBuf, h, n*rows_per_bucket, rows_per_bucket);
104
size = ((long) rows_left) * ((long) coltot);
106
dpd_buf4_mat_irrep_rd_block(InBuf, h, n*rows_per_bucket, rows_left);
108
memcpy((void *) &(OutBuf.matrix[h][0][0]), (const void *) &(InBuf->matrix[h][0][0]),
109
((long) sizeof(double))*size);
111
dpd_buf4_mat_irrep_wrt_block(&OutBuf, h, n*rows_per_bucket, rows_left);
114
dpd_buf4_mat_irrep_close_block(InBuf, h, rows_per_bucket);
115
dpd_buf4_mat_irrep_close_block(&OutBuf, h, rows_per_bucket);
61
122
dpd_buf4_close(&OutBuf);