source: issm/trunk-jpl/src/c/classes/Options/OptionUtilities.cpp@ 15012

Last change on this file since 15012 was 15012, checked in by Mathieu Morlighem, 12 years ago

CHG: moved classes/objects back to classes

File size: 2.8 KB
Line 
1/*!\file OptionUtilities.cpp
2 * \brief: implementation of the options utilities
3 */
4
5/*Headers:*/
6/*{{{*/
7#ifdef HAVE_CONFIG_H
8 #include <config.h>
9#else
10#error "Cannot compile with HAVE_CONFIG_H symbol! run configure first!"
11#endif
12
13#include "../classes.h"
14#include "../../shared/shared.h"
15/*}}}*/
16
17/*FUNCTION ColumnWiseDimsFromIndex{{{*/
18int ColumnWiseDimsFromIndex(int* dims,int index,int* size,int ndims){
19
20 int i;
21 int aprod=1;
22
23 /*check for index too large */
24 for (i=0;i<ndims;i++) aprod*=size[i];
25 if (index >= aprod) _error_("Index " << index << " exceeds number of elements " << aprod << ".");
26
27 /*calculate the dimensions (being careful of integer division) */
28 for (i=ndims-1; i>=0; i--) {
29 aprod=reCast<int>(((IssmPDouble)aprod+0.5)/(IssmPDouble)size[i]);
30 dims[i]=(int)floor(((IssmPDouble)index+0.5)/(IssmPDouble)aprod);
31 index-=dims[i]*aprod;
32 }
33
34 return(0);
35}/*}}}*/
36/*FUNCTION IndexFromColumnWiseDims{{{*/
37int IndexFromColumnWiseDims(int* dims, int* size, int ndims) {
38
39 int i;
40 int index=0;
41
42 /*check for any dimension too large */
43 for (i=0;i<ndims;i++){
44 if (dims[i] >= size[i]) _error_("Dimension " << i << " of " << dims[i] << " exceeds size of " << size[i] << ".");
45 }
46
47 /*calculate the index */
48 for (i=ndims-1; i>=0; i--){
49 index*=size[i];
50 index+=dims[i];
51 }
52
53 return(index);
54}/*}}}*/
55/*FUNCTION RowWiseDimsFromIndex{{{*/
56int RowWiseDimsFromIndex(int* dims, int index, int* size, int ndims) {
57
58 int i;
59 int aprod=1;
60
61 /*check for index too large */
62 for (i=0; i<ndims; i++) aprod*=size[i];
63 if (index >= aprod) _error_("Index " << index << " exceeds number of elements " << aprod << ".");
64
65 /*calculate the dimensions (being careful of integer division) */
66 for (i=0; i<ndims; i++) {
67 aprod=(int)(((IssmPDouble)aprod+0.5)/(IssmPDouble)size[i]);
68 dims[i]=(int)floor(((IssmPDouble)index+0.5)/(IssmPDouble)aprod);
69 index-=dims[i]*aprod;
70 }
71
72 return(0);
73}/*}}}*/
74/*FUNCTION IndexFromRowWiseDims{{{*/
75int IndexFromRowWiseDims(int* dims, int* size, int ndims) {
76
77 int i;
78 int index=0;
79
80 /*check for any dimension too large */
81 for (i=0; i<ndims; i++){
82 if (dims[i] >= size[i]) _error_("Dimension " << i << " of " << dims[i] << " exceeds size of " << size[i] << ".");
83 }
84
85 /*calculate the index */
86 for (i=0; i<ndims; i++) {
87 index*=size[i];
88 index+=dims[i];
89 }
90
91 return(index);
92}/*}}}*/
93/*FUNCTION StringFromDims{{{*/
94int StringFromDims(char* cstr, int* dims, int ndims) {
95
96 sprintf(&cstr[0],"[");
97 for(int i=0; i<ndims-1; i++) sprintf(&cstr[strlen(cstr)],"%d,",dims[i]);
98 sprintf(&cstr[strlen(cstr)],"%d]",dims[ndims-1]);
99
100 return(0);
101}/*}}}*/
102/*FUNCTION StringFromSize{{{*/
103int StringFromSize(char* cstr, int* size, int ndims) {
104
105 sprintf(&cstr[0],"[");
106 for(int i=0; i<ndims-1; i++) sprintf(&cstr[strlen(cstr)],"%dx",size[i]);
107 sprintf(&cstr[strlen(cstr)],"%d]",size[ndims-1]);
108
109 return(0);
110}/*}}}*/
Note: See TracBrowser for help on using the repository browser.