source: issm/trunk-jpl/src/c/objects/Options/OptionUtilities.cpp@ 12572

Last change on this file since 12572 was 12572, checked in by utke, 13 years ago

reCast

File size: 2.9 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 <stdio.h>
14#include <string.h>
15#include "../objects.h"
16#include "../../shared/shared.h"
17#include "../../Container/Container.h"
18#include "../../include/include.h"
19/*}}}*/
20
21/*FUNCTION ColumnWiseDimsFromIndex{{{*/
22int ColumnWiseDimsFromIndex(int* dims,int index,int* size,int ndims){
23
24 int i;
25 int aprod=1;
26
27 /*check for index too large */
28 for (i=0;i<ndims;i++) aprod*=size[i];
29 if (index >= aprod) _error2_("Index " << index << " exceeds number of elements " << aprod << ".");
30
31 /*calculate the dimensions (being careful of integer division) */
32 for (i=ndims-1; i>=0; i--) {
33 aprod=reCast<int>(((IssmPDouble)aprod+0.5)/(IssmPDouble)size[i]);
34 dims[i]=(int)floor(((IssmPDouble)index+0.5)/(IssmPDouble)aprod);
35 index-=dims[i]*aprod;
36 }
37
38 return(0);
39}/*}}}*/
40/*FUNCTION IndexFromColumnWiseDims{{{*/
41int IndexFromColumnWiseDims(int* dims, int* size, int ndims) {
42
43 int i;
44 int index=0;
45
46 /*check for any dimension too large */
47 for (i=0;i<ndims;i++){
48 if (dims[i] >= size[i]) _error2_("Dimension " << i << " of " << dims[i] << " exceeds size of " << size[i] << ".");
49 }
50
51 /*calculate the index */
52 for (i=ndims-1; i>=0; i--){
53 index*=size[i];
54 index+=dims[i];
55 }
56
57 return(index);
58}/*}}}*/
59/*FUNCTION RowWiseDimsFromIndex{{{*/
60int RowWiseDimsFromIndex(int* dims, int index, int* size, int ndims) {
61
62 int i;
63 int aprod=1;
64
65 /*check for index too large */
66 for (i=0; i<ndims; i++) aprod*=size[i];
67 if (index >= aprod) _error2_("Index " << index << " exceeds number of elements " << aprod << ".");
68
69 /*calculate the dimensions (being careful of integer division) */
70 for (i=0; i<ndims; i++) {
71 aprod=(int)(((IssmPDouble)aprod+0.5)/(IssmPDouble)size[i]);
72 dims[i]=(int)floor(((IssmPDouble)index+0.5)/(IssmPDouble)aprod);
73 index-=dims[i]*aprod;
74 }
75
76 return(0);
77}/*}}}*/
78/*FUNCTION IndexFromRowWiseDims{{{*/
79int IndexFromRowWiseDims(int* dims, int* size, int ndims) {
80
81 int i;
82 int index=0;
83
84 /*check for any dimension too large */
85 for (i=0; i<ndims; i++){
86 if (dims[i] >= size[i]) _error2_("Dimension " << i << " of " << dims[i] << " exceeds size of " << size[i] << ".");
87 }
88
89 /*calculate the index */
90 for (i=0; i<ndims; i++) {
91 index*=size[i];
92 index+=dims[i];
93 }
94
95 return(index);
96}/*}}}*/
97/*FUNCTION StringFromDims{{{*/
98int StringFromDims(char* cstr, int* dims, int ndims) {
99
100 sprintf(&cstr[0],"[");
101 for(int i=0; i<ndims-1; i++) sprintf(&cstr[strlen(cstr)],"%d,",dims[i]);
102 sprintf(&cstr[strlen(cstr)],"%d]",dims[ndims-1]);
103
104 return(0);
105}/*}}}*/
106/*FUNCTION StringFromSize{{{*/
107int StringFromSize(char* cstr, int* size, int ndims) {
108
109 sprintf(&cstr[0],"[");
110 for(int i=0; i<ndims-1; i++) sprintf(&cstr[strlen(cstr)],"%dx",size[i]);
111 sprintf(&cstr[strlen(cstr)],"%d]",size[ndims-1]);
112
113 return(0);
114}/*}}}*/
Note: See TracBrowser for help on using the repository browser.