Memosa-FVM  0.2
NumType.h
Go to the documentation of this file.
1 // This file os part of FVM
2 // Copyright (c) 2012 FVM Authors
3 // See LICENSE file for terms.
4 
5 #ifndef _NUMTYPE_H_
6 #define _NUMTYPE_H_
7 
8 #include <string>
9 #include <math.h>
10 #include <stdlib.h>
11 #include <stdio.h>
12 
13 using namespace std;
14 
16  {
21  };
22 
23 template<class T>
24 struct NumTypeTraits : public T
25 {
26  //default to double, override in the ones that aren't
28 };
29 
30 template<>
31 struct NumTypeTraits<bool>
32 {
33  typedef bool This_T;
34  typedef bool T_Scalar;
35  typedef bool T_BuiltIn;
36 
37  static PrimType getPrimType() {return PRIM_TYPE_BOOL;}
38  static string getTypeName() {return "bool";}
39  static int getDimension() {return 0;}
40  static void getShape(int *shp) {}
41  static int getDataSize() {return sizeof(bool);}
42  static bool getZero() {return false;}
43  static bool getUnity() {return true;}
44  static bool getNegativeUnity() {return false;}
45 
46  static bool sqrt(const bool x) {return false;}
47 
48  static void write(FILE* fp, const bool x) {fprintf(fp,"%d",(int)x);}
49  static void accumulateOneNorm(bool& sum, const bool& v) {}
50  static void accumulateDotProduct(bool& sum, const bool& v0, const bool& v1)
51  {}
52 
53  static void reduceSum(T_Scalar& sum, const This_T& x) {}
54 
55  static void safeDivide(bool& x, const bool& y) {}
56  static void normalize(bool& x, const bool& y) {}
57  static void setMax(bool& x, const bool& y) {}
58 };
59 
60 template<>
61 struct NumTypeTraits<int>
62 {
63  typedef int This_T;
64  typedef int T_Scalar;
65  typedef int T_BuiltIn;
66 
67  static PrimType getPrimType() {return PRIM_TYPE_INT;}
68  static string getTypeName() {return "int";}
69  static int getDimension() {return 0;}
70  static void getShape(int *shp) {}
71  static int getDataSize() {return sizeof(int);}
72  static int getZero() {return 0;}
73  static int getUnity() {return 1;}
74  static int getNegativeUnity() {return -1;}
75  static int sqrt(const int x) {return (int)::sqrt((double)x);}
76  static void write(FILE* fp, const int x) {fprintf(fp,"%d",x);}
77  static void accumulateOneNorm(int& sum, const int& v) { sum += abs(v);}
78  static void accumulateDotProduct(int& sum, const int& v0, const int& v1)
79  { sum += v0*v1;}
80 
81  static void reduceSum(T_Scalar& sum, const This_T& x) {sum+=x;}
82 
83  static void safeDivide(int& x, const int& y) {if (y!=0) x/=y;}
84  static void normalize(int& x, const int& y) {if (y!=0) x/=y;}
85  static void setMax(int& x, const int& y) {if (y>x) x=y;}
86 
87 };
88 
89 template<>
90 struct NumTypeTraits<double>
91 {
92  typedef double This_T;
93  typedef double T_Scalar;
94  typedef double T_BuiltIn;
95 
97  static string getTypeName() {return "double";}
98  static int getDimension() {return 0;}
99  static void getShape(int *shp) {}
100  static int getDataSize() {return sizeof(double);}
101  static double getZero() {return 0;}
102  static double getUnity() {return 1.;}
103  static double getNegativeUnity() {return -1.;}
104  static double sqrt(const double x) {return ::sqrt(x);}
105  static void write(FILE* fp, const double x) {fprintf(fp,"%lf",x);}
106  static double doubleMeasure(const double x) {return fabs(x);}
107 
108  static void accumulateOneNorm(double& sum, const double& v) { sum += fabs(v);}
109  static void accumulateDotProduct(double& sum, const double& v0, const double& v1)
110  { sum += v0*v1;}
111 
112  static void reduceSum(T_Scalar& sum, const This_T& x) {sum+=x;}
113  static void safeDivide(double& x, const double& y) {if (y!=0) x/=y;}
114  static void normalize(double& x, const double& y) {if (y!=0) x/=y;}
115  static void setMax(double& x, const double& y) {if (y>x) x=y;}
116 
117 };
118 
119 template<>
120 struct NumTypeTraits<float>
121 {
122  typedef float T_Scalar;
123  typedef float This_T;
124  typedef float T_BuiltIn;
125 
127 
128  static string getTypeName() {return "float";}
129  static int getDimension() {return 0;}
130  static void getShape(int *shp) {}
131  static int getDataSize() {return sizeof(double);}
132  static float getZero() {return 0;}
133  static float getUnity() {return 1.;}
134  static float getNegativeUnity() {return -1.;}
135  static float sqrt(const float x) {return ::sqrt(x);}
136  static void write(FILE* fp, const float x) {fprintf(fp,"%f",x);}
137  static double doubleMeasure(const float x) {return fabs(double(x));}
138  static void accumulateOneNorm(float& sum, const float& v) { sum += fabs(v);}
139  static void accumulateDotProduct(float& sum, const float& v0, const float& v1)
140  { sum += v0*v1;}
141  static void reduceSum(T_Scalar& sum, const This_T& x) {sum+=x;}
142  static void safeDivide(float& x, const float& y) {if (y!=0) x/=y;}
143  static void normalize(float& x, const float& y) {if (y!=0) x/=y;}
144  static void setMax(float& x, const float& y) {if (y>x) x=y;}
145 };
146 
147 template<class T>
149 {
150  static void limit(T& val, const double min, const double max)
151  {throw;}
152 
153 };
154 
155 
156 template<>
157 struct ArrayScalarTraits<double>
158 {
159  static void limit(double& val, const double min, const double max)
160  {
161  if (val < min)
162  val = min;
163  else if (val > max)
164  val = max;
165  }
166 };
167 
168 template<>
169 struct ArrayScalarTraits<float>
170 {
171  static void limit(float& val, const double min, const double max)
172  {
173  if (val < min)
174  val = min;
175  else if (val > max)
176  val = max;
177  }
178 };
179 #endif
static void getShape(int *shp)
Definition: NumType.h:99
static int getZero()
Definition: NumType.h:72
static float getUnity()
Definition: NumType.h:133
static void normalize(int &x, const int &y)
Definition: NumType.h:84
static void limit(T &val, const double min, const double max)
Definition: NumType.h:150
static void write(FILE *fp, const int x)
Definition: NumType.h:76
static PrimType getPrimType()
Definition: NumType.h:96
static PrimType getPrimType()
Definition: NumType.h:67
static double sqrt(const double x)
Definition: NumType.h:104
static bool getZero()
Definition: NumType.h:42
static double doubleMeasure(const float x)
Definition: NumType.h:137
static string getTypeName()
Definition: NumType.h:38
static void accumulateOneNorm(bool &sum, const bool &v)
Definition: NumType.h:49
static int getNegativeUnity()
Definition: NumType.h:74
static bool getUnity()
Definition: NumType.h:43
static int getDimension()
Definition: NumType.h:129
double max(double x, double y)
Definition: Octree.cpp:18
static void write(FILE *fp, const double x)
Definition: NumType.h:105
static void setMax(bool &x, const bool &y)
Definition: NumType.h:57
static void safeDivide(double &x, const double &y)
Definition: NumType.h:113
static float getNegativeUnity()
Definition: NumType.h:134
static void accumulateDotProduct(bool &sum, const bool &v0, const bool &v1)
Definition: NumType.h:50
static void getShape(int *shp)
Definition: NumType.h:130
static double getNegativeUnity()
Definition: NumType.h:103
static bool getNegativeUnity()
Definition: NumType.h:44
static void reduceSum(T_Scalar &sum, const This_T &x)
Definition: NumType.h:141
static void accumulateOneNorm(float &sum, const float &v)
Definition: NumType.h:138
static int getDataSize()
Definition: NumType.h:100
static void safeDivide(int &x, const int &y)
Definition: NumType.h:83
Tangent sqrt(const Tangent &a)
Definition: Tangent.h:317
static void setMax(double &x, const double &y)
Definition: NumType.h:115
static int getUnity()
Definition: NumType.h:73
static void accumulateDotProduct(float &sum, const float &v0, const float &v1)
Definition: NumType.h:139
static int sqrt(const int x)
Definition: NumType.h:75
static void accumulateOneNorm(int &sum, const int &v)
Definition: NumType.h:77
static void write(FILE *fp, const bool x)
Definition: NumType.h:48
static double getZero()
Definition: NumType.h:101
static PrimType getPrimType()
Definition: NumType.h:126
static void normalize(float &x, const float &y)
Definition: NumType.h:143
static void accumulateOneNorm(double &sum, const double &v)
Definition: NumType.h:108
static void write(FILE *fp, const float x)
Definition: NumType.h:136
static int getDimension()
Definition: NumType.h:39
static double doubleMeasure(const double x)
Definition: NumType.h:106
static void reduceSum(T_Scalar &sum, const This_T &x)
Definition: NumType.h:53
static void setMax(int &x, const int &y)
Definition: NumType.h:85
static float sqrt(const float x)
Definition: NumType.h:135
static void normalize(bool &x, const bool &y)
Definition: NumType.h:56
static string getTypeName()
Definition: NumType.h:68
static void safeDivide(bool &x, const bool &y)
Definition: NumType.h:55
static void reduceSum(T_Scalar &sum, const This_T &x)
Definition: NumType.h:81
static void normalize(double &x, const double &y)
Definition: NumType.h:114
static int getDimension()
Definition: NumType.h:69
Tangent fabs(const Tangent &a)
Definition: Tangent.h:312
static void safeDivide(float &x, const float &y)
Definition: NumType.h:142
static double getUnity()
Definition: NumType.h:102
static void accumulateDotProduct(int &sum, const int &v0, const int &v1)
Definition: NumType.h:78
static int getDimension()
Definition: NumType.h:98
static string getTypeName()
Definition: NumType.h:128
static int getDataSize()
Definition: NumType.h:131
static void reduceSum(T_Scalar &sum, const This_T &x)
Definition: NumType.h:112
static void accumulateDotProduct(double &sum, const double &v0, const double &v1)
Definition: NumType.h:109
static void setMax(float &x, const float &y)
Definition: NumType.h:144
static void getShape(int *shp)
Definition: NumType.h:70
static string getTypeName()
Definition: NumType.h:97
static int getDataSize()
Definition: NumType.h:41
static void limit(double &val, const double min, const double max)
Definition: NumType.h:159
static PrimType getPrimType()
Definition: NumType.h:37
double min(double x, double y)
Definition: Octree.cpp:23
static bool sqrt(const bool x)
Definition: NumType.h:46
static PrimType getPrimType()
Definition: NumType.h:27
static void limit(float &val, const double min, const double max)
Definition: NumType.h:171
static int getDataSize()
Definition: NumType.h:71
static void getShape(int *shp)
Definition: NumType.h:40
PrimType
Definition: NumType.h:15
static float getZero()
Definition: NumType.h:132