8 #include "ncdispatch.h"
11 #ifndef VARS_USES_VARM
24 const size_t* start,
const size_t* edges,
const ptrdiff_t* stride)
30 for(i=0;i<odom->rank;i++) {
31 odom->start[i] = (start != NULL ? start[i] : 0);
32 odom->edges[i] = (edges != NULL ? edges[i] : 1);
33 odom->stride[i] = (stride != NULL ? stride[i] : 1);
34 odom->stop[i] = odom->start[i] + (odom->edges[i]*odom->stride[i]);
35 odom->index[i] = odom->start[i];
42 return (odom->index[0] < odom->stop[0]);
49 if(odom->rank == 0)
return 0;
50 for(i=odom->rank-1;i>=0;i--) {
51 odom->index[i] += odom->stride[i];
52 if(odom->index[i] < odom->stop[i])
break;
54 odom->index[i] = odom->start[i];
64 NC_put_vara(
int ncid,
int varid,
const size_t *start,
65 const size_t *edges,
const void *value,
nc_type memtype)
68 int stat = NC_check_id(ncid, &ncp);
75 stat = NC_getshape(ncid, varid, ndims, shape);
77 return ncp->dispatch->put_vara(ncid, varid, start, shape, value, memtype);
79 return ncp->dispatch->put_vara(ncid, varid, start, edges, value, memtype);
86 NC_put_var(
int ncid,
int varid,
const void *value,
nc_type memtype)
92 stat = NC_getshape(ncid,varid, ndims, shape);
94 return NC_put_vara(ncid, varid, NC_coord_zero, shape, value, memtype);
101 NC_put_var1(
int ncid,
int varid,
const size_t *coord,
const void* value,
104 return NC_put_vara(ncid, varid, coord, NC_coord_one, value, memtype);
111 NCDEFAULT_put_vars(
int ncid,
int varid,
const size_t * start,
112 const size_t * edges,
const ptrdiff_t * stride,
113 const void *value0,
nc_type memtype)
115 #ifdef VARS_USES_VARM
117 int stat = NC_check_id(ncid, &ncp);
120 return ncp->dispatch->put_varm(ncid,varid,start,edges,stride,NULL,value0,memtype);
125 int i,simplestride,rank,isrecvar;
129 size_t vartypelen, memtypelen;
130 const char* value = (
const char*)value0;
137 const char* memptr = value;
139 status = NC_check_id (ncid, &ncp);
140 if(status !=
NC_NOERR)
return status;
143 if(status !=
NC_NOERR)
return status;
145 if(memtype ==
NC_NAT) memtype = vartype;
148 status =
nc_inq_type(ncid,vartype,NULL,&vartypelen);
149 if(status !=
NC_NOERR)
return status;
151 if(memtype > NC_MAX_ATOMIC_TYPE)
152 memtypelen = vartypelen;
154 memtypelen = nctypelen(memtype);
157 if(vartype != memtype) {
159 if(vartype > NC_MAX_ATOMIC_TYPE
160 || memtype > NC_MAX_ATOMIC_TYPE)
169 if(status !=
NC_NOERR)
return status;
172 isrecvar = NC_is_recvar(ncid,varid,&numrecs);
173 NC_getshape(ncid,varid,rank,varshape);
182 size_t edge1[1] = {1};
183 return NC_put_vara(ncid, varid, start, edge1, value0, memtype);
188 for(i=0;i<rank;i++) {
190 mystart[i] = (start == NULL ? 0 : start[i]);
192 if(i == 0 && isrecvar)
193 myedges[i] = numrecs - start[i];
195 myedges[i] = varshape[i] - mystart[i];
197 myedges[i] = edges[i];
200 mystride[i] = (stride == NULL ? 1 : stride[i]);
203 || ((
unsigned long) mystride[i] >= X_INT_MAX))
205 if(mystride[i] != 1) simplestride = 0;
207 dimlen = (i == 0 && isrecvar ? numrecs : varshape[i]);
208 if(i == 0 && isrecvar) {}
210 if(mystart[i] < 0 || mystart[i] > dimlen)
212 if(myedges[i] < 0 || (mystart[i] + myedges[i] > dimlen))
217 return NC_put_vara(ncid, varid, mystart, myedges, value, memtype);
226 odom_init(&odom,rank,mystart,myedges,mystride);
229 while(odom_more(&odom)) {
232 localstatus = NC_put_vara(ncid,varid,odom.index,nc_sizevector1,memptr,memtype);
238 status = localstatus;
240 memptr += memtypelen;
254 const size_t * start,
255 const size_t * edges,
256 const ptrdiff_t * stride,
257 const ptrdiff_t * imapp,
268 const char* value = (
char*)value0;
270 status = NC_check_id (ncid, &ncp);
271 if(status !=
NC_NOERR)
return status;
280 if(status !=
NC_NOERR)
return status;
282 if(vartype > NC_MAX_ATOMIC_TYPE)
286 if(status !=
NC_NOERR)
return status;
289 if(imapp != NULL && varndims != 0) {
294 const ptrdiff_t szof = (ptrdiff_t) nctypelen(vartype);
295 for(ii = 0; ii < varndims; ii++) {
296 if(imapp[ii] % szof != 0) {
300 cvtmap[ii] = imapp[ii] / szof;
312 memtypelen = nctypelen(memtype);
314 maxidim = (int) varndims - 1;
323 size_t edge1[1] = {1};
324 return NC_put_vara(ncid, varid, start, edge1, value, memtype);
333 size_t *mystart = NULL;
350 for (idim = 0; idim <= maxidim; ++idim) {
351 if ((stride[idim] == 0)
353 || ((
unsigned long) stride[idim] >= X_INT_MAX))
357 if(stride[idim] != 1) stride1 = 0;
364 if(stride1 && imapp == NULL) {
365 return NC_put_vara(ncid, varid, start, edges, value, memtype);
369 isrecvar = NC_is_recvar(ncid,varid,&numrecs);
370 NC_getshape(ncid,varid,varndims,varshape);
373 mystart = (
size_t *)calloc(varndims * 7,
sizeof(ptrdiff_t));
375 myedges = mystart + varndims;
376 iocount = myedges + varndims;
377 stop = iocount + varndims;
378 length = stop + varndims;
379 mystride = (ptrdiff_t *)(length + varndims);
380 mymap = mystride + varndims;
385 for (idim = maxidim; idim >= 0; --idim)
387 mystart[idim] = start != NULL
391 if (edges != NULL && edges[idim] == 0)
397 myedges[idim] = edges != NULL
399 : idim == 0 && isrecvar
400 ? numrecs - mystart[idim]
401 : varshape[idim] - mystart[idim];
402 mystride[idim] = stride != NULL
405 mymap[idim] = imapp != NULL
409 : mymap[idim + 1] * (ptrdiff_t) myedges[idim + 1];
412 length[idim] = mymap[idim] * myedges[idim];
413 stop[idim] = mystart[idim] + myedges[idim] * mystride[idim];
419 for (idim = isrecvar; idim < maxidim; ++idim)
421 if (mystart[idim] > varshape[idim])
426 if (mystart[idim] + myedges[idim] > varshape[idim])
440 if (mystride[maxidim] == 1
441 && mymap[maxidim] == 1)
443 iocount[maxidim] = myedges[maxidim];
444 mystride[maxidim] = (ptrdiff_t) myedges[maxidim];
445 mymap[maxidim] = (ptrdiff_t) length[maxidim];
454 int lstatus = NC_put_vara(ncid, varid, mystart, iocount,
469 value += (mymap[idim] * memtypelen);
470 mystart[idim] += mystride[idim];
471 if (mystart[idim] == stop[idim])
473 mystart[idim] = start[idim];
474 value -= (length[idim] * memtypelen);
490 NC_put_vars(
int ncid,
int varid,
const size_t *start,
491 const size_t *edges,
const ptrdiff_t *stride,
492 const void *value,
nc_type memtype)
495 int stat = NC_check_id(ncid, &ncp);
499 if(memtype >= NC_FIRSTUSERTYPEID) memtype =
NC_NAT;
501 return ncp->dispatch->put_vars(ncid,varid,start,edges,stride,value,memtype);
508 NC_put_varm(
int ncid,
int varid,
const size_t *start,
509 const size_t *edges,
const ptrdiff_t *stride,
const ptrdiff_t* map,
510 const void *value,
nc_type memtype)
513 int stat = NC_check_id(ncid, &ncp);
517 if(memtype >= NC_FIRSTUSERTYPEID) memtype =
NC_NAT;
519 return ncp->dispatch->put_varm(ncid,varid,start,edges,stride,map,value,memtype);
569 const size_t *countp,
const void *op)
572 int stat = NC_check_id(ncid, &ncp);
577 return NC_put_vara(ncid, varid, startp, countp, op, xtype);
582 const size_t *countp,
const char *op)
584 return NC_put_vara(ncid, varid, startp, countp,
590 const size_t *countp,
const signed char *op)
593 int stat = NC_check_id(ncid, &ncp);
595 return NC_put_vara(ncid, varid, startp, countp, (
void *)op,
601 const size_t *countp,
const unsigned char *op)
604 int stat = NC_check_id(ncid, &ncp);
606 return NC_put_vara(ncid, varid, startp, countp, (
void *)op,
612 const size_t *countp,
const short *op)
615 int stat = NC_check_id(ncid, &ncp);
617 return NC_put_vara(ncid, varid, startp, countp, (
void *)op,
623 const size_t *countp,
const int *op)
626 int stat = NC_check_id(ncid, &ncp);
628 return NC_put_vara(ncid, varid, startp, countp, (
void *)op,
634 const size_t *countp,
const long *op)
637 int stat = NC_check_id(ncid, &ncp);
639 return NC_put_vara(ncid, varid, startp, countp, (
void *)op,
645 const size_t *countp,
const float *op)
648 int stat = NC_check_id(ncid, &ncp);
650 return NC_put_vara(ncid, varid, startp, countp, (
void *)op,
656 const size_t *countp,
const double *op)
659 int stat = NC_check_id(ncid, &ncp);
661 return NC_put_vara(ncid, varid, startp, countp, (
void *)op,
667 const size_t *countp,
const unsigned char *op)
670 int stat = NC_check_id(ncid, &ncp);
672 return NC_put_vara(ncid, varid, startp, countp, (
void *)op,
678 const size_t *countp,
const unsigned short *op)
681 int stat = NC_check_id(ncid, &ncp);
683 return NC_put_vara(ncid, varid, startp, countp, (
void *)op,
689 const size_t *countp,
const unsigned int *op)
692 int stat = NC_check_id(ncid, &ncp);
694 return NC_put_vara(ncid, varid, startp, countp, (
void *)op,
700 const size_t *countp,
const long long *op)
703 int stat = NC_check_id(ncid, &ncp);
705 return NC_put_vara(ncid, varid, startp, countp, (
void *)op,
711 const size_t *countp,
const unsigned long long *op)
714 int stat = NC_check_id(ncid, &ncp);
716 return NC_put_vara(ncid, varid, startp, countp, (
void *)op,
723 const size_t *countp,
const char* *op)
726 int stat = NC_check_id(ncid, &ncp);
728 return NC_put_vara(ncid, varid, startp, countp, (
void *)op,
758 nc_put_var1(
int ncid,
int varid,
const size_t *indexp,
const void *op)
760 return NC_put_var1(ncid, varid, indexp, op,
NC_NAT);
767 int stat = NC_check_id(ncid, &ncp);
769 return NC_put_var1(ncid, varid, indexp, (
void *)op,
NC_CHAR);
776 int stat = NC_check_id(ncid, &ncp);
778 return NC_put_var1(ncid, varid, indexp, (
void *)op,
NC_BYTE);
785 int stat = NC_check_id(ncid, &ncp);
787 return NC_put_var1(ncid, varid, indexp, (
void *)op,
NC_UBYTE);
794 int stat = NC_check_id(ncid, &ncp);
796 return NC_put_var1(ncid, varid, indexp, (
void *)op,
NC_SHORT);
803 int stat = NC_check_id(ncid, &ncp);
805 return NC_put_var1(ncid, varid, indexp, (
void *)op,
NC_INT);
812 int stat = NC_check_id(ncid, &ncp);
814 return NC_put_var1(ncid, varid, indexp, (
void*)op, longtype);
821 int stat = NC_check_id(ncid, &ncp);
823 return NC_put_var1(ncid, varid, indexp, (
void*)op,
NC_FLOAT);
830 int stat = NC_check_id(ncid, &ncp);
832 return NC_put_var1(ncid, varid, indexp, (
void *)op,
NC_DOUBLE);
839 int stat = NC_check_id(ncid, &ncp);
841 return NC_put_var1(ncid, varid, indexp, (
void *)op,
NC_UBYTE);
848 int stat = NC_check_id(ncid, &ncp);
850 return NC_put_var1(ncid, varid, indexp, (
void *)op,
NC_USHORT);
857 int stat = NC_check_id(ncid, &ncp);
859 return NC_put_var1(ncid, varid, indexp, (
void *)op,
NC_UINT);
866 int stat = NC_check_id(ncid, &ncp);
868 return NC_put_var1(ncid, varid, indexp, (
void *)op,
NC_INT64);
875 int stat = NC_check_id(ncid, &ncp);
877 return NC_put_var1(ncid, varid, indexp, (
void *)op,
NC_UINT64);
885 int stat = NC_check_id(ncid, &ncp);
887 return NC_put_var1(ncid, varid, indexp, (
void*)op,
NC_STRING);
941 return NC_put_var(ncid, varid, op,
NC_NAT);
948 int stat = NC_check_id(ncid, &ncp);
950 return NC_put_var(ncid,varid,(
void*)op,
NC_CHAR);
957 int stat = NC_check_id(ncid, &ncp);
959 return NC_put_var(ncid,varid,(
void*)op,
NC_BYTE);
966 int stat = NC_check_id(ncid, &ncp);
968 return NC_put_var(ncid,varid,(
void*)op,T_uchar);
975 int stat = NC_check_id(ncid, &ncp);
977 return NC_put_var(ncid,varid,(
void*)op,
NC_SHORT);
984 int stat = NC_check_id(ncid, &ncp);
986 return NC_put_var(ncid,varid,(
void*)op,
NC_INT);
993 int stat = NC_check_id(ncid, &ncp);
995 return NC_put_var(ncid,varid,(
void*)op,T_long);
1002 int stat = NC_check_id(ncid, &ncp);
1004 return NC_put_var(ncid,varid,(
void*)op,T_float);
1011 int stat = NC_check_id(ncid, &ncp);
1013 return NC_put_var(ncid,varid,(
void*)op,T_double);
1020 int stat = NC_check_id(ncid, &ncp);
1022 return NC_put_var(ncid,varid,(
void*)op,T_ubyte);
1029 int stat = NC_check_id(ncid, &ncp);
1031 return NC_put_var(ncid,varid,(
void*)op,T_ushort);
1038 int stat = NC_check_id(ncid, &ncp);
1040 return NC_put_var(ncid,varid,(
void*)op,T_uint);
1047 int stat = NC_check_id(ncid, &ncp);
1049 return NC_put_var(ncid,varid,(
void*)op,T_longlong);
1056 int stat = NC_check_id(ncid, &ncp);
1058 return NC_put_var(ncid,varid,(
void*)op,
NC_UINT64);
1066 int stat = NC_check_id(ncid, &ncp);
1068 return NC_put_var(ncid,varid,(
void*)op,
NC_STRING);
1105 const size_t *countp,
const ptrdiff_t *stridep,
1111 if ((stat = NC_check_id(ncid, &ncp)))
1113 return ncp->dispatch->put_vars(ncid, varid, startp, countp,
1119 const size_t *countp,
const ptrdiff_t *stridep,
1123 int stat = NC_check_id(ncid, &ncp);
1125 return NC_put_vars(ncid, varid, startp, countp,
1131 const size_t *countp,
const ptrdiff_t *stridep,
1132 const signed char *op)
1135 int stat = NC_check_id(ncid, &ncp);
1137 return NC_put_vars(ncid, varid, startp, countp,
1143 const size_t *startp,
const size_t *countp,
1144 const ptrdiff_t *stridep,
1145 const unsigned char *op)
1148 int stat = NC_check_id(ncid, &ncp);
1150 return NC_put_vars(ncid, varid, startp, countp,
1151 stridep, (
void *)op, T_uchar);
1156 const size_t *startp,
const size_t *countp,
1157 const ptrdiff_t *stridep,
1161 int stat = NC_check_id(ncid, &ncp);
1163 return NC_put_vars(ncid, varid, startp, countp,
1169 const size_t *startp,
const size_t *countp,
1170 const ptrdiff_t *stridep,
1174 int stat = NC_check_id(ncid, &ncp);
1176 return NC_put_vars(ncid, varid, startp, countp,
1177 stridep, (
void *)op,
NC_INT);
1182 const size_t *startp,
const size_t *countp,
1183 const ptrdiff_t *stridep,
1187 int stat = NC_check_id(ncid, &ncp);
1189 return NC_put_vars(ncid, varid, startp, countp,
1190 stridep, (
void *)op, T_long);
1195 const size_t *startp,
const size_t *countp,
1196 const ptrdiff_t *stridep,
1200 int stat = NC_check_id(ncid, &ncp);
1202 return NC_put_vars(ncid, varid, startp, countp,
1203 stridep, (
void *)op, T_float);
1208 const size_t *startp,
const size_t *countp,
1209 const ptrdiff_t *stridep,
1213 int stat = NC_check_id(ncid, &ncp);
1215 return NC_put_vars(ncid, varid, startp, countp,
1216 stridep, (
void *)op, T_double);
1221 const size_t *startp,
const size_t *countp,
1222 const ptrdiff_t *stridep,
1223 const unsigned char *op)
1226 int stat = NC_check_id(ncid, &ncp);
1228 return NC_put_vars(ncid, varid, startp, countp,
1229 stridep, (
void *)op, T_ubyte);
1234 const size_t *startp,
const size_t *countp,
1235 const ptrdiff_t *stridep,
1236 const unsigned short *op)
1239 int stat = NC_check_id(ncid, &ncp);
1241 return NC_put_vars(ncid, varid, startp, countp,
1242 stridep, (
void *)op, T_ushort);
1247 const size_t *startp,
const size_t *countp,
1248 const ptrdiff_t *stridep,
1249 const unsigned int *op)
1252 int stat = NC_check_id(ncid, &ncp);
1254 return NC_put_vars(ncid, varid, startp, countp,
1255 stridep, (
void *)op, T_uint);
1260 const size_t *startp,
const size_t *countp,
1261 const ptrdiff_t *stridep,
1262 const long long *op)
1265 int stat = NC_check_id(ncid, &ncp);
1267 return NC_put_vars(ncid, varid, startp, countp,
1268 stridep, (
void *)op, T_longlong);
1273 const size_t *startp,
const size_t *countp,
1274 const ptrdiff_t *stridep,
1275 const unsigned long long *op)
1278 int stat = NC_check_id(ncid, &ncp);
1280 return NC_put_vars(ncid, varid, startp, countp,
1287 const size_t *startp,
const size_t *countp,
1288 const ptrdiff_t *stridep,
1292 int stat = NC_check_id(ncid, &ncp);
1294 return NC_put_vars(ncid, varid, startp, countp, stridep,
1344 const size_t *countp,
const ptrdiff_t *stridep,
1345 const ptrdiff_t *imapp,
const void *op)
1350 if ((stat = NC_check_id(ncid, &ncp)))
1352 return ncp->dispatch->put_varm(ncid, varid, startp, countp,
1353 stridep, imapp, op,
NC_NAT);
1358 const size_t *countp,
const ptrdiff_t *stridep,
1359 const ptrdiff_t *imapp,
const char *op)
1362 int stat = NC_check_id(ncid, &ncp);
1364 return NC_put_varm(ncid, varid, startp, countp, stridep, imapp,
1370 const size_t *startp,
const size_t *countp,
1371 const ptrdiff_t *stridep,
const ptrdiff_t *imapp,
1372 const signed char *op)
1375 int stat = NC_check_id(ncid, &ncp);
1377 return NC_put_varm(ncid, varid, startp, countp, stridep, imapp,
1383 const size_t *startp,
const size_t *countp,
1384 const ptrdiff_t *stridep,
const ptrdiff_t *imapp,
1385 const unsigned char *op)
1388 int stat = NC_check_id(ncid, &ncp);
1390 return NC_put_varm(ncid, varid, startp, countp, stridep, imapp,
1391 (
void *)op, T_uchar);
1396 const size_t *startp,
const size_t *countp,
1397 const ptrdiff_t *stridep,
const ptrdiff_t *imapp,
1401 int stat = NC_check_id(ncid, &ncp);
1403 return NC_put_varm(ncid, varid, startp, countp, stridep, imapp,
1409 const size_t *startp,
const size_t *countp,
1410 const ptrdiff_t *stridep,
const ptrdiff_t *imapp,
1414 int stat = NC_check_id(ncid, &ncp);
1416 return NC_put_varm(ncid, varid, startp, countp, stridep, imapp,
1422 const size_t *startp,
const size_t *countp,
1423 const ptrdiff_t *stridep,
const ptrdiff_t *imapp,
1427 int stat = NC_check_id(ncid, &ncp);
1429 return NC_put_varm(ncid, varid, startp, countp, stridep, imapp,
1430 (
void *)op, T_long);
1435 const size_t *startp,
const size_t *countp,
1436 const ptrdiff_t *stridep,
const ptrdiff_t *imapp,
1440 int stat = NC_check_id(ncid, &ncp);
1442 return NC_put_varm(ncid, varid, startp, countp, stridep, imapp,
1443 (
void *)op, T_float);
1448 const size_t *startp,
const size_t *countp,
1449 const ptrdiff_t *stridep,
const ptrdiff_t *imapp,
1453 int stat = NC_check_id(ncid, &ncp);
1455 return NC_put_varm(ncid, varid, startp, countp, stridep, imapp,
1456 (
void *)op, T_double);
1461 const size_t *startp,
const size_t *countp,
1462 const ptrdiff_t *stridep,
const ptrdiff_t *imapp,
1463 const unsigned char *op)
1466 int stat = NC_check_id(ncid, &ncp);
1468 return NC_put_varm(ncid, varid, startp, countp, stridep, imapp,
1469 (
void *)op, T_ubyte);
1474 const size_t *startp,
const size_t *countp,
1475 const ptrdiff_t *stridep,
const ptrdiff_t *imapp,
1476 const unsigned short *op)
1479 int stat = NC_check_id(ncid, &ncp);
1481 return NC_put_varm(ncid, varid, startp, countp, stridep, imapp,
1482 (
void *)op, T_ushort);
1487 const size_t *startp,
const size_t *countp,
1488 const ptrdiff_t *stridep,
const ptrdiff_t *imapp,
1489 const unsigned int *op)
1492 int stat = NC_check_id(ncid, &ncp);
1494 return NC_put_varm(ncid, varid, startp, countp, stridep, imapp,
1495 (
void *)op, T_uint);
1500 const size_t *startp,
const size_t *countp,
1501 const ptrdiff_t *stridep,
const ptrdiff_t *imapp,
1502 const long long *op)
1505 int stat = NC_check_id(ncid, &ncp);
1507 return NC_put_varm(ncid, varid, startp, countp, stridep, imapp,
1508 (
void *)op, T_longlong);
1513 const size_t *startp,
const size_t *countp,
1514 const ptrdiff_t *stridep,
const ptrdiff_t *imapp,
1515 const unsigned long long *op)
1518 int stat = NC_check_id(ncid, &ncp);
1520 return NC_put_varm(ncid, varid, startp, countp, stridep, imapp,
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_put_varm(ncid, varid, startp, countp, stridep, imapp,