4 #define RMISS -9.9999e+30 7 static int32_t ERROR_SUPPRESS = 0;
9 #define CHECK_ERROR(status) \ 11 if (status != NC_NOERR) { \ 12 if ( ! ERROR_SUPPRESS ) { \ 13 fprintf(stderr, "Error: at l%d in %s\n", __LINE__, __FILE__); \ 14 fprintf(stderr, " %s\n", nc_strerror(status)); \ 20 #define NCTYPE2TYPE(nctype, type) \ 30 type = File_INTEGER2; \ 33 fprintf(stderr, "unsuppoted data type: %d\n", xtype); \ 38 #define TYPE2NCTYPE(type, nctype) \ 48 fprintf(stderr, "unsuppoted data type: %d\n", xtype); \ 54 #define DEFAULT_DEFLATE_LEVEL 2 106 fprintf(stderr,
"exceed max number of file limit\n");
111 strcpy(_fname, fname);
112 if (fname[len-3] !=
'.' || fname[len-2] !=
'n' || fname[len-1] !=
'c' )
113 strcat(_fname,
".nc");
121 CHECK_ERROR( nc_create(_fname, NC_CLOBBER, &ncid) );
123 CHECK_ERROR( nc_create(_fname, NC_CLOBBER|NC_NETCDF4, &ncid) );
130 fprintf(stderr,
"invalid mode type\n");
135 files[nfile]->
ncid = ncid;
138 files[nfile]->defmode = 1;
151 if ( strcmp(filetype,
"netcdf") != 0 )
return SUCCESS_CODE;
153 if ( strcmp(key,
"deflate_level") == 0 ) {
171 int dimids[
MAX_RANK], tdim, uldims[NC_MAX_DIMS];
177 ERROR_SUPPRESS = suppress;
180 ncid = files[fid]->
ncid;
181 CHECK_ERROR( nc_inq_varid(ncid, varname, &varid) );
186 strcpy(dinfo->
varname, varname);
192 CHECK_ERROR( nc_inq_vartype(ncid, varid, &xtype) );
195 CHECK_ERROR( nc_inq_varndims(ncid, varid, &rank) );
196 CHECK_ERROR( nc_inq_vardimid(ncid, varid, dimids) );
204 for ( i=0; i<n; i++ ) {
205 if ( uldims[i] == dimids[0] ) {
211 fprintf(stderr,
"rank exceeds limit: %d\n", rank);
214 dinfo->
rank = tdim >= 0 ? rank -1 : rank;
216 for (i=0; i<dinfo->
rank; i++) {
218 CHECK_ERROR( nc_inq_dim(ncid, dimids[rank-i-1], name, &size) );
231 strcat(name,
"_bnds");
251 size_t *start, *count;
256 ncid = files[dinfo->
fid]->
ncid;
259 CHECK_ERROR( nc_inq_varndims(ncid, varid, &rank) );
260 start = (
size_t*) malloc(
sizeof(
size_t)*rank);
261 count = (
size_t*) malloc(
sizeof(
size_t)*rank);
262 for (i=0; i<dinfo->
rank; i++) {
264 start[rank -i-1] = 0;
265 count[rank -i-1] = dinfo->
dim_size[i];
267 if (rank > dinfo->
rank) {
268 start[0] = dinfo->
step - 1;
271 switch ( precision ) {
273 status = nc_get_vara_double(ncid, varid, start, count, (
double*)var);
279 status = nc_get_vara_float(ncid, varid, start, count, (
float*)var);
287 fprintf(stderr,
"unsuppoted data precision: %d\n", precision );
303 ncid = files[fid]->
ncid;
305 CHECK_ERROR( nc_inq_attlen(ncid, NC_GLOBAL, key, &l) );
308 CHECK_ERROR( nc_get_att_text(ncid, NC_GLOBAL, key, value) );
323 ncid = files[fid]->
ncid;
325 CHECK_ERROR( nc_inq_attlen(ncid, NC_GLOBAL, key, &l) );
327 CHECK_ERROR( nc_get_att_int(ncid, NC_GLOBAL, key, value) );
341 ncid = files[fid]->
ncid;
343 CHECK_ERROR( nc_inq_attlen(ncid, NC_GLOBAL, key, &l) );
345 CHECK_ERROR( nc_get_att_float(ncid, NC_GLOBAL, key, value) );
359 ncid = files[fid]->
ncid;
361 CHECK_ERROR( nc_inq_attlen(ncid, NC_GLOBAL, key, &l) );
363 CHECK_ERROR( nc_get_att_double(ncid, NC_GLOBAL, key, value) );
375 ncid = files[fid]->
ncid;
378 if (files[fid]->defmode == 0) {
380 files[fid]->defmode = 1;
384 CHECK_ERROR( nc_put_att_text(ncid, NC_GLOBAL, key, strlen(value), value) );
397 ncid = files[fid]->
ncid;
400 if (files[fid]->defmode == 0) {
402 files[fid]->defmode = 1;
406 CHECK_ERROR( nc_put_att_int(ncid, NC_GLOBAL, key, NC_INT, len, value) );
419 ncid = files[fid]->
ncid;
422 if (files[fid]->defmode == 0) {
424 files[fid]->defmode = 1;
428 CHECK_ERROR( nc_put_att_float(ncid, NC_GLOBAL, key, NC_FLOAT, len, value) );
441 ncid = files[fid]->
ncid;
444 if (files[fid]->defmode == 0) {
446 files[fid]->defmode = 1;
450 CHECK_ERROR( nc_put_att_double(ncid, NC_GLOBAL, key, NC_DOUBLE, len, value) );
458 strcpy(files[fid]->time_units, time_units);
473 ncid = files[fid]->
ncid;
477 if ( nc_inq_attid(ncid, varid, key, &attid) == NC_NOERR )
481 if (files[fid]->defmode == 0) {
483 files[fid]->defmode = 1;
487 CHECK_ERROR( nc_put_att_text(ncid, varid, key, strlen(val), val) );
502 int ncid, dimid, varid;
506 ncid = files[fid]->
ncid;
508 if ( nc_inq_varid(ncid, name, &varid) == NC_NOERR )
512 if (files[fid]->defmode == 0) {
514 files[fid]->defmode = 1;
518 if ( nc_inq_dimid(ncid, dim_name, &dimid) != NC_NOERR )
519 CHECK_ERROR( nc_def_dim(ncid, dim_name, size, &dimid) );
522 CHECK_ERROR( nc_def_var(ncid, name, xtype, 1, &dimid, &varid) );
523 CHECK_ERROR( nc_put_att_text(ncid, varid,
"long_name", strlen(desc), desc) );
524 CHECK_ERROR( nc_put_att_text(ncid, varid,
"units", strlen(units), units) );
528 files[fid]->defmode = 0;
531 switch ( precision ) {
533 CHECK_ERROR( nc_put_var_double(ncid, varid, (
double*)val) );
536 CHECK_ERROR( nc_put_var_float(ncid, varid, (
float*)val) );
539 fprintf(stderr,
"unsuppoted data precision: %d\n", precision);
554 int ncid, dimid, varid;
558 ncid = files[fid]->
ncid;
560 if ( nc_inq_varid(ncid, name, &varid) == NC_NOERR )
564 if (files[fid]->defmode == 0) {
566 files[fid]->defmode = 1;
570 if ( nc_inq_dimid(ncid, dim_name, &dimid) != NC_NOERR )
571 CHECK_ERROR( nc_def_dim(ncid, dim_name, dim_size, &dimid) );
574 CHECK_ERROR( nc_def_var(ncid, name, xtype, 1, &dimid, &varid) );
575 CHECK_ERROR( nc_put_att_text(ncid, varid,
"long_name", strlen(desc), desc) );
576 CHECK_ERROR( nc_put_att_text(ncid, varid,
"units", strlen(units), units) );
589 ncid = files[fid]->
ncid;
594 if (files[fid]->defmode == 1) {
596 files[fid]->defmode = 0;
600 switch ( precision ) {
602 CHECK_ERROR( nc_put_var_double(ncid, varid, (
double*)val) );
605 CHECK_ERROR( nc_put_var_float(ncid, varid, (
float*)val) );
608 fprintf(stderr,
"unsuppoted data precision: %d\n", precision);
625 int ncid, *dimids, varid;
630 ncid = files[fid]->
ncid;
632 if ( nc_inq_varid(ncid, name, &varid) == NC_NOERR )
636 if (files[fid]->defmode == 0) {
638 files[fid]->defmode = 1;
642 dimids = malloc(
sizeof(
int)*ndims);
643 for (i=0; i<ndims; i++)
644 CHECK_ERROR( nc_inq_dimid(ncid, dim_names[i], dimids+ndims-i-1) );
648 CHECK_ERROR( nc_def_var(ncid, name, xtype, ndims, dimids, &varid) );
649 CHECK_ERROR( nc_put_att_text(ncid, varid,
"long_name", strlen(desc), desc) );
650 CHECK_ERROR( nc_put_att_text(ncid, varid,
"units", strlen(units), units) );
655 files[fid]->defmode = 0;
658 switch ( precision ) {
660 CHECK_ERROR( nc_put_var_double(ncid, varid, (
double*)val) );
663 CHECK_ERROR( nc_put_var_float(ncid, varid, (
float*)val) );
666 fprintf(stderr,
"unsuppoted data precision: %d\n", precision);
681 int ncid, *dimids, varid;
686 ncid = files[fid]->
ncid;
688 if ( nc_inq_varid(ncid, name, &varid) == NC_NOERR )
692 if (files[fid]->defmode == 0) {
694 files[fid]->defmode = 1;
698 dimids = malloc(
sizeof(
int)*ndims);
699 for (i=0; i<ndims; i++)
700 CHECK_ERROR( nc_inq_dimid(ncid, dim_names[i], dimids+ndims-i-1) );
704 CHECK_ERROR( nc_def_var(ncid, name, xtype, ndims, dimids, &varid) );
705 CHECK_ERROR( nc_put_att_text(ncid, varid,
"long_name", strlen(desc), desc) );
706 CHECK_ERROR( nc_put_att_text(ncid, varid,
"units", strlen(units), units) );
720 ncid = files[fid]->
ncid;
725 if (files[fid]->defmode == 1) {
727 files[fid]->defmode = 0;
731 switch ( precision ) {
733 CHECK_ERROR( nc_put_var_double(ncid, varid, (
double*)val) );
736 CHECK_ERROR( nc_put_var_float(ncid, varid, (
float*)val) );
739 fprintf(stderr,
"unsuppoted data precision: %d\n", precision);
757 int ncid, varid, acid, *acdimids;
758 int dimids[NC_MAX_DIMS], dimid;
772 fprintf(stderr,
"exceed max number of variable limit\n");
777 ncid = files[fid]->
ncid;
780 vars[nvar]->
ncid = ncid;
781 vars[nvar]->
t = NULL;
782 vars[nvar]->
start = NULL;
783 vars[nvar]->
count = NULL;
786 if (files[fid]->defmode == 0) {
788 files[fid]->defmode = 1;
794 for ( i=0; i<nt; i++ ) {
795 if ( tdims[i] != NULL &&
796 tdims[i]->ncid == ncid &&
797 tdims[i]->tint == tint ) {
798 vars[nvar]->
t = tdims[i];
802 if ( vars[nvar]->t == NULL ) {
804 tdims[nt]->
ncid = ncid;
805 tdims[nt]->
count = -1;
806 tdims[nt]->
tint = tint;
809 strcpy(tname,
"time");
811 sprintf(tname,
"time%d", nt);
812 strcpy(tdims[nt]->name, tname);
814 CHECK_ERROR( nc_def_dim(ncid, tname, 0, &tdimid) );
815 tdims[nt]->
dimid = tdimid;
816 CHECK_ERROR( nc_def_var(ncid, tname, NC_DOUBLE, 1, &tdimid, &tvarid) );
817 tdims[nt]->
varid = tvarid;
819 CHECK_ERROR( nc_put_att_text(ncid, tvarid,
"long_name", strlen(buf), buf) );
820 CHECK_ERROR( nc_put_att_text(ncid, tvarid,
"units", strlen(files[fid]->time_units), files[fid]->time_units) );
822 if ( nc_inq_dimid(ncid,
"nv", &(dimids[1])) != NC_NOERR )
823 CHECK_ERROR( nc_def_dim(ncid,
"nv", 2, &(dimids[1])) );
824 sprintf(buf,
"%s_bnds", tname);
825 CHECK_ERROR( nc_put_att_text(ncid, tvarid,
"bounds", strlen(buf), buf) );
827 CHECK_ERROR( nc_def_var(ncid, buf, NC_DOUBLE, 2, dimids, &tvarid) );
828 tdims[nt]->
bndsid = tvarid;
829 CHECK_ERROR( nc_put_att_text(ncid, tvarid,
"units", strlen(files[fid]->time_units), files[fid]->time_units) );
831 vars[nvar]->
t = tdims[nt];
840 dimids[0] = vars[nvar]->
t->
dimid;
843 for (i=ndims-n; i<ndims; i++) dimids[i] = -1;
847 for (i=0; i<n; i++) {
849 if ( nc_inq_dimid(ncid, dims[i], &dimid) == NC_NOERR ) {
852 for (k=0; k<nndims; k++) {
853 if (dimid == dimids[k]) {
859 dimids[ndims-(++nndims)] = dimid;
865 acdimids = (
int*) malloc((
sizeof(
int)*m));
866 CHECK_ERROR( nc_inq_vardimid(ncid, acid, acdimids) );
867 for (j=m-1; j>=0; j--) {
869 for (k=0; k<ndims; k++) {
870 if (acdimids[j] == dimids[k]) {
876 if ( nndims >= ndims ) {
877 fprintf(stderr,
"Error: invalid associated coordinates\n");
880 dimids[ndims-(++nndims)] = acdimids[j];
890 fprintf(stderr,
"Error: invalid associated coordinates: %d %d\n", ndims, nndims);
895 CHECK_ERROR( nc_def_var(ncid, varname, xtype, ndims, dimids, &varid) );
898 CHECK_ERROR( nc_put_att_text(ncid, varid,
"long_name", strlen(desc), desc) );
899 CHECK_ERROR( nc_put_att_text(ncid, varid,
"units", strlen(units), units) );
900 CHECK_ERROR( nc_put_att_double(ncid, varid, _FillValue, xtype, 1, &rmiss) );
901 CHECK_ERROR( nc_put_att_double(ncid, varid,
"missing_value", xtype, 1, &rmiss) );
903 strcpy(coord, dims[0]);
905 if (strlen(coord)+strlen(dims[i])+1 <
File_HMID) {
907 strcat(coord, dims[i]);
910 if ( ndims > n && strlen(coord)+6 <
File_HMID) {
912 strcat(coord, vars[nvar]->t->name);
914 CHECK_ERROR( nc_put_att_text(ncid, varid,
"coordinates", strlen(coord), coord) );
919 sprintf(buf,
"%s: mean", vars[nvar]->t->name);
920 CHECK_ERROR( nc_put_att_text(ncid, varid,
"cell_methods", strlen(buf), buf) );
924 vars[nvar]->
start = (
size_t*) malloc(
sizeof(
size_t)*ndims);
925 vars[nvar]->
count = (
size_t*) malloc(
sizeof(
size_t)*ndims);
926 for ( i=0; i<ndims; i++ ) {
927 CHECK_ERROR( nc_inq_dimlen(ncid, dimids[i], &size) );
928 vars[nvar]->
count[i] = size;
929 vars[nvar]->
start[i] = 0;
931 if ( tint > 0.0 ) vars[nvar]->
count[0] = 1;
935 if ( files[fid]->deflate_level > 0 ) {
936 CHECK_ERROR( nc_def_var_chunking(ncid, varid, NC_CHUNKED, vars[nvar]->count) );
937 CHECK_ERROR( nc_def_var_deflate(ncid, varid, 0, 1, files[fid]->deflate_level) );
941 vars[nvar]->
varid = varid;
959 ncid = vars[vid]->
ncid;
962 if (files[fid]->defmode == 1) {
964 files[fid]->defmode = 0;
968 varid = vars[vid]->
varid;
969 if ( vars[vid]->t != NULL ) {
970 if ( vars[vid]->t->
count < 0 ||
971 t_end > vars[vid]->
t->
t +
TEPS ) {
973 vars[vid]->
t->
t = t_end;
975 index[0] = vars[vid]->
t->
count;
976 CHECK_ERROR( nc_put_var1_double(ncid, vars[vid]->t->
varid, index, &t_end) );
978 CHECK_ERROR( nc_put_var1_double(ncid, vars[vid]->t->bndsid, index, &t_start) );
980 CHECK_ERROR( nc_put_var1_double(ncid, vars[vid]->t->bndsid, index, &t_end) );
983 size_t nt = vars[vid]->
t->
count + 1;
990 for(n=nt-1;n>=0;n--) {
991 if ( fabs(t[n]-t_end) <
TEPS ) {
992 vars[vid]->
start[0] = n;
998 fprintf(stderr,
"cannot find time: %f\n", t_end);
999 fprintf(stderr,
" time count is : %d, last time is: %f, diff is: %e\n", vars[vid]->t->
count < 0, vars[vid]->
t->
t, vars[vid]->
t->
t-t_end);
1000 fprintf(stderr,
" time is: ");
1001 for (n=0;n<nt;n++) fprintf(stderr,
"%f, ", t[n]);
1002 fprintf(stderr,
"\n");
1008 switch (precision) {
1010 CHECK_ERROR( nc_put_vara_double(ncid, varid, vars[vid]->start, vars[vid]->count, (
double*)var) );
1013 CHECK_ERROR( nc_put_vara_float(ncid, varid, vars[vid]->start, vars[vid]->count, (
float*)var) );
1016 fprintf(stderr,
"unsuppoted data precision: %d\n", precision);
1030 ncid = files[fid]->
ncid;
1033 if (files[fid]->defmode == 1) {
1035 files[fid]->defmode = 0;
1051 ncid = vars[vid]->
ncid;
1052 varid = vars[vid]->
varid;
1053 if ( vars[vid]->t != NULL ) {
1054 if ( vars[vid]->t->
count < 0 ||
1055 t_end > vars[vid]->
t->
t +
TEPS ) {
1056 vars[vid]->
t->
count += 1;
1057 vars[vid]->
t->
t = t_end;
1059 index[0] = vars[vid]->
t->
count;
1060 CHECK_ERROR( nc_put_var1_double(ncid, vars[vid]->t->
varid, index, &t_end) );
1062 CHECK_ERROR( nc_put_var1_double(ncid, vars[vid]->t->bndsid, index, &t_start) );
1064 CHECK_ERROR( nc_put_var1_double(ncid, vars[vid]->t->bndsid, index, &t_end) );
1067 size_t nt = vars[vid]->
t->
count + 1;
1074 for(n=nt-1;n>=0;n--) {
1075 if ( fabs(t[n]-t_end) <
TEPS ) {
1076 vars[vid]->
start[0] = n;
1082 fprintf(stderr,
"cannot find time: %f\n", t_end);
1083 fprintf(stderr,
" time count is : %d, last time is: %f, diff is: %e\n", vars[vid]->t->
count < 0, vars[vid]->
t->
t, vars[vid]->
t->
t-t_end);
1084 fprintf(stderr,
" time is: ");
1085 for (n=0;n<nt;n++) fprintf(stderr,
"%f, ", t[n]);
1086 fprintf(stderr,
"\n");
1092 switch (precision) {
1094 CHECK_ERROR( nc_put_vara_double(ncid, varid, vars[vid]->start, vars[vid]->count, (
double*)var) );
1097 CHECK_ERROR( nc_put_vara_float(ncid, varid, vars[vid]->start, vars[vid]->count, (
float*)var) );
1100 fprintf(stderr,
"unsuppoted data precision: %d\n", precision);
1115 ncid = files[fid]->
ncid;
1120 for (i=0; i<nvar; i++) {
1121 if ( vars[i] != NULL && vars[i]->ncid == ncid ) {
1122 free( vars[i]->start );
1123 free( vars[i]->count );
1129 for (i=0; i<nt; i++) {
1130 if ( tdims[i] != NULL && tdims[i]->ncid == ncid ) {
int32_t dim_size[MAX_RANK]
char dim_name[File_HSHORT *MAX_RANK]
char description[File_HMID]
char time_units[File_HMID]
char varname[File_HSHORT]