7 #include "ncdispatch.h"
10 #ifndef VARS_USES_VARM
23 const size_t* start,
const size_t* edges,
const ptrdiff_t* stride)
29 for(i=0;i<odom->rank;i++) {
30 odom->start[i] = (start != NULL ? start[i] : 0);
31 odom->edges[i] = (edges != NULL ? edges[i] : 1);
32 odom->stride[i] = (stride != NULL ? stride[i] : 1);
33 odom->stop[i] = odom->start[i] + (odom->edges[i]*odom->stride[i]);
34 odom->index[i] = odom->start[i];
41 return (odom->index[0] < odom->stop[0]);
48 if(odom->rank == 0)
return 0;
49 for(i=odom->rank-1;i>=0;i--) {
50 odom->index[i] += odom->stride[i];
51 if(odom->index[i] < odom->stop[i])
break;
53 odom->index[i] = odom->start[i];
64 NC_get_vara(
int ncid,
int varid,
65 const size_t *start,
const size_t *edges,
69 int stat = NC_check_id(ncid, &ncp);
72 if(memtype >= NC_FIRSTUSERTYPEID) memtype =
NC_NAT;
79 stat = NC_getshape(ncid,varid,ndims,shape);
81 return ncp->dispatch->get_vara(ncid,varid,start,shape,value,memtype);
83 return ncp->dispatch->get_vara(ncid,varid,start,edges,value,memtype);
90 NC_get_var(
int ncid,
int varid,
void *value,
nc_type memtype)
96 stat = NC_getshape(ncid,varid, ndims, shape);
98 return NC_get_vara(ncid, varid, NC_coord_zero, shape, value, memtype);
106 NCDEFAULT_get_vars(
int ncid,
int varid,
const size_t * start,
107 const size_t * edges,
const ptrdiff_t * stride,
110 #ifdef VARS_USES_VARM
112 int stat = NC_check_id(ncid, &ncp);
115 return ncp->dispatch->get_varm(ncid,varid,start,edges,stride,NULL,value0,memtype);
120 int i,simplestride,rank,isrecvar;
124 size_t vartypelen, memtypelen;
125 char* value = (
char*)value0;
133 status = NC_check_id (ncid, &ncp);
134 if(status !=
NC_NOERR)
return status;
137 if(status !=
NC_NOERR)
return status;
139 if(memtype ==
NC_NAT) memtype = vartype;
142 status =
nc_inq_type(ncid,vartype,NULL,&vartypelen);
143 if(status !=
NC_NOERR)
return status;
145 if(memtype > NC_MAX_ATOMIC_TYPE)
146 memtypelen = vartypelen;
148 memtypelen = nctypelen(memtype);
151 if(vartype != memtype) {
153 if(vartype > NC_MAX_ATOMIC_TYPE
154 || memtype > NC_MAX_ATOMIC_TYPE)
163 if(status !=
NC_NOERR)
return status;
166 isrecvar = NC_is_recvar(ncid,varid,&numrecs);
167 NC_getshape(ncid,varid,rank,varshape);
176 size_t edge1[1] = {1};
177 return NC_get_vara(ncid, varid, start, edge1, value, memtype);
182 for(i=0;i<rank;i++) {
184 mystart[i] = (start == NULL ? 0 : start[i]);
186 if(i == 0 && isrecvar)
187 myedges[i] = numrecs - start[i];
189 myedges[i] = varshape[i] - mystart[i];
191 myedges[i] = edges[i];
194 mystride[i] = (stride == NULL ? 1 : stride[i]);
197 || ((
unsigned long) mystride[i] >= X_INT_MAX))
199 if(mystride[i] != 1) simplestride = 0;
201 dimlen = (i == 0 && isrecvar ? numrecs : varshape[i]);
202 if(mystart < 0 || mystart[i] >= dimlen)
204 if(myedges[i] < 0 || (mystart[i] + myedges[i] > dimlen))
208 return NC_get_vara(ncid, varid, mystart, myedges, value, memtype);
214 odom_init(&odom,rank,mystart,myedges,mystride);
217 while(odom_more(&odom)) {
220 localstatus = NC_get_vara(ncid,varid,odom.index,nc_sizevector1,memptr,memtype);
226 status = localstatus;
228 memptr += memtypelen;
239 NC_get_var1(
int ncid,
int varid,
const size_t *coord,
void* value,
242 return NC_get_vara(ncid, varid, coord, NC_coord_one, value, memtype);
249 NCDEFAULT_get_varm(
int ncid,
int varid,
const size_t *start,
250 const size_t *edges,
const ptrdiff_t *stride,
251 const ptrdiff_t *imapp,
void *value0,
nc_type memtype)
255 int varndims,maxidim;
259 char* value = (
char*)value0;
261 status = NC_check_id (ncid, &ncp);
262 if(status !=
NC_NOERR)
return status;
269 if(status !=
NC_NOERR)
return status;
271 if(vartype > NC_MAX_ATOMIC_TYPE)
275 if(status !=
NC_NOERR)
return status;
278 if(imapp != NULL && varndims != 0) {
283 const ptrdiff_t szof = (ptrdiff_t) nctypelen(vartype);
284 for(ii = 0; ii < varndims; ii++) {
285 if(imapp[ii] % szof != 0) {
289 cvtmap[ii] = imapp[ii] / szof;
301 memtypelen = nctypelen(memtype);
303 maxidim = (int) varndims - 1;
312 size_t edge1[1] = {1};
313 return NC_get_vara(ncid, varid, start, edge1, value, memtype);
322 size_t *mystart = NULL;
334 isrecvar = NC_is_recvar(ncid,varid,&numrecs);
335 NC_getshape(ncid,varid,varndims,varshape);
342 for (idim = 0; idim <= maxidim; ++idim)
344 if (stride[idim] == 0
346 || ((
unsigned long) stride[idim] >= X_INT_MAX))
350 if(stride[idim] != 1) stride1 = 0;
355 if(stride1 && imapp == NULL) {
356 return NC_get_vara(ncid, varid, start, edges, value, memtype);
362 mystart = (
size_t *)calloc(varndims * 7,
sizeof(ptrdiff_t));
364 myedges = mystart + varndims;
365 iocount = myedges + varndims;
366 stop = iocount + varndims;
367 length = stop + varndims;
368 mystride = (ptrdiff_t *)(length + varndims);
369 mymap = mystride + varndims;
374 for (idim = maxidim; idim >= 0; --idim)
376 mystart[idim] = start != NULL
380 if (edges != NULL && edges[idim] == 0)
387 myedges[idim] = edges != NULL
389 : idim == 0 && isrecvar
390 ? numrecs - mystart[idim]
391 : varshape[idim] - mystart[idim];
394 myedges[idim] = edges[idim];
395 else if (idim == 0 && isrecvar)
396 myedges[idim] = numrecs - mystart[idim];
398 myedges[idim] = varshape[idim] - mystart[idim];
401 mystride[idim] = stride != NULL
407 mymap[idim] = (imapp != NULL
409 : (idim == maxidim ? 1
410 : mymap[idim + 1] * (ptrdiff_t) myedges[idim + 1]));
413 mymap[idim] = imapp[idim];
414 else if (idim == maxidim)
418 mymap[idim + 1] * (ptrdiff_t) myedges[idim + 1];
421 length[idim] = mymap[idim] * myedges[idim];
422 stop[idim] = mystart[idim] + myedges[idim] * mystride[idim];
428 for (idim = maxidim; idim >= 0; --idim)
431 idim == 0 && isrecvar
434 if (mystart[idim] >= dimlen)
440 if (mystart[idim] + myedges[idim] > dimlen)
456 if (mystride[maxidim] == 1
457 && mymap[maxidim] == 1)
459 iocount[maxidim] = myedges[maxidim];
460 mystride[maxidim] = (ptrdiff_t) myedges[maxidim];
461 mymap[maxidim] = (ptrdiff_t) length[maxidim];
470 int lstatus = NC_get_vara(ncid, varid, mystart, iocount,
484 value += (mymap[idim] * memtypelen);
485 mystart[idim] += mystride[idim];
486 if (mystart[idim] == stop[idim])
488 mystart[idim] = start[idim];
489 value -= (length[idim] * memtypelen);
505 NC_get_vars(
int ncid,
int varid,
const size_t *start,
506 const size_t *edges,
const ptrdiff_t *stride,
void *value,
510 int stat = NC_check_id(ncid, &ncp);
514 if(memtype >= NC_FIRSTUSERTYPEID) memtype =
NC_NAT;
516 return ncp->dispatch->get_vars(ncid,varid,start,edges,stride,value,memtype);
524 NC_get_varm(
int ncid,
int varid,
const size_t *start,
525 const size_t *edges,
const ptrdiff_t *stride,
const ptrdiff_t* map,
529 int stat = NC_check_id(ncid, &ncp);
533 if(memtype >= NC_FIRSTUSERTYPEID) memtype =
NC_NAT;
535 return ncp->dispatch->get_varm(ncid,varid,start,edges,stride,map,value,memtype);
619 const size_t *countp,
void *ip)
623 int stat = NC_check_id(ncid, &ncp);
627 return NC_get_vara(ncid, varid, startp, countp, ip, xtype);
632 const size_t *countp,
char *ip)
635 int stat = NC_check_id(ncid, &ncp);
637 return NC_get_vara(ncid, varid, startp, countp,
643 const size_t *countp,
signed char *ip)
646 int stat = NC_check_id(ncid, &ncp);
648 return NC_get_vara(ncid, varid, startp, countp,
654 const size_t *countp,
unsigned char *ip)
657 int stat = NC_check_id(ncid, &ncp);
659 return NC_get_vara(ncid, varid, startp, countp,
660 (
void *)ip, T_uchar);
665 const size_t *countp,
short *ip)
668 int stat = NC_check_id(ncid, &ncp);
670 return NC_get_vara(ncid, varid, startp, countp,
676 const size_t *startp,
const size_t *countp,
int *ip)
679 int stat = NC_check_id(ncid, &ncp);
681 return NC_get_vara(ncid,varid,startp,countp, (
void *)ip,
NC_INT);
686 const size_t *startp,
const size_t *countp,
long *ip)
689 int stat = NC_check_id(ncid, &ncp);
691 return NC_get_vara(ncid,varid,startp,countp, (
void *)ip,T_long);
696 const size_t *startp,
const size_t *countp,
float *ip)
699 int stat = NC_check_id(ncid, &ncp);
701 return NC_get_vara(ncid,varid,startp,countp, (
void *)ip,T_float);
707 const size_t *countp,
double *ip)
710 int stat = NC_check_id(ncid, &ncp);
712 return NC_get_vara(ncid,varid,startp,countp, (
void *)ip,T_double);
717 const size_t *startp,
const size_t *countp,
unsigned char *ip)
720 int stat = NC_check_id(ncid, &ncp);
722 return NC_get_vara(ncid,varid,startp,countp, (
void *)ip,T_ubyte);
727 const size_t *startp,
const size_t *countp,
unsigned short *ip)
730 int stat = NC_check_id(ncid, &ncp);
732 return NC_get_vara(ncid,varid,startp,countp, (
void *)ip,T_ushort);
737 const size_t *startp,
const size_t *countp,
unsigned int *ip)
740 int stat = NC_check_id(ncid, &ncp);
742 return NC_get_vara(ncid,varid,startp,countp, (
void *)ip,T_uint);
747 const size_t *startp,
const size_t *countp,
long long *ip)
750 int stat = NC_check_id(ncid, &ncp);
752 return NC_get_vara(ncid,varid,startp,countp, (
void *)ip,T_longlong);
757 const size_t *startp,
const size_t *countp,
unsigned long long *ip)
760 int stat = NC_check_id(ncid, &ncp);
762 return NC_get_vara(ncid,varid,startp,countp, (
void *)ip,
NC_UINT64);
768 const size_t *startp,
const size_t *countp,
char* *ip)
771 int stat = NC_check_id(ncid, &ncp);
773 return NC_get_vara(ncid,varid,startp,countp, (
void *)ip,
NC_STRING);
816 return NC_get_var1(ncid, varid, indexp, ip,
NC_NAT);
823 int stat = NC_check_id(ncid, &ncp);
825 return NC_get_var1(ncid, varid, indexp, (
void *)ip,
NC_CHAR);
832 int stat = NC_check_id(ncid, &ncp);
834 return NC_get_var1(ncid, varid, indexp, (
void *)ip,
NC_BYTE);
841 int stat = NC_check_id(ncid, &ncp);
843 return NC_get_var1(ncid, varid, indexp, (
void *)ip,
NC_UBYTE);
850 int stat = NC_check_id(ncid, &ncp);
852 return NC_get_var1(ncid, varid, indexp, (
void *)ip,
NC_SHORT);
859 int stat = NC_check_id(ncid, &ncp);
861 return NC_get_var1(ncid, varid, indexp, (
void *)ip,
NC_INT);
869 int stat = NC_check_id(ncid, &ncp);
871 return NC_get_var1(ncid, varid, indexp, (
void *)ip, longtype);
879 int stat = NC_check_id(ncid, &ncp);
881 return NC_get_var1(ncid, varid, indexp, (
void *)ip,
NC_FLOAT);
889 int stat = NC_check_id(ncid, &ncp);
891 return NC_get_var1(ncid, varid, indexp, (
void *)ip,
NC_DOUBLE);
899 int stat = NC_check_id(ncid, &ncp);
901 return NC_get_var1(ncid, varid, indexp, (
void *)ip,
NC_UBYTE);
909 int stat = NC_check_id(ncid, &ncp);
911 return NC_get_var1(ncid, varid, indexp, (
void *)ip,
NC_USHORT);
919 int stat = NC_check_id(ncid, &ncp);
921 return NC_get_var1(ncid, varid, indexp, (
void *)ip,
NC_UINT);
929 int stat = NC_check_id(ncid, &ncp);
931 return NC_get_var1(ncid, varid, indexp, (
void *)ip,
NC_INT64);
936 unsigned long long *ip)
939 int stat = NC_check_id(ncid, &ncp);
941 return NC_get_var1(ncid, varid, indexp, (
void *)ip,
NC_UINT64);
949 int stat = NC_check_id(ncid, &ncp);
951 return NC_get_var1(ncid, varid, indexp, (
void *)ip,
NC_STRING);
1002 return NC_get_var(ncid, varid, ip,
NC_NAT);
1009 int stat = NC_check_id(ncid, &ncp);
1011 return NC_get_var(ncid, varid, (
void *)ip,
NC_CHAR);
1018 int stat = NC_check_id(ncid, &ncp);
1020 return NC_get_var(ncid, varid, (
void *)ip,
NC_BYTE);
1027 int stat = NC_check_id(ncid, &ncp);
1029 return NC_get_var(ncid,varid, (
void *)ip,
NC_UBYTE);
1036 int stat = NC_check_id(ncid, &ncp);
1038 return NC_get_var(ncid, varid, (
void *)ip,
NC_SHORT);
1045 int stat = NC_check_id(ncid, &ncp);
1047 return NC_get_var(ncid,varid, (
void *)ip,
NC_INT);
1054 int stat = NC_check_id(ncid, &ncp);
1056 return NC_get_var(ncid,varid, (
void *)ip, longtype);
1063 int stat = NC_check_id(ncid, &ncp);
1065 return NC_get_var(ncid,varid, (
void *)ip,
NC_FLOAT);
1072 int stat = NC_check_id(ncid, &ncp);
1074 return NC_get_var(ncid,varid, (
void *)ip,
NC_DOUBLE);
1081 int stat = NC_check_id(ncid, &ncp);
1083 return NC_get_var(ncid,varid, (
void *)ip,
NC_UBYTE);
1090 int stat = NC_check_id(ncid, &ncp);
1092 return NC_get_var(ncid,varid, (
void *)ip,
NC_USHORT);
1099 int stat = NC_check_id(ncid, &ncp);
1101 return NC_get_var(ncid,varid, (
void *)ip,
NC_UINT);
1108 int stat = NC_check_id(ncid, &ncp);
1110 return NC_get_var(ncid,varid, (
void *)ip,
NC_INT64);
1117 int stat = NC_check_id(ncid, &ncp);
1119 return NC_get_var(ncid,varid, (
void *)ip,
NC_UINT64);
1127 int stat = NC_check_id(ncid, &ncp);
1129 return NC_get_var(ncid,varid, (
void *)ip,
NC_STRING);
1176 const size_t * countp,
const ptrdiff_t * stridep,
1182 if ((stat = NC_check_id(ncid, &ncp)))
1184 return ncp->dispatch->get_vars(ncid, varid, startp, countp, stridep,
1190 const size_t *countp,
const ptrdiff_t * stridep,
1194 int stat = NC_check_id(ncid, &ncp);
1196 return NC_get_vars(ncid,varid,startp, countp, stridep,
1202 const size_t *countp,
const ptrdiff_t * stridep,
1206 int stat = NC_check_id(ncid, &ncp);
1208 return NC_get_vars(ncid,varid,startp, countp, stridep,
1214 const size_t *countp,
const ptrdiff_t * stridep,
1218 int stat = NC_check_id(ncid, &ncp);
1220 return NC_get_vars(ncid,varid,startp, countp, stridep,
1221 (
void *)ip, T_uchar);
1226 const size_t *countp,
const ptrdiff_t *stridep,
1230 int stat = NC_check_id(ncid, &ncp);
1232 return NC_get_vars(ncid,varid,startp, countp, stridep,
1238 const size_t *countp,
const ptrdiff_t * stridep,
1242 int stat = NC_check_id(ncid, &ncp);
1244 return NC_get_vars(ncid,varid,startp, countp, stridep,
1250 const size_t *countp,
const ptrdiff_t * stridep,
1254 int stat = NC_check_id(ncid, &ncp);
1256 return NC_get_vars(ncid,varid,startp, countp, stridep,
1257 (
void *)ip, T_long);
1262 const size_t *countp,
const ptrdiff_t * stridep,
1266 int stat = NC_check_id(ncid, &ncp);
1268 return NC_get_vars(ncid,varid,startp, countp, stridep,
1269 (
void *)ip, T_float);
1274 const size_t *countp,
const ptrdiff_t * stridep,
1278 int stat = NC_check_id(ncid, &ncp);
1280 return NC_get_vars(ncid,varid,startp, countp, stridep,
1281 (
void *)ip, T_double);
1286 const size_t *countp,
const ptrdiff_t * stridep,
1290 int stat = NC_check_id(ncid, &ncp);
1292 return NC_get_vars(ncid,varid, startp, countp, stridep,
1293 (
void *)ip, T_ubyte);
1298 const size_t *countp,
const ptrdiff_t * stridep,
1302 int stat = NC_check_id(ncid, &ncp);
1304 return NC_get_vars(ncid,varid,startp,countp, stridep,
1305 (
void *)ip, T_ushort);
1310 const size_t *countp,
const ptrdiff_t * stridep,
1314 int stat = NC_check_id(ncid, &ncp);
1316 return NC_get_vars(ncid,varid,startp, countp, stridep,
1317 (
void *)ip, T_uint);
1322 const size_t *countp,
const ptrdiff_t * stridep,
1326 int stat = NC_check_id(ncid, &ncp);
1328 return NC_get_vars(ncid, varid, startp, countp, stridep,
1329 (
void *)ip, T_longlong);
1334 const size_t *countp,
const ptrdiff_t * stridep,
1335 unsigned long long *ip)
1338 int stat = NC_check_id(ncid, &ncp);
1340 return NC_get_vars(ncid, varid, startp, countp, stridep,
1347 const size_t *startp,
const size_t *countp,
1348 const ptrdiff_t * stridep,
1352 int stat = NC_check_id(ncid, &ncp);
1354 return NC_get_vars(ncid, varid, startp, countp, stridep,
1416 const size_t * countp,
const ptrdiff_t * stridep,
1417 const ptrdiff_t * imapp,
void *ip)
1422 if ((stat = NC_check_id(ncid, &ncp)))
1424 return ncp->dispatch->get_varm(ncid, varid, startp, countp,
1425 stridep, imapp, ip,
NC_NAT);
1430 const size_t *startp,
const size_t *countp,
1431 const ptrdiff_t *stridep,
1432 const ptrdiff_t *imapp,
signed char *ip)
1435 int stat = NC_check_id(ncid, &ncp);
1437 return NC_get_varm(ncid, varid, startp, countp,
1438 stridep, imapp, (
void *)ip,
NC_BYTE);
1443 const size_t *startp,
const size_t *countp,
1444 const ptrdiff_t *stridep,
const ptrdiff_t *imapp,
1448 int stat = NC_check_id(ncid, &ncp);
1450 return NC_get_varm(ncid,varid,startp,countp,stridep,imapp, (
void *)ip,T_uchar);
1455 const size_t *countp,
const ptrdiff_t *stridep,
1456 const ptrdiff_t *imapp,
short *ip)
1459 int stat = NC_check_id(ncid, &ncp);
1461 return NC_get_varm(ncid,varid,startp,countp,stridep,imapp, (
void *)ip,
NC_SHORT);
1466 const size_t *startp,
const size_t *countp,
1467 const ptrdiff_t *stridep,
const ptrdiff_t *imapp,
1471 int stat = NC_check_id(ncid, &ncp);
1473 return NC_get_varm(ncid,varid,startp,countp,stridep,imapp, (
void *)ip,
NC_INT);
1478 const size_t *startp,
const size_t *countp,
1479 const ptrdiff_t *stridep,
const ptrdiff_t *imapp,
1483 int stat = NC_check_id(ncid, &ncp);
1485 return NC_get_varm(ncid,varid,startp,countp,stridep,imapp, (
void *)ip,T_long);
1490 const size_t *startp,
const size_t *countp,
1491 const ptrdiff_t *stridep,
const ptrdiff_t *imapp,
1495 int stat = NC_check_id(ncid, &ncp);
1497 return NC_get_varm(ncid,varid,startp,countp,stridep,imapp, (
void *)ip,T_float);
1502 const size_t *startp,
const size_t *countp,
1503 const ptrdiff_t *stridep,
const ptrdiff_t *imapp,
1507 int stat = NC_check_id(ncid, &ncp);
1509 return NC_get_varm(ncid,varid,startp,countp,stridep,imapp, (
void *)ip,T_double);
1514 const size_t *startp,
const size_t *countp,
1515 const ptrdiff_t *stridep,
const ptrdiff_t *imapp,
1519 int stat = NC_check_id(ncid, &ncp);
1521 return NC_get_varm(ncid,varid,startp,countp,stridep,
1522 imapp, (
void *)ip, T_ubyte);
1527 const size_t *startp,
const size_t *countp,
1528 const ptrdiff_t *stridep,
const ptrdiff_t *imapp,
1532 int stat = NC_check_id(ncid, &ncp);
1534 return NC_get_varm(ncid, varid, startp, countp, stridep,
1535 imapp, (
void *)ip, T_ushort);
1540 const size_t *startp,
const size_t *countp,
1541 const ptrdiff_t *stridep,
const ptrdiff_t *imapp,
1545 int stat = NC_check_id(ncid, &ncp);
1547 return NC_get_varm(ncid, varid, startp, countp,
1548 stridep, imapp, (
void *)ip, T_uint);
1553 const size_t *countp,
const ptrdiff_t *stridep,
1554 const ptrdiff_t *imapp,
long long *ip)
1557 int stat = NC_check_id(ncid, &ncp);
1559 return NC_get_varm(ncid, varid, startp, countp, stridep, imapp,
1560 (
void *)ip, T_longlong);
1565 const size_t *startp,
const size_t *countp,
1566 const ptrdiff_t *stridep,
const ptrdiff_t *imapp,
1567 unsigned long long *ip)
1570 int stat = NC_check_id(ncid, &ncp);
1572 return NC_get_varm(ncid, varid, startp, countp, stridep, imapp,
1578 const size_t *countp,
const ptrdiff_t *stridep,
1579 const ptrdiff_t *imapp,
char *ip)
1582 int stat = NC_check_id(ncid, &ncp);
1584 return NC_get_varm(ncid, varid, startp, countp, stridep, imapp,
1591 const size_t *countp,
const ptrdiff_t *stridep,
1592 const ptrdiff_t *imapp,
char **ip)
1595 int stat = NC_check_id(ncid, &ncp);
1597 return NC_get_varm(ncid, varid, startp, countp, stridep, imapp,