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