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