20
20
#include "public/adios_read.h"
24
slice(uint64_t length, uint64_t *s, uint64_t *e, int rank, int mpisize)
28
uint64_t rem = length % mpisize;
30
start = length/mpisize * rank;
31
end = length/mpisize * (rank+1);
35
/* If our MPI size is greater
36
than the number of y dimensions,
37
then read the whole thing. */
38
if (mpisize > length) {
48
if (rank == mpisize-1) {
22
55
int main (int argc, char ** argv)
28
60
MPI_Comm comm = MPI_COMM_WORLD;
31
int64_t adios_handle, adios_buf_size;
33
62
MPI_Init (&argc, &argv);
34
63
MPI_Comm_rank (comm, &rank);
64
MPI_Comm_size (comm, &size);
36
66
adios_read_init_method(ADIOS_READ_METHOD_FLEXPATH, comm, "");
40
70
ADIOS_SELECTION scalar_block_select;
41
71
scalar_block_select.type = ADIOS_SELECTION_WRITEBLOCK;
42
scalar_block_select.u.block.index = rank;
72
scalar_block_select.u.block.index = 0;
44
74
/* schedule_read of a scalar. */
45
75
int test_scalar = -1;
56
87
while(adios_errno != err_end_of_stream){
57
88
/* get a bounding box - rank 0 for now*/
58
ADIOS_VARINFO *nx_info = adios_inq_var( afile, "scalar/dim/NX");
59
ADIOS_VARINFO *ny_info = adios_inq_var( afile, "scalar/dim/NY");
89
ADIOS_VARINFO *nx_info = adios_inq_var(afile, "/scalar/dim/NX");
90
ADIOS_VARINFO *ny_info = adios_inq_var(afile, "/scalar/dim/NY");
91
ADIOS_VARINFO *nz_info = adios_inq_var(afile, "/scalar/dim/NZ");
60
93
ADIOS_VARINFO *size_info = adios_inq_var( afile, "size");
61
94
ADIOS_VARINFO *arry = adios_inq_var( afile, "var_2d_array");
64
97
int ny_val = *((int*)ny_info->value);
65
98
int size_val = *((int*)size_info->value);
67
printf("nx: %d, ny: %d, size: %d\n", nx_val, ny_val, size);
100
//printf("nx: %d, ny: %d, size: %d\n", nx_val, ny_val, size_val);
102
// slice array along y dimension
103
uint64_t my_ystart, my_yend, my_ycount;
104
slice(arry->dims[1], &my_ystart, &my_yend, rank, size);
106
/* printf("rank: %d my_ystart: %d, my_yend: %d\n", */
107
/* rank, (int)my_ystart, (int)my_yend); */
69
109
uint64_t xcount = arry->dims[0];
70
uint64_t ycount = arry->dims[1];
72
uint64_t starts[] = {0,0};
73
uint64_t counts[] = {xcount, ycount};
75
global_range_select = adios_selection_boundingbox(2, starts, counts);
77
int nelem = xcount*ycount;
110
uint64_t ycount = my_yend - my_ystart;
111
uint64_t zcount = arry->dims[2];
113
uint64_t starts[] = {0, my_ystart, 0};
114
uint64_t counts[] = {xcount, ycount, zcount};
116
/* printf("rank: %d starts: %d %d %d. counts: %d %d %d\n", */
118
/* (int)starts[0], (int)starts[1], (int)starts[2], */
119
/* (int)counts[0], (int)counts[1], (int)counts[2]); */
121
global_range_select = adios_selection_boundingbox(arry->ndim, starts, counts);
123
int nelem = xcount*ycount*zcount;
79
125
if(nx_info->value) {
80
126
NX = *((int *)nx_info->value);