KADATH
scalar_math.cpp
1 /*
2  Copyright 2017 Philippe Grandclement
3 
4  This file is part of Kadath.
5 
6  Kadath is free software: you can redistribute it and/or modify
7  it under the terms of the GNU General Public License as published by
8  the Free Software Foundation, either version 3 of the License, or
9  (at your option) any later version.
10 
11  Kadath is distributed in the hope that it will be useful,
12  but WITHOUT ANY WARRANTY; without even the implied warranty of
13  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14  GNU General Public License for more details.
15 
16  You should have received a copy of the GNU General Public License
17  along with Kadath. If not, see <http://www.gnu.org/licenses/>.
18 */
19 
20 #include "scalar.hpp"
21 #include "tensor_impl.hpp"
22 namespace Kadath {
23 void Scalar::operator+= (const Scalar& so) {
24  assert (&espace==&so.espace) ;
25  *this = *this + so ;
26 }
27 
28 void Scalar::operator-= (const Scalar& so) {
29  assert (&espace==&so.espace) ;
30  *this = *this - so ;
31 }
32 
33 void Scalar::operator*= (const Scalar& so) {
34  assert (&espace==&so.espace) ;
35  *this = *this * so ;
36 }
37 
38 void Scalar::operator/= (const Scalar& so) {
39  assert (&espace==&so.espace) ;
40  *this = *this / so ;
41 }
42 
43 void Scalar::operator+= (double xx) {
44  *this = *this + xx ;
45 }
46 
47 void Scalar::operator-= (double xx) {
48  *this = *this - xx ;
49 }
50 
51 
52 void Scalar::operator*= (double xx) {
53  *this = *this * xx ;
54 }
55 
56 
57 void Scalar::operator/= (double xx) {
58  *this = *this / xx ;
59 }
60 
61 
62 Scalar sin(const Scalar& so) {
63  Scalar res (so, false) ;
64  for (int i=0 ; i<so.get_nbr_domains() ; i++)
65  res.set_domain(i) = sin(so(i)) ;
66  return res ;
67 }
68 
69 Scalar cos(const Scalar& so) {
70  Scalar res (so, false) ;
71  for (int i=0 ; i<so.get_nbr_domains() ; i++)
72  res.set_domain(i) = cos(so(i)) ;
73  return res ;
74 }
75 
76 
77 Scalar operator+ (const Scalar& so) {
78  Scalar res (so) ;
79  return res ;
80 }
81 
82 Scalar operator- (const Scalar& so) {
83  Scalar res (so, false) ;
84  for (int i=0 ; i<so.get_nbr_domains() ; i++)
85  res.set_domain(i) = -so(i) ;
86  return res ;
87 }
88 
89 
90 Scalar operator+ (const Scalar& a, const Scalar& b) {
91  assert (&a.espace==&b.espace) ;
92  Scalar res(a, false) ;
93  for (int i=0 ; i<a.get_nbr_domains() ; i++)
94  res.set_domain(i) = a(i) + b(i) ;
95  return res ;
96 }
97 
98 
99 Scalar operator+ (const Scalar& so, double x) {
100  Scalar res(so, false) ;
101  for (int i=0 ; i<so.get_nbr_domains() ; i++)
102  res.set_domain(i) = so(i) + x ;
103  return res ;
104 }
105 
106 
107 Scalar operator+ (double x, const Scalar& so) {
108  Scalar res(so, false) ;
109  for (int i=0 ; i<so.get_nbr_domains() ; i++)
110  res.set_domain(i) = so(i) + x ;
111  return res ;
112 }
113 
114 Scalar operator- (const Scalar& a, const Scalar& b) {
115  assert (&a.espace==&b.espace) ;
116  Scalar res(a, false) ;
117  for (int i=0 ; i<a.get_nbr_domains() ; i++)
118  res.set_domain(i) = a(i) - b(i) ;
119  return res ;
120 }
121 
122 Scalar operator- (const Scalar& so, double x) {
123  Scalar res(so, false) ;
124  for (int i=0 ; i<so.get_nbr_domains() ; i++)
125  res.set_domain(i) = so(i) - x ;
126  return res ;
127 }
128 
129 Scalar operator- (double x, const Scalar& so) {
130  Scalar res(so, false) ;
131  for (int i=0 ; i<so.get_nbr_domains() ; i++)
132  res.set_domain(i) = x-so(i) ;
133  return res ;
134 }
135 
136 Scalar operator* (const Scalar& a, const Scalar& b) {
137  assert (&a.espace==&b.espace) ;
138  Scalar res(a, false) ;
139  for (int i=0 ; i<a.get_nbr_domains() ; i++)
140  res.set_domain(i) = a(i) * b(i) ;
141  return res ;
142 }
143 
144 
145 Scalar operator* (const Scalar& so, double x) {
146  Scalar res(so, false) ;
147  for (int i=0 ; i<so.get_nbr_domains() ; i++)
148  res.set_domain(i) = so(i) * x ;
149  return res ;
150 }
151 
152 Scalar operator* (double x, const Scalar& so) {
153  return (so*x);
154 }
155 
156 Scalar operator* (const Scalar& so, int m) {
157  Scalar res(so, false) ;
158  for (int i=0 ; i<so.get_nbr_domains() ; i++)
159  res.set_domain(i) = so(i) * m ;
160  return res ;
161 }
162 
163 Scalar operator* (int m, const Scalar& so) {
164  return (so*m);
165 }
166 
167 Scalar operator* (const Scalar& so, long int m) {
168  Scalar res(so, false) ;
169  for (int i=0 ; i<so.get_nbr_domains() ; i++)
170  res.set_domain(i) = so(i) * m ;
171  return res ;
172 }
173 
174 Scalar operator* (long int m, const Scalar& so) {
175  return (so*m);
176 }
177 
178 Scalar operator/ (const Scalar& a, const Scalar& b) {
179  assert (&a.espace==&b.espace) ;
180  Scalar res(a, false) ;
181  for (int i=0 ; i<a.get_nbr_domains() ; i++)
182  res.set_domain(i) = a(i) / b(i) ;
183  return res ;
184 }
185 
186 Scalar operator/ (const Scalar& so, double x) {
187  Scalar res(so, false) ;
188  for (int i=0 ; i<so.get_nbr_domains() ; i++)
189  res.set_domain(i) = so(i) / x ;
190  return res ;
191 }
192 
193 Scalar operator/ (double x, const Scalar& so) {
194  Scalar res(so, false) ;
195  for (int i=0 ; i<so.get_nbr_domains() ; i++)
196  res.set_domain(i) = x/so(i) ;
197  return res ;
198 }
199 
200 Scalar pow (const Scalar& so, int n) {
201  Scalar res(so, false) ;
202  for (int i=0 ; i<so.get_nbr_domains() ; i++)
203  res.set_domain(i) = pow(so(i), n) ;
204  return res ;
205 }
206 
207 Scalar pow (const Scalar& so, double nn) {
208  Scalar res(so, false) ;
209  for (int i=0 ; i<so.get_nbr_domains() ; i++)
210  res.set_domain(i) = pow(so(i), nn) ;
211  return res ;
212 }
213 
214 Scalar sqrt (const Scalar& so) {
215  Scalar res(so, false) ;
216  for (int i=0 ; i<so.get_nbr_domains() ; i++)
217  res.set_domain(i) = sqrt(so(i)) ;
218  return res ;
219 }
220 
221 Scalar exp (const Scalar& so) {
222  Scalar res(so, false) ;
223  for (int i=0 ; i<so.get_nbr_domains() ; i++)
224  res.set_domain(i) = exp(so(i)) ;
225  return res ;
226 }
227 
228 Scalar atan (const Scalar& so) {
229  Scalar res(so, false) ;
230  for (int i=0 ; i<so.get_nbr_domains() ; i++)
231  res.set_domain(i) = atan(so(i)) ;
232  return res ;
233 }
234 
235 double diffmax (const Scalar& aa, const Scalar& bb) {
236  assert (&aa.espace==&bb.espace) ;
237  double res = 0 ;
238  for (int dd=0 ; dd<aa.espace.get_nbr_domains() ; dd++) {
239  double courant = diffmax (*aa.val_zones[dd], *bb.val_zones[dd]) ;
240  if (courant>res)
241  res = courant ;
242  }
243  return res ;
244 } }
The class Scalar does not really implements scalars in the mathematical sense but rather tensorial co...
Definition: scalar.hpp:67
Val_domain & set_domain(int)
Read/write of a particular Val_domain.
Definition: scalar.hpp:555
void operator*=(const Scalar &)
Operator *=.
Definition: scalar_math.cpp:33
void operator+=(const Scalar &)
Operator +=.
Definition: scalar_math.cpp:23
void operator-=(const Scalar &)
Operator -=.
Definition: scalar_math.cpp:28
void operator/=(const Scalar &)
Operator /=.
Definition: scalar_math.cpp:38
Memory_mapped_array< Val_domain * > val_zones
Pointers on the various Val_domain describing the field in each Domain.
Definition: scalar.hpp:70
int get_nbr_domains() const
Definition: scalar.hpp:117
int get_nbr_domains() const
Returns the number of Domains.
Definition: space.hpp:1375
const Space & espace
The Space.
Definition: tensor.hpp:154