Loading...
Searching...
No Matches
MathOperators_array.tpp
1/*---------------------------------------------------------------------------*\
2 *
3 * bitpit
4 *
5 * Copyright (C) 2015-2021 OPTIMAD engineering Srl
6 *
7 * -------------------------------------------------------------------------
8 * License
9 * This file is part of bitpit.
10 *
11 * bitpit is free software: you can redistribute it and/or modify it
12 * under the terms of the GNU Lesser General Public License v3 (LGPL)
13 * as published by the Free Software Foundation.
14 *
15 * bitpit is distributed in the hope that it will be useful, but WITHOUT
16 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
17 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
18 * License for more details.
19 *
20 * You should have received a copy of the GNU Lesser General Public License
21 * along with bitpit. If not, see <http://www.gnu.org/licenses/>.
22 *
23\*---------------------------------------------------------------------------*/
24
25// ================================================================================== //
26// MATH OPERATORS //
27// //
28// Basic math operators for std::array. //
29// ================================================================================== //
30// INFO //
31// ================================================================================== //
32// Author : Alessandro Alaia //
33// Version : v3.0 //
34// //
35// All rights reserved. //
36// ================================================================================== //
37
43// ================================================================================== //
44// TEMPLATE IMPLEMENTATIONS //
45// ================================================================================== //
46
47// Operator "min" =================================================================== //
48
49// ---------------------------------------------------------------------------------- //
66template <class T, size_t d>
67std::array<T, d> min(
68 const std::array<T, d> &x,
69 const std::array<T, d> &y
70) {
71
72using namespace std;
73
74// ================================================================================== //
75// VARIABLES DECLARATION //
76// ================================================================================== //
77std::array<T, d> z;
78
79// ================================================================================== //
80// COMPARE VECTORS //
81// ================================================================================== //
82for (size_t i = 0; i < d; i++) {
83 z[i] = min(x[i], y[i]);
84} //next i
85
86return(z); };
87
88// ---------------------------------------------------------------------------------- //
105template <class T, size_t d>
106std::array<T, d> min(
107 const std::array<T, d> &x,
108 const T &y
109) {
110
111using namespace std;
112
113// ================================================================================== //
114// VARIABLES DECLARATION //
115// ================================================================================== //
116std::array<T, d> z;
117
118// ================================================================================== //
119// COMPARE VECTOR AND SCALAR //
120// ================================================================================== //
121for (size_t i = 0; i < d; i++) {
122 z[i] = min(x[i], y);
123} //next i
124
125return(z); };
126
127// ---------------------------------------------------------------------------------- //
144template <class T, size_t d>
145std::array<T, d> min(
146 const T &x,
147 const std::array<T, d> &y
148) {
149
150using namespace std;
151
152// ================================================================================== //
153// VARIABLES DECLARATION //
154// ================================================================================== //
155std::array<T, d> z;
156
157// ================================================================================== //
158// COMPARE VECTOR AND SCALAR //
159// ================================================================================== //
160z = min(y, x);
161
162return(z); };
163
164// ---------------------------------------------------------------------------------- //
181template <class T, size_t d, size_t n>
182std::array<std::array<T, n>, d> min(
183 const std::array<std::array<T, n>, d> &x,
184 const T &y
185) {
186
187using namespace std;
188
189// ================================================================================== //
190// VARIABLES DECLARATION //
191// ================================================================================== //
192std::array<std::array<T, n>, d> z;
193
194// ================================================================================== //
195// COMPARE VECTOR AND SCALAR //
196// ================================================================================== //
197for (size_t i = 0; i < d; i++) {
198 z[i] = min(x[i], y);
199} //next i
200
201return(z); };
202
203// ---------------------------------------------------------------------------------- //
220template <class T, size_t d, size_t n>
221std::array<std::array<T, n>, d> min(
222 const T &x,
223 const std::array<std::array<T, n>, d> &y
224) {
225
226using namespace std;
227
228// ================================================================================== //
229// VARIABLES DECLARATION //
230// ================================================================================== //
231std::array<std::array<T, n>, d> z;
232
233// ================================================================================== //
234// COMPARE VECTOR AND SCALAR //
235// ================================================================================== //
236z = min(y, x);
237
238return(z); };
239
240// Operator "minval" ================================================================ //
241
242// ---------------------------------------------------------------------------------- //
255template <class T, size_t d, class T1>
257 const std::array<T, d> &x,
258 T1 &min_value
259) {
260
261// ================================================================================== //
262// VARIABLES DECLARATION //
263// ================================================================================== //
264
265// Local variables
266T1 value;
267
268// Counters
269size_t i;
270
271// ================================================================================== //
272// FIND THE MIN-VALUE //
273// ================================================================================== //
274if (d > 0) {
275 minval(x[0], min_value);
276 for (i = 1; i < d; i++) {
277 minval(x[i], value);
278 if (value < min_value) {
279 min_value = value;
280 }
281 } //next i
282}
283
284return; };
285
286// Operator "max" =================================================================== //
287
288// ---------------------------------------------------------------------------------- //
305template <class T, size_t d>
306std::array<T, d> max(
307 const std::array<T, d> &x,
308 const std::array<T, d> &y
309) {
310
311using namespace std;
312
313// ================================================================================== //
314// VARIABLES DECLARATION //
315// ================================================================================== //
316std::array<T, d> z;
317
318// ================================================================================== //
319// COMPARE VECTORS //
320// ================================================================================== //
321for (size_t i = 0; i < d; i++) {
322 z[i] = max(x[i], y[i]);
323} //next i
324
325return(z); };
326
327// ---------------------------------------------------------------------------------- //
344template <class T, size_t d>
345std::array<T, d> max(
346 const std::array<T, d> &x,
347 const T &y
348) {
349
350using namespace std;
351
352// ================================================================================== //
353// VARIABLES DECLARATION //
354// ================================================================================== //
355std::array<T, d> z;
356
357// ================================================================================== //
358// COMPARE VECTOR AND SCALAR //
359// ================================================================================== //
360for (size_t i = 0; i < d; i++) {
361 z[i] = max(x[i], y);
362} //next i
363
364return(z); };
365
366// ---------------------------------------------------------------------------------- //
383template <class T, size_t d>
384std::array<T, d> max(
385 const T &x,
386 const std::array<T, d> &y
387) {
388
389using namespace std;
390
391// ================================================================================== //
392// VARIABLES DECLARATION //
393// ================================================================================== //
394std::array<T, d> z;
395
396// ================================================================================== //
397// COMPARE VECTOR AND SCALAR //
398// ================================================================================== //
399z = max(y, x);
400
401return(z); };
402
403// ---------------------------------------------------------------------------------- //
420template <class T, size_t d, size_t n>
421std::array<std::array<T, n>, d> max(
422 const std::array<std::array<T, n>, d> &x,
423 const T &y
424) {
425
426using namespace std;
427
428// ================================================================================== //
429// VARIABLES DECLARATION //
430// ================================================================================== //
431std::array<std::array<T, n>, d> z;
432
433// ================================================================================== //
434// COMPARE VECTOR AND SCALAR //
435// ================================================================================== //
436for (size_t i = 0; i < d; i++) {
437 z[i] = max(x[i], y);
438} //next i
439
440return(z); };
441
442// ---------------------------------------------------------------------------------- //
459template <class T, size_t d, size_t n>
460std::array<std::array<T, n>, d> max(
461 const T &x,
462 const std::array<std::array<T, n>, d> &y
463) {
464
465using namespace std;
466
467// ================================================================================== //
468// VARIABLES DECLARATION //
469// ================================================================================== //
470std::array<std::array<T, n>, d> z;
471
472// ================================================================================== //
473// COMPARE VECTOR AND SCALAR //
474// ================================================================================== //
475z = max(y, x);
476
477return(z); };
478
479
480// Operator "maxval" ================================================================ //
481
482// ---------------------------------------------------------------------------------- //
496template <class T, size_t d, class T1>
498 const std::array<T, d> &x,
499 T1 &max_value
500) {
501
502// ================================================================================== //
503// VARIABLES DECLARATION //
504// ================================================================================== //
505
506// Local variables
507T1 value;
508
509// Counters
510size_t i;
511
512// ================================================================================== //
513// FIND THE MIN-VALUE //
514// ================================================================================== //
515if (d > 0) {
516 maxval(x[0], max_value);
517 for (i = 1; i < d; i++) {
518 maxval(x[i], value);
519 if (value > max_value) {
520 max_value = value;
521 }
522 } //next i
523}
524
525return; };
526
527// Operator "sum" =================================================================== //
528
529// ---------------------------------------------------------------------------------- //
543template <class T, size_t d, class T1>
544void sum(
545 const std::array<T, d> &x,
546 T1 &s
547) {
548
549// ================================================================================== //
550// VARIABLES DECLARATION //
551// ================================================================================== //
552
553// Local variables
554T1 value;
555
556// Counters
557size_t i;
558
559// ================================================================================== //
560// PERFORM SUMMATION //
561// ================================================================================== //
562if (d > 0) {
563 sum(x[0], s);
564 for (i = 1; i < d; i++) {
565 sum(x[i], value);
566 s += value;
567 } //next i
568}
569
570return; };
571
572// Operator "abs" =================================================================== //
573
574// ---------------------------------------------------------------------------------- //
590template <class T, size_t d>
591std::array<T, d> abs(
592 const std::array<T, d> &x
593) {
594
595using namespace std;
596
597// ================================================================================== //
598// VARIABLES DECLARATION //
599// ================================================================================== //
600
601// Local variables
602std::array<T, d> z;
603
604// Counters
605size_t i;
606
607// ================================================================================== //
608// COMPUTE THE ABSOLUTE VALUE OF A VECTOR //
609// ================================================================================== //
610if (d > 0) {
611 for (i = 0; i < d; ++i) {
612 z[i] = abs(x[i]);
613 } //next i
614}
615
616return(z); };
617
618// Operator "pow" =================================================================== //
619
620// ---------------------------------------------------------------------------------- //
636template <class T, size_t d>
637std::array<T, d> pow(
638 std::array<T, d> &x,
639 double p
640) {
641
642// ================================================================================== //
643// VARIABLES DECLARATION //
644// ================================================================================== //
645
646// Local variables
647std::array<T, d> y;
648
649// Counters
650size_t i;
651
652// ================================================================================== //
653// COMPUTE ELEMENT-WISE POWER //
654// ================================================================================== //
655for (i = 0; i < d; i++) {
656 y[i] = static_cast<T>(pow(x[i], p));
657} //next i
658
659return(y); };
660
661// Operator "norm" ================================================================== //
662
663// ---------------------------------------------------------------------------------- //
674template <class T, size_t d>
675double norm1(
676 const std::array<T, d> &x
677) {
678
679using namespace std;
680
681// ================================================================================== //
682// VARIABLES DECLARATION //
683// ================================================================================== //
684
685// Local variables
686double z = 0.0;
687
688// Counters
689size_t i;
690
691// ================================================================================== //
692// COMPUTE THE P-NORM //
693// ================================================================================== //
694if (d > 0) {
695 for (i = 0; i < d; i++) {
696 z += abs(x[i]);
697 } //next i
698}
699
700return(z); };
701
702// ---------------------------------------------------------------------------------- //
713template <class T, size_t d>
714double norm2(
715 const std::array<T, d> &x
716) {
717
718using namespace std;
719
720// ================================================================================== //
721// VARIABLES DECLARATION //
722// ================================================================================== //
723
724// Local variables
725double z = 0.0;
726
727// Counters
728size_t i;
729
730// ================================================================================== //
731// COMPUTE THE P-NORM //
732// ================================================================================== //
733if (d > 0) {
734 for (i = 0; i < d; i++) {
735 z += x[i]*x[i];
736 } //next i
737}
738
739return(sqrt(z)); };
740
741// ---------------------------------------------------------------------------------- //
753template <class T, size_t d>
754double norm(
755 const std::array<T, d> &x,
756 int p
757) {
758
759using namespace std;
760
761// ================================================================================== //
762// VARIABLES DECLARATION //
763// ================================================================================== //
764
765// Local variables
766double z = 0.0;
767double t, y;
768
769// Counters
770size_t i;
771int j;
772
773// ================================================================================== //
774// COMPUTE THE P-NORM //
775// ================================================================================== //
776if (p == 1) { return(norm1(x)); }
777if (p == 2) { return(norm2(x)); }
778
779if (d > 0) {
780 for (i = 0; i < d; i++) {
781 y = 1.0;
782 t = abs(x[i]);
783 for (j = 1; j <= p; j++) {
784 y = y*t;
785 } //next j
786 //z += pow(abs(x[i]), p);
787 z += y;
788 } //next i
789}
790
791return(std::exp(std::log(std::max(z, 1.0e-307))/((double) p))); };
792
793// ---------------------------------------------------------------------------------- //
804template <class T, size_t d>
805double normInf(
806 const std::array<T, d> &x
807) {
808
809using namespace std;
810
811// ================================================================================== //
812// VARIABLES DECLARATION //
813// ================================================================================== //
814
815// Local variables
816double z = 0.0, y;
817
818// Counters
819size_t i;
820
821// ================================================================================== //
822// COMPUTE THE inf-NORM //
823// ================================================================================== //
824if (d > 0) {
825 z = abs(x[0]);
826 for (i = 1; i < d; i++) {
827 y = abs(x[i]);
828 if (y > z) {
829 z = y;
830 }
831 } //next i
832}
833
834return(z); };
835
836// Operator "dotProduct" =========================================================== //
837
838// ---------------------------------------------------------------------------------- //
850template <class T, size_t d>
852 const std::array<T, d> &x,
853 const std::array<T, d> &y
854) {
855
856// ================================================================================== //
857// VARIABLES DECLARATION //
858// ================================================================================== //
859
860// Local variables
861T dp = ((T) 0.0);
862
863// Counters
864size_t i;
865
866// ================================================================================== //
867// COMPUTE THE DOT PRODUCT //
868// ================================================================================== //
869if (d > 0) {
870 for (i = 0; i < d; i++) {
871 dp += x[i]*y[i];
872 } //next i
873}
874
875return(dp); };
876
877// Operator "crossProduct" ========================================================= //
878
879// ---------------------------------------------------------------------------------- //
889template <class T>
890std::array<T, 3> crossProduct(
891 const std::array<T, 3> &x,
892 const std::array<T, 3> &y
893) {
894
895// =================================================================================== //
896// VARIABLES DECLARATION //
897// =================================================================================== //
898std::array<T, 3> z;
899
900// =================================================================================== //
901// COMPUTE THE EXTERNAL PRODUCT //
902// =================================================================================== //
903z[0] = x[1] * y[2] - x[2] * y[1];
904z[1] = x[2] * y[0] - x[0] * y[2];
905z[2] = x[0] * y[1] - x[1] * y[0];
906
907return (z); };
908
909// ---------------------------------------------------------------------------------- //
919template <class T>
921 const std::array<T, 2> &x,
922 const std::array<T, 2> &y
923) {
924
925// =================================================================================== //
926// VARIABLES DECLARATION //
927// =================================================================================== //
928T z;
929
930// =================================================================================== //
931// COMPUTE THE EXTERNAL PRODUCT //
932// =================================================================================== //
933z = x[0] * y[1] - x[1] * y[0];
934
935return (z); };
936
std::array< T, d > abs(const std::array< T, d > &x)
void sum(const std::array< T, d > &x, T1 &s)
double norm(const std::array< T, d > &x, int p)
std::array< T, 3 > crossProduct(const std::array< T, 3 > &x, const std::array< T, 3 > &y)
void maxval(const std::array< T, d > &x, T1 &max_value)
void minval(const std::array< T, d > &x, T1 &min_value)
T dotProduct(const std::array< T, d > &x, const std::array< T, d > &y)
double norm1(const std::array< T, d > &x)
double norm2(const std::array< T, d > &x)
std::array< T, d > max(const std::array< T, d > &x, const std::array< T, d > &y)
double normInf(const std::array< T, d > &x)
std::array< T, d > pow(std::array< T, d > &x, double p)
std::array< T, d > min(const std::array< T, d > &x, const std::array< T, d > &y)
--- layout: doxygen_footer ---