source: XIOS/dev/dev_cmip6_omp/extern/src_netcdf4/dapodom.c @ 1606

Last change on this file since 1606 was 409, checked in by ymipsl, 11 years ago

Add improved nectdf internal library src

YM

  • Property svn:eol-style set to native
File size: 6.2 KB
Line 
1/*********************************************************************
2 *   Copyright 1993, UCAR/Unidata
3 *   See netcdf/COPYRIGHT file for copying and redistribution conditions.
4 *   $Header: /upc/share/CVS/netcdf-3/libncdap3/dapodom.c,v 1.12 2010/05/27 21:34:08 dmh Exp $
5 *********************************************************************/
6
7#include "ncdap3.h"
8#include "dapodom.h"
9
10/**********************************************/
11/* Define methods for a dimension dapodometer*/
12
13Dapodometer*
14newdapodometer(DCEslice* slices, unsigned int first, unsigned int rank)
15{
16    int i;
17    Dapodometer* odom = (Dapodometer*)calloc(1,sizeof(Dapodometer));
18    MEMCHECK(odom,NULL);
19    if(rank == 0) {
20        return newdapodometer1(1);
21    }
22    odom->rank = rank;
23    ASSERT(odom->rank <= NC_MAX_VAR_DIMS);
24    for(i=0;i<odom->rank;i++) {
25        DCEslice* slice = slices+(first+i);
26        odom->slices[i] = *slice;
27        odom->index[i] = odom->slices[i].first;
28    }   
29    return odom;
30}
31
32Dapodometer*
33newsimpledapodometer(DCEsegment* segment, unsigned int rank)
34{
35    int i;
36    Dapodometer* odom = (Dapodometer*)calloc(1,sizeof(Dapodometer));
37    MEMCHECK(odom,NULL);
38    if(rank == 0) {
39        return newdapodometer1(1);
40    }
41    odom->rank = rank;
42    assert(odom->rank <= NC_MAX_VAR_DIMS);
43    assert(segment->slicesdefined && segment->slicesdeclized);
44    for(i=0;i<odom->rank;i++) {
45        DCEslice* odslice = &odom->slices[i];
46        DCEslice* segslice = &segment->slices[i];
47        odslice->first = 0;
48        odslice->stride = 1;
49        odslice->declsize = segslice->count;
50        odslice->length = odslice->declsize;
51        odslice->stop = odslice->declsize;
52        odslice->count = odslice->declsize;
53        odom->index[i] = 0;
54    }   
55    return odom;
56}
57
58Dapodometer*
59newdapodometer1(unsigned int count)
60{
61    Dapodometer* odom = (Dapodometer*)calloc(1,sizeof(Dapodometer));
62    MEMCHECK(odom,NULL);
63    odom->rank = 1;
64    odom->slices[0].first = 0;
65    odom->slices[0].length = count;
66    odom->slices[0].stride = 1;
67    odom->slices[0].stop = count;
68    odom->slices[0].declsize = count;
69    odom->slices[0].count = count;
70    odom->index[0] = 0;
71    return odom;
72}
73
74void
75freedapodometer(Dapodometer* odom)
76{
77    if(odom) free(odom);
78}
79
80char*
81dapodometerprint(Dapodometer* odom)
82{
83    int i;
84    static char line[1024];
85    char tmp[64];
86    line[0] = '\0';
87    if(odom->rank == 0) {
88        strcat(line,"[]");
89    } else for(i=0;i<odom->rank;i++) {
90        sprintf(tmp,"[%lu/%lu:%lu:%lu]",
91                (unsigned long)odom->index[i],
92                (unsigned long)odom->slices[i].first,
93                (unsigned long)odom->slices[i].stride,
94                (unsigned long)odom->slices[i].length);
95        strcat(line,tmp);       
96    }
97    return line;
98}
99
100int
101dapodometermore(Dapodometer* odom)
102{
103    return (odom->index[0] < odom->slices[0].stop);
104}
105
106void
107dapodometerreset(Dapodometer* odom)
108{
109    int rank = odom->rank;
110    while(rank-- > 0) {odom->index[rank] = odom->slices[rank].first;}
111}
112
113/* Convert current dapodometer settings to a single integer count*/
114size_t
115dapodometercount(Dapodometer* odom)
116{
117    int i;
118    size_t offset = 0;
119    for(i=0;i<odom->rank;i++) {
120        offset *= odom->slices[i].declsize;
121        offset += odom->index[i];
122    } 
123    return offset;
124}
125
126/*
127Given a dapodometer, compute the total
128number of elements in its space
129as determined by declsize; start at
130offset wheel
131*/
132
133size_t
134dapodometerspace(Dapodometer* odom, unsigned int wheel)
135{
136    unsigned int i,rank = odom->rank;
137    size_t count = 1;
138    DCEslice* slice;
139    ASSERT((wheel < rank));
140    slice = odom->slices+wheel;
141    for(i=wheel;i<rank;i++,slice++) {
142        count *= slice->declsize;
143    }
144    return count;
145}
146
147/*
148Compute the number of elements
149that will be returned as the odometer
150is incremented to its stop point.
151*/
152
153size_t
154dapodometerpoints(Dapodometer* odom)
155{
156    unsigned int i,rank = odom->rank;
157    size_t count = 1;
158    DCEslice* slice = odom->slices;
159    for(i=0;i<rank;i++,slice++) {
160        size_t slicecount = (slice->length/slice->stride);
161        count *= slicecount;
162    }
163    return count;
164}
165
166int
167dapodometerincr(Dapodometer* odom)
168{
169    return dapodometerincrith(odom,-1);
170}
171
172int
173dapodometerincrith(Dapodometer* odom, int wheel)
174{
175    int i; /* do not make unsigned */
176    DCEslice* slice;
177    if(odom->rank == 0) return 0; 
178    if(wheel < 0) wheel = (odom->rank - 1);
179    for(slice=odom->slices+(wheel),i=wheel;i>=0;i--,slice--) {
180        odom->index[i] += slice->stride;
181        if(odom->index[i] < slice->stop) break;
182        if(i == 0) return 0; /* leave the 0th entry if it overflows*/
183        odom->index[i] = slice->first; /* reset this position*/
184    }
185    return 1;
186}
187
188/**************************************************/
189int
190dapodometervarmcount(Dapodometer* odom, const ptrdiff_t* steps, const size_t* declsizes)
191{
192    int i;
193    size_t offset = 0;
194    for(i=0;i<odom->rank;i++) {
195        size_t tmp;
196        tmp = odom->index[i];
197        tmp = tmp - odom->slices[i].first;
198        tmp = tmp / odom->slices[i].stride;
199        tmp = tmp * steps[i];
200        offset += tmp;
201    } 
202    return offset;
203}
204
205
206/* Return the current set of indices */
207size_t*
208dapodometerindices(Dapodometer* odom)
209{
210    if(odom == NULL) return NULL;
211    return odom->index;
212}
213
214Dapodometer*
215newdapodometer2(const size_t* start, const size_t* count, const ptrdiff_t* stride,
216                unsigned int first, unsigned int rank)
217{
218    int i;
219    Dapodometer* odom = (Dapodometer*)calloc(1,sizeof(Dapodometer));
220    MEMCHECK(odom,NULL);
221    odom->rank = rank;
222    assert(odom->rank <= NC_MAX_VAR_DIMS);
223    for(i=0;i<odom->rank;i++) {
224        odom->slices[i].first = start[first+i];
225        odom->slices[i].stride = (size_t)stride[first+i];
226        odom->slices[i].length = count[first+i] * stride[first+i];
227        odom->slices[i].stop = (odom->slices[i].first+odom->slices[i].length);
228        odom->slices[i].declsize = odom->slices[i].stop;
229        odom->slices[i].count = (odom->slices[i].length /odom->slices[i].stride);
230        odom->index[i] = odom->slices[i].first;
231    }   
232    return odom;
233}
234
235Dapodometer*
236newdapodometer3(int rank, size_t* dimsizes)
237{
238    int i;
239    Dapodometer* odom = (Dapodometer*)calloc(1,sizeof(Dapodometer));
240    MEMCHECK(odom,NULL);
241    odom->rank = rank;
242    for(i=0;i<rank;i++) {
243        odom->slices[i].first = 0;
244        odom->slices[i].length = dimsizes[i];
245        odom->slices[i].stride = 1;
246        odom->slices[i].stop = dimsizes[i];
247        odom->slices[i].declsize = dimsizes[i];
248        odom->slices[i].count = (odom->slices[i].length / odom->slices[i].stride);
249        odom->index[i] = 0;
250    }
251    return odom;
252}
Note: See TracBrowser for help on using the repository browser.