13#include <Kokkos_Core.hpp>
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
42 class EvaluationDDim1,
43 class EvaluationDDim2,
44 class LowerExtrapolationRule1,
45 class UpperExtrapolationRule1,
46 class LowerExtrapolationRule2,
47 class UpperExtrapolationRule2>
52 using continuous_dimension_type1 =
typename BSplines1::continuous_dimension_type;
55 using continuous_dimension_type2 =
typename BSplines2::continuous_dimension_type;
58 using exec_space = ExecSpace;
61 using memory_space = MemorySpace;
64 using evaluation_discrete_dimension_type1 = EvaluationDDim1;
67 using evaluation_discrete_dimension_type2 = EvaluationDDim2;
70 using bsplines_type1 = BSplines1;
73 using bsplines_type2 = BSplines2;
76 using evaluation_domain_type1 =
ddc::
DiscreteDomain<evaluation_discrete_dimension_type1>;
79 using evaluation_domain_type2 =
ddc::
DiscreteDomain<evaluation_discrete_dimension_type2>;
83 evaluation_discrete_dimension_type1,
84 evaluation_discrete_dimension_type2>;
87
88
89
90
91 template <concepts::discrete_domain BatchedInterpolationDDom>
92 using batched_evaluation_domain_type = BatchedInterpolationDDom;
104
105
106
107
108
109 template <concepts::discrete_domain BatchedInterpolationDDom>
110 using batch_domain_type =
typename ddc::remove_dims_of_t<
111 BatchedInterpolationDDom,
112 evaluation_discrete_dimension_type1,
113 evaluation_discrete_dimension_type2>;
116
117
118
119
120
121 template <concepts::discrete_domain BatchedInterpolationDDom>
122 using batched_spline_domain_type =
123 typename ddc::detail::convert_type_seq_to_discrete_domain_t<
ddc::type_seq_replace_t<
124 ddc::to_type_seq_t<BatchedInterpolationDDom>,
125 ddc::detail::TypeSeq<
126 evaluation_discrete_dimension_type1,
127 evaluation_discrete_dimension_type2>,
128 ddc::detail::TypeSeq<bsplines_type1, bsplines_type2>>>;
131 using lower_extrapolation_rule_1_type = LowerExtrapolationRule1;
134 using upper_extrapolation_rule_1_type = UpperExtrapolationRule1;
137 using lower_extrapolation_rule_2_type = LowerExtrapolationRule2;
140 using upper_extrapolation_rule_2_type = UpperExtrapolationRule2;
143 LowerExtrapolationRule1 m_lower_extrap_rule_1;
145 UpperExtrapolationRule1 m_upper_extrap_rule_1;
147 LowerExtrapolationRule2 m_lower_extrap_rule_2;
149 UpperExtrapolationRule2 m_upper_extrap_rule_2;
153 std::is_same_v<LowerExtrapolationRule1,
155 == bsplines_type1::is_periodic()
157 UpperExtrapolationRule1,
159 == bsplines_type1::is_periodic()
161 LowerExtrapolationRule2,
163 == bsplines_type2::is_periodic()
165 UpperExtrapolationRule2,
167 == bsplines_type2::is_periodic(),
168 "PeriodicExtrapolationRule has to be used if and only if dimension is periodic");
170 std::is_invocable_r_v<
172 LowerExtrapolationRule1,
173 ddc::Coordinate<continuous_dimension_type1>,
177 Kokkos::layout_right,
179 "LowerExtrapolationRule1::operator() has to be callable "
180 "with usual arguments.");
182 std::is_invocable_r_v<
184 UpperExtrapolationRule1,
185 ddc::Coordinate<continuous_dimension_type1>,
189 Kokkos::layout_right,
191 "UpperExtrapolationRule1::operator() has to be callable "
192 "with usual arguments.");
194 std::is_invocable_r_v<
196 LowerExtrapolationRule2,
197 ddc::Coordinate<continuous_dimension_type2>,
201 Kokkos::layout_right,
203 "LowerExtrapolationRule2::operator() has to be callable "
204 "with usual arguments.");
206 std::is_invocable_r_v<
208 UpperExtrapolationRule2,
209 ddc::Coordinate<continuous_dimension_type2>,
213 Kokkos::layout_right,
215 "UpperExtrapolationRule2::operator() has to be callable "
216 "with usual arguments.");
219
220
221
222
223
224
225
226
227
229 LowerExtrapolationRule1
const& lower_extrap_rule1,
230 UpperExtrapolationRule1
const& upper_extrap_rule1,
231 LowerExtrapolationRule2
const& lower_extrap_rule2,
232 UpperExtrapolationRule2
const& upper_extrap_rule2)
233 : m_lower_extrap_rule_1(lower_extrap_rule1)
234 , m_upper_extrap_rule_1(upper_extrap_rule1)
235 , m_lower_extrap_rule_2(lower_extrap_rule2)
236 , m_upper_extrap_rule_2(upper_extrap_rule2)
241
242
243
244
248
249
250
251
258
259
260
261
262
266
267
268
269
270
274
275
276
277
278
279
280
281
284 return m_lower_extrap_rule_1;
288
289
290
291
292
293
294
295
298 return m_upper_extrap_rule_1;
302
303
304
305
306
307
308
309
312 return m_lower_extrap_rule_2;
316
317
318
319
320
321
322
323
326 return m_upper_extrap_rule_2;
330
331
332
333
334
335
336
337
338
339
340
341 template <
class Layout,
class... CoordsDims>
343 ddc::Coordinate<CoordsDims...>
const& coord_eval,
344 ddc::
ChunkSpan<
double const, spline_domain_type, Layout, memory_space>
const
347 return eval(coord_eval, spline_coef);
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
374 class BatchedInterpolationDDom,
377 ddc::
ChunkSpan<
double, BatchedInterpolationDDom, Layout1, memory_space>
const
380 ddc::Coordinate<CoordsDims...>
const,
381 BatchedInterpolationDDom,
383 memory_space>
const coords_eval,
386 batched_spline_domain_type<BatchedInterpolationDDom>,
388 memory_space>
const spline_coef)
const
390 batch_domain_type<BatchedInterpolationDDom>
const batch_domain(coords_eval.domain());
391 evaluation_domain_type1
const evaluation_domain1(spline_eval.domain());
392 evaluation_domain_type2
const evaluation_domain2(spline_eval.domain());
393 ddc::parallel_for_each(
394 "ddc_splines_evaluate_2d",
398 typename batch_domain_type<
399 BatchedInterpolationDDom>::discrete_element_type
const j) {
400 auto const spline_eval_2D = spline_eval[j];
401 auto const coords_eval_2D = coords_eval[j];
402 auto const spline_coef_2D = spline_coef[j];
403 for (
auto const i1 : evaluation_domain1) {
404 for (
auto const i2 : evaluation_domain2) {
405 spline_eval_2D(i1, i2) = eval(coords_eval_2D(i1, i2), spline_coef_2D);
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426 template <
class Layout1,
class Layout2,
class BatchedInterpolationDDom>
428 ddc::
ChunkSpan<
double, BatchedInterpolationDDom, Layout1, memory_space>
const
432 batched_spline_domain_type<BatchedInterpolationDDom>,
434 memory_space>
const spline_coef)
const
436 batch_domain_type<BatchedInterpolationDDom>
const batch_domain(spline_eval.domain());
437 evaluation_domain_type1
const evaluation_domain1(spline_eval.domain());
438 evaluation_domain_type2
const evaluation_domain2(spline_eval.domain());
439 ddc::parallel_for_each(
440 "ddc_splines_evaluate_2d",
444 typename batch_domain_type<
445 BatchedInterpolationDDom>::discrete_element_type
const j) {
446 auto const spline_eval_2D = spline_eval[j];
447 auto const spline_coef_2D = spline_coef[j];
448 for (
auto const i1 : evaluation_domain1) {
449 for (
auto const i2 : evaluation_domain2) {
450 ddc::Coordinate<continuous_dimension_type1, continuous_dimension_type2>
451 coord_eval_2D(
ddc::coordinate(i1),
ddc::coordinate(i2));
452 spline_eval_2D(i1, i2) = eval(coord_eval_2D(i1, i2), spline_coef_2D);
460
461
462
463
464
465
466
467
468
469
470 template <
class Layout,
class... CoordsDims>
472 "Use deriv(DiscreteElement<Deriv<Dim1>>(1), ...) instead)")]] KOKKOS_FUNCTION
double
474 ddc::Coordinate<CoordsDims...>
const& coord_eval,
475 ddc::
ChunkSpan<
double const, spline_domain_type, Layout, memory_space>
const
479 ddc::DiscreteElement<
Deriv<continuous_dimension_type1>>(1),
485
486
487
488
489
490
491
492
493
494
495 template <
class Layout,
class... CoordsDims>
497 "Use deriv(DiscreteElement<Deriv<Dim2>>(1), ...) instead)")]] KOKKOS_FUNCTION
double
499 ddc::Coordinate<CoordsDims...>
const& coord_eval,
500 ddc::
ChunkSpan<
double const, spline_domain_type, Layout, memory_space>
const
504 ddc::DiscreteElement<
Deriv<continuous_dimension_type2>>(1),
510
511
512
513
514
515
516
517
518
519
520 template <
class Layout,
class... CoordsDims>
522 "Use deriv(DiscreteElement<Deriv<Dim1>, Deriv<Dim2>>(1, 1), ...) "
523 "instead)")]] KOKKOS_FUNCTION
double
525 ddc::Coordinate<CoordsDims...>
const& coord_eval,
526 ddc::
ChunkSpan<
double const, spline_domain_type, Layout, memory_space>
const
530 ddc::DiscreteElement<
531 Deriv<continuous_dimension_type1>,
532 Deriv<continuous_dimension_type2>>(1, 1),
538
539
540
541
542
543
544
545
546
547
548
549
550 template <
class InterestDim,
class Layout,
class... CoordsDims>
552 "Use deriv(DiscreteElement<Deriv<InterestDim>>(1), ...) "
553 "instead)")]] KOKKOS_FUNCTION
double
554 deriv(
ddc::Coordinate<CoordsDims...>
const& coord_eval,
555 ddc::
ChunkSpan<
double const, spline_domain_type, Layout, memory_space>
const spline_coef)
558 DDC_DISABLE_DEPRECATED_WARNINGS_PUSH()
560 std::is_same_v<InterestDim, continuous_dimension_type1>
561 || std::is_same_v<InterestDim, continuous_dimension_type2>);
562 if constexpr (std::is_same_v<
564 typename evaluation_discrete_dimension_type1::
565 continuous_dimension_type>) {
566 return deriv_dim_1(coord_eval, spline_coef);
567 }
else if constexpr (std::is_same_v<
569 typename evaluation_discrete_dimension_type2::
570 continuous_dimension_type>) {
571 return deriv_dim_2(coord_eval, spline_coef);
573 DDC_DISABLE_DEPRECATED_WARNINGS_POP()
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592 template <
class InterestDim1,
class InterestDim2,
class Layout,
class... CoordsDims>
594 "Use deriv(DiscreteElement<Deriv<InterestDim1, InterestDim2>>(1, 1), ...) "
595 "instead)")]] KOKKOS_FUNCTION
double
596 deriv2(
ddc::Coordinate<CoordsDims...>
const& coord_eval,
597 ddc::
ChunkSpan<
double const, spline_domain_type, Layout, memory_space>
const spline_coef)
600 DDC_DISABLE_DEPRECATED_WARNINGS_PUSH()
604 typename evaluation_discrete_dimension_type1::continuous_dimension_type>
605 && std::is_same_v<InterestDim2, continuous_dimension_type2>)
608 typename evaluation_discrete_dimension_type1::continuous_dimension_type>
609 && std::is_same_v<InterestDim1, continuous_dimension_type2>));
610 return deriv_1_and_2(coord_eval, spline_coef);
611 DDC_DISABLE_DEPRECATED_WARNINGS_POP()
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
638 class BatchedInterpolationDDom,
640 [[deprecated(
"Use deriv(DiscreteElement<Deriv<Dim1>>(1), ...) instead)")]]
void deriv_dim_1(
641 ddc::
ChunkSpan<
double, BatchedInterpolationDDom, Layout1, memory_space>
const
644 ddc::Coordinate<CoordsDims...>
const,
645 BatchedInterpolationDDom,
647 memory_space>
const coords_eval,
650 batched_spline_domain_type<BatchedInterpolationDDom>,
652 memory_space>
const spline_coef)
const
655 ddc::DiscreteElement<
Deriv<continuous_dimension_type1>>(1),
662
663
664
665
666
667
668
669
670
671
672
673
674 template <
class Layout1,
class Layout2,
class BatchedInterpolationDDom>
675 [[deprecated(
"Use deriv(DiscreteElement<Deriv<Dim1>>(1), ...) instead)")]]
void deriv_dim_1(
676 ddc::
ChunkSpan<
double, BatchedInterpolationDDom, Layout1, memory_space>
const
680 batched_spline_domain_type<BatchedInterpolationDDom>,
682 memory_space>
const spline_coef)
const
685 ddc::DiscreteElement<
Deriv<continuous_dimension_type1>>(1),
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
712 class BatchedInterpolationDDom,
714 [[deprecated(
"Use deriv(DiscreteElement<Deriv<Dim2>>(1), ...) instead)")]]
void deriv_dim_2(
715 ddc::
ChunkSpan<
double, BatchedInterpolationDDom, Layout1, memory_space>
const
718 ddc::Coordinate<CoordsDims...>
const,
719 BatchedInterpolationDDom,
721 memory_space>
const coords_eval,
724 batched_spline_domain_type<BatchedInterpolationDDom>,
726 memory_space>
const spline_coef)
const
729 ddc::DiscreteElement<
Deriv<continuous_dimension_type2>>(1),
736
737
738
739
740
741
742
743
744
745
746
747
748 template <
class Layout1,
class Layout2,
class BatchedInterpolationDDom>
749 [[deprecated(
"Use deriv(DiscreteElement<Deriv<Dim2>>(1), ...) instead)")]]
void deriv_dim_2(
750 ddc::
ChunkSpan<
double, BatchedInterpolationDDom, Layout1, memory_space>
const
754 batched_spline_domain_type<BatchedInterpolationDDom>,
756 memory_space>
const spline_coef)
const
759 ddc::DiscreteElement<
Deriv<continuous_dimension_type2>>(1),
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
786 class BatchedInterpolationDDom,
788 [[deprecated(
"Use deriv(DiscreteElement<Deriv<Dim1>, Deriv<Dim2>>(1, 1), ...) instead)")]]
void
790 ddc::
ChunkSpan<
double, BatchedInterpolationDDom, Layout1, memory_space>
const
793 ddc::Coordinate<CoordsDims...>
const,
794 BatchedInterpolationDDom,
796 memory_space>
const coords_eval,
799 batched_spline_domain_type<BatchedInterpolationDDom>,
801 memory_space>
const spline_coef)
const
804 ddc::DiscreteElement<
805 Deriv<continuous_dimension_type1>,
806 Deriv<continuous_dimension_type2>>(1, 1),
813
814
815
816
817
818
819
820
821
822
823
824
825 template <
class Layout1,
class Layout2,
class BatchedInterpolationDDom>
826 [[deprecated(
"Use deriv(DiscreteElement<Deriv<Dim1>, Deriv<Dim2>>(1, 1), ...) instead)")]]
void
828 ddc::
ChunkSpan<
double, BatchedInterpolationDDom, Layout1, memory_space>
const
832 batched_spline_domain_type<BatchedInterpolationDDom>,
834 memory_space>
const spline_coef)
const
837 ddc::DiscreteElement<
838 Deriv<continuous_dimension_type1>,
839 Deriv<continuous_dimension_type2>>(1, 1),
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
868 class BatchedInterpolationDDom,
870 [[deprecated(
"Use deriv(DiscreteElement<Deriv<InterestDim>>(1), ...) instead)")]]
void deriv(
871 ddc::
ChunkSpan<
double, BatchedInterpolationDDom, Layout1, memory_space>
const
874 ddc::Coordinate<CoordsDims...>
const,
875 BatchedInterpolationDDom,
877 memory_space>
const coords_eval,
880 batched_spline_domain_type<BatchedInterpolationDDom>,
882 memory_space>
const spline_coef)
const
884 DDC_DISABLE_DEPRECATED_WARNINGS_PUSH()
888 typename evaluation_discrete_dimension_type1::continuous_dimension_type>
889 || std::is_same_v<InterestDim, continuous_dimension_type2>);
890 if constexpr (std::is_same_v<
892 typename evaluation_discrete_dimension_type1::
893 continuous_dimension_type>) {
894 return deriv_dim_1(spline_eval, coords_eval, spline_coef);
895 }
else if constexpr (std::is_same_v<
897 typename evaluation_discrete_dimension_type2::
898 continuous_dimension_type>) {
899 return deriv_dim_2(spline_eval, coords_eval, spline_coef);
901 DDC_DISABLE_DEPRECATED_WARNINGS_POP()
905
906
907
908
909
910
911
912
913
914
915
916
917
918 template <
class InterestDim,
class Layout1,
class Layout2,
class BatchedInterpolationDDom>
919 [[deprecated(
"Use deriv(DiscreteElement<Deriv<InterestDim>>(1), ...) instead)")]]
void deriv(
920 ddc::
ChunkSpan<
double, BatchedInterpolationDDom, Layout1, memory_space>
const
924 batched_spline_domain_type<BatchedInterpolationDDom>,
926 memory_space>
const spline_coef)
const
928 DDC_DISABLE_DEPRECATED_WARNINGS_PUSH()
932 typename evaluation_discrete_dimension_type1::continuous_dimension_type>
933 || std::is_same_v<InterestDim, continuous_dimension_type2>);
934 if constexpr (std::is_same_v<
936 typename evaluation_discrete_dimension_type1::
937 continuous_dimension_type>) {
938 return deriv_dim_1(spline_eval, spline_coef);
939 }
else if constexpr (std::is_same_v<
941 typename evaluation_discrete_dimension_type2::
942 continuous_dimension_type>) {
943 return deriv_dim_2(spline_eval, spline_coef);
945 DDC_DISABLE_DEPRECATED_WARNINGS_POP()
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
977 class BatchedInterpolationDDom,
980 "Use deriv(DiscreteElement<Deriv<InterestDim1>, Deriv<InterestDim2>>(1, 1), ...) "
982 deriv2(
ddc::
ChunkSpan<
double, BatchedInterpolationDDom, Layout1, memory_space>
const
985 ddc::Coordinate<CoordsDims...>
const,
986 BatchedInterpolationDDom,
988 memory_space>
const coords_eval,
991 batched_spline_domain_type<BatchedInterpolationDDom>,
993 memory_space>
const spline_coef)
const
995 DDC_DISABLE_DEPRECATED_WARNINGS_PUSH()
999 typename evaluation_discrete_dimension_type1::continuous_dimension_type>
1000 && std::is_same_v<InterestDim2, continuous_dimension_type2>)
1003 typename evaluation_discrete_dimension_type1::continuous_dimension_type>
1004 && std::is_same_v<InterestDim1, continuous_dimension_type2>));
1005 return deriv_1_and_2(spline_eval, coords_eval, spline_coef);
1006 DDC_DISABLE_DEPRECATED_WARNINGS_POP()
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1032 class BatchedInterpolationDDom>
1034 "Use deriv(DiscreteElement<Deriv<InterestDim1>, Deriv<InterestDim2>>(1, 1), ...) "
1036 deriv2(
ddc::
ChunkSpan<
double, BatchedInterpolationDDom, Layout1, memory_space>
const
1040 batched_spline_domain_type<BatchedInterpolationDDom>,
1042 memory_space>
const spline_coef)
const
1044 DDC_DISABLE_DEPRECATED_WARNINGS_PUSH()
1048 typename evaluation_discrete_dimension_type1::continuous_dimension_type>
1049 && std::is_same_v<InterestDim2, continuous_dimension_type2>)
1052 typename evaluation_discrete_dimension_type1::continuous_dimension_type>
1053 && std::is_same_v<InterestDim1, continuous_dimension_type2>));
1054 return deriv_1_and_2(spline_eval, spline_coef);
1055 DDC_DISABLE_DEPRECATED_WARNINGS_POP()
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072 template <
class DElem,
class Layout,
class... CoordsDims>
1073 KOKKOS_FUNCTION
double deriv(
1074 DElem
const& deriv_order,
1075 ddc::Coordinate<CoordsDims...>
const& coord_eval,
1076 ddc::
ChunkSpan<
double const, spline_domain_type, Layout, memory_space>
const
1079 return eval_no_bc(deriv_order, coord_eval, spline_coef);
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1109 class BatchedInterpolationDDom,
1110 class... CoordsDims>
1112 DElem
const& deriv_order,
1113 ddc::
ChunkSpan<
double, BatchedInterpolationDDom, Layout1, memory_space>
const
1116 ddc::Coordinate<CoordsDims...>
const,
1117 BatchedInterpolationDDom,
1119 memory_space>
const coords_eval,
1122 batched_spline_domain_type<BatchedInterpolationDDom>,
1124 memory_space>
const spline_coef)
const
1126 static_assert(is_discrete_element_v<DElem>);
1128 batch_domain_type<BatchedInterpolationDDom>
const batch_domain(coords_eval.domain());
1129 evaluation_domain_type1
const evaluation_domain1(spline_eval.domain());
1130 evaluation_domain_type2
const evaluation_domain2(spline_eval.domain());
1131 ddc::parallel_for_each(
1132 "ddc_splines_differentiate_2d",
1135 KOKKOS_CLASS_LAMBDA(
1136 typename batch_domain_type<
1137 BatchedInterpolationDDom>::discrete_element_type
const j) {
1138 auto const spline_eval_2D = spline_eval[j];
1139 auto const coords_eval_2D = coords_eval[j];
1140 auto const spline_coef_2D = spline_coef[j];
1141 for (
auto const i1 : evaluation_domain1) {
1142 for (
auto const i2 : evaluation_domain2) {
1143 spline_eval_2D(i1, i2) = eval_no_bc(
1145 coords_eval_2D(i1, i2),
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167 template <
class DElem,
class Layout1,
class Layout2,
class BatchedInterpolationDDom>
1169 DElem
const& deriv_order,
1170 ddc::
ChunkSpan<
double, BatchedInterpolationDDom, Layout1, memory_space>
const
1174 batched_spline_domain_type<BatchedInterpolationDDom>,
1176 memory_space>
const spline_coef)
const
1178 static_assert(is_discrete_element_v<DElem>);
1180 batch_domain_type<BatchedInterpolationDDom>
const batch_domain(spline_eval.domain());
1181 evaluation_domain_type1
const evaluation_domain1(spline_eval.domain());
1182 evaluation_domain_type2
const evaluation_domain2(spline_eval.domain());
1183 ddc::parallel_for_each(
1184 "ddc_splines_differentiate_2d",
1187 KOKKOS_CLASS_LAMBDA(
1188 typename batch_domain_type<
1189 BatchedInterpolationDDom>::discrete_element_type
const j) {
1190 auto const spline_eval_2D = spline_eval[j];
1191 auto const spline_coef_2D = spline_coef[j];
1192 for (
auto const i1 : evaluation_domain1) {
1193 for (
auto const i2 : evaluation_domain2) {
1194 ddc::Coordinate<continuous_dimension_type1, continuous_dimension_type2>
1195 coord_eval_2D(
ddc::coordinate(i1),
ddc::coordinate(i2));
1196 spline_eval_2D(i1, i2)
1197 = eval_no_bc(deriv_order, coord_eval_2D, spline_coef_2D);
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216 template <
class Layout1,
class Layout2,
class BatchedDDom,
class BatchedSplineDDom>
1218 ddc::
ChunkSpan<
double, BatchedDDom, Layout1, memory_space>
const integrals,
1219 ddc::
ChunkSpan<
double const, BatchedSplineDDom, Layout2, memory_space>
const
1223 ddc::type_seq_contains_v<
1224 ddc::detail::TypeSeq<bsplines_type1, bsplines_type2>,
1225 to_type_seq_t<BatchedSplineDDom>>,
1226 "The spline coefficients domain must contain the bsplines dimensions");
1227 using batch_domain_type
1228 =
ddc::remove_dims_of_t<BatchedSplineDDom, bsplines_type1, bsplines_type2>;
1230 std::is_same_v<batch_domain_type, BatchedDDom>,
1231 "The integrals domain must only contain the batch dimensions");
1233 batch_domain_type batch_domain(integrals.domain());
1238 ddc::integrals(exec_space(), values1);
1243 ddc::integrals(exec_space(), values2);
1245 ddc::parallel_for_each(
1246 "ddc_splines_integrate_bsplines",
1249 KOKKOS_LAMBDA(
typename batch_domain_type::discrete_element_type
const j) {
1251 for (
typename spline_domain_type1::discrete_element_type
const i1 :
1253 for (
typename spline_domain_type2::discrete_element_type
const i2 :
1255 integrals(j) += spline_coef(i1, i2, j) * values1(i1) * values2(i2);
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277 template <
class Layout,
class... CoordsDims>
1278 KOKKOS_INLINE_FUNCTION
double eval(
1279 ddc::Coordinate<CoordsDims...> coord_eval,
1280 ddc::
ChunkSpan<
double const, spline_domain_type, Layout, memory_space>
const
1283 using Dim1 = continuous_dimension_type1;
1284 using Dim2 = continuous_dimension_type2;
1285 if constexpr (bsplines_type1::is_periodic()) {
1286 if (
ddc::get<Dim1>(coord_eval) <
ddc::discrete_space<bsplines_type1>().rmin()
1287 ||
ddc::get<Dim1>(coord_eval) >
ddc::discrete_space<bsplines_type1>().rmax()) {
1288 ddc::get<Dim1>(coord_eval)
1290 (
ddc::get<Dim1>(coord_eval)
1291 -
ddc::discrete_space<bsplines_type1>().rmin())
1292 /
ddc::discrete_space<bsplines_type1>().length())
1293 *
ddc::discrete_space<bsplines_type1>().length();
1296 if constexpr (bsplines_type2::is_periodic()) {
1297 if (
ddc::get<Dim2>(coord_eval) <
ddc::discrete_space<bsplines_type2>().rmin()
1298 ||
ddc::get<Dim2>(coord_eval) >
ddc::discrete_space<bsplines_type2>().rmax()) {
1299 ddc::get<Dim2>(coord_eval)
1301 (
ddc::get<Dim2>(coord_eval)
1302 -
ddc::discrete_space<bsplines_type2>().rmin())
1303 /
ddc::discrete_space<bsplines_type2>().length())
1304 *
ddc::discrete_space<bsplines_type2>().length();
1307 if constexpr (!bsplines_type1::is_periodic()) {
1308 if (
ddc::get<Dim1>(coord_eval) <
ddc::discrete_space<bsplines_type1>().rmin()) {
1309 return m_lower_extrap_rule_1(coord_eval, spline_coef);
1311 if (
ddc::get<Dim1>(coord_eval) >
ddc::discrete_space<bsplines_type1>().rmax()) {
1312 return m_upper_extrap_rule_1(coord_eval, spline_coef);
1315 if constexpr (!bsplines_type2::is_periodic()) {
1316 if (
ddc::get<Dim2>(coord_eval) <
ddc::discrete_space<bsplines_type2>().rmin()) {
1317 return m_lower_extrap_rule_2(coord_eval, spline_coef);
1319 if (
ddc::get<Dim2>(coord_eval) >
ddc::discrete_space<bsplines_type2>().rmax()) {
1320 return m_upper_extrap_rule_2(coord_eval, spline_coef);
1325 ddc::Coordinate<continuous_dimension_type1, continuous_dimension_type2>(
1326 ddc::get<Dim1>(coord_eval),
1327 ddc::get<Dim2>(coord_eval)),
1332
1333
1334
1335
1336
1337
1338
1339 template <
class... DerivDims,
class Layout,
class... CoordsDims>
1340 KOKKOS_INLINE_FUNCTION
double eval_no_bc(
1341 ddc::DiscreteElement<DerivDims...>
const& deriv_order,
1342 ddc::Coordinate<CoordsDims...>
const& coord_eval,
1343 ddc::
ChunkSpan<
double const, spline_domain_type, Layout, memory_space>
const
1346 using deriv_dim1 =
ddc::
Deriv<continuous_dimension_type1>;
1347 using deriv_dim2 =
ddc::
Deriv<continuous_dimension_type2>;
1348 using deriv_dims =
ddc::detail::TypeSeq<DerivDims...>;
1352 (in_tags_v<DerivDims,
ddc::detail::TypeSeq<deriv_dim1, deriv_dim2>> && ...),
1353 "The only valid dimensions for deriv_order are Deriv<Dim1> and Deriv<Dim2>");
1355 ddc::DiscreteElement<bsplines_type1> jmin1;
1356 ddc::DiscreteElement<bsplines_type2> jmin2;
1358 std::array<
double, bsplines_type1::degree() + 1> vals1_ptr;
1359 Kokkos::mdspan<
double, Kokkos::extents<std::size_t, bsplines_type1::degree() + 1>>
const
1360 vals1(vals1_ptr.data());
1361 std::array<
double, bsplines_type2::degree() + 1> vals2_ptr;
1362 Kokkos::mdspan<
double, Kokkos::extents<std::size_t, bsplines_type2::degree() + 1>>
const
1363 vals2(vals2_ptr.data());
1364 ddc::Coordinate<continuous_dimension_type1>
const coord_eval_interest1(coord_eval);
1365 ddc::Coordinate<continuous_dimension_type2>
const coord_eval_interest2(coord_eval);
1367 if constexpr (!in_tags_v<deriv_dim1, deriv_dims>) {
1368 jmin1 =
ddc::discrete_space<bsplines_type1>().eval_basis(vals1, coord_eval_interest1);
1370 auto const order1 = deriv_order.
template uid<deriv_dim1>();
1371 KOKKOS_ASSERT(order1 > 0 && order1 <= bsplines_type1::degree())
1373 std::array<
double, (bsplines_type1::degree() + 1) * (bsplines_type1::degree() + 1)>
1379 bsplines_type1::degree() + 1,
1380 Kokkos::dynamic_extent>>
const derivs1(derivs1_ptr.data(), order1 + 1);
1382 jmin1 =
ddc::discrete_space<bsplines_type1>()
1383 .eval_basis_and_n_derivs(derivs1, coord_eval_interest1, order1);
1385 for (std::size_t i = 0; i < bsplines_type1::degree() + 1; ++i) {
1386 vals1[i] = DDC_MDSPAN_ACCESS_OP(derivs1, i, order1);
1390 if constexpr (!in_tags_v<deriv_dim2, deriv_dims>) {
1391 jmin2 =
ddc::discrete_space<bsplines_type2>().eval_basis(vals2, coord_eval_interest2);
1393 auto const order2 = deriv_order.
template uid<deriv_dim2>();
1394 KOKKOS_ASSERT(order2 > 0 && order2 <= bsplines_type2::degree())
1396 std::array<
double, (bsplines_type2::degree() + 1) * (bsplines_type2::degree() + 1)>
1402 bsplines_type2::degree() + 1,
1403 Kokkos::dynamic_extent>>
const derivs2(derivs2_ptr.data(), order2 + 1);
1405 jmin2 =
ddc::discrete_space<bsplines_type2>()
1406 .eval_basis_and_n_derivs(derivs2, coord_eval_interest2, order2);
1408 for (std::size_t i = 0; i < bsplines_type2::degree() + 1; ++i) {
1409 vals2[i] = DDC_MDSPAN_ACCESS_OP(derivs2, i, order2);
1414 for (std::size_t i = 0; i < bsplines_type1::degree() + 1; ++i) {
1415 for (std::size_t j = 0; j < bsplines_type2::degree() + 1; ++j) {
1417 ddc::DiscreteElement<
1419 bsplines_type2>(jmin1 + i, jmin2 + j))
1420 * vals1[i] * vals2[j];
friend class DiscreteDomain
KOKKOS_DEFAULTED_FUNCTION constexpr DiscreteElement()=default
KOKKOS_FUNCTION constexpr bool operator!=(DiscreteVector< OTags... > const &rhs) const noexcept
A class which provides helper functions to initialise the Greville points from a B-Spline definition.
static ddc::DiscreteDomain< Sampling > get_domain()
Get the domain which gives us access to all of the Greville points.
Helper class for the initialisation of the mesh of interpolation points.
static auto get_sampling()
Get the sampling of interpolation points.
static ddc::DiscreteDomain< Sampling > get_domain()
Get the domain which can be used to access the interpolation points in the sampling.
A class for creating a 2D spline approximation of a function.
void operator()(ddc::ChunkSpan< double, batched_spline_domain_type< BatchedInterpolationDDom >, Layout, memory_space > spline, ddc::ChunkSpan< double const, BatchedInterpolationDDom, Layout, memory_space > vals, std::optional< ddc::ChunkSpan< double const, batched_derivs_domain_type1< BatchedInterpolationDDom >, Layout, memory_space > > derivs_min1=std::nullopt, std::optional< ddc::ChunkSpan< double const, batched_derivs_domain_type1< BatchedInterpolationDDom >, Layout, memory_space > > derivs_max1=std::nullopt, std::optional< ddc::ChunkSpan< double const, batched_derivs_domain_type2< BatchedInterpolationDDom >, Layout, memory_space > > derivs_min2=std::nullopt, std::optional< ddc::ChunkSpan< double const, batched_derivs_domain_type2< BatchedInterpolationDDom >, Layout, memory_space > > derivs_max2=std::nullopt, std::optional< ddc::ChunkSpan< double const, batched_derivs_domain_type< BatchedInterpolationDDom >, Layout, memory_space > > mixed_derivs_min1_min2=std::nullopt, std::optional< ddc::ChunkSpan< double const, batched_derivs_domain_type< BatchedInterpolationDDom >, Layout, memory_space > > mixed_derivs_max1_min2=std::nullopt, std::optional< ddc::ChunkSpan< double const, batched_derivs_domain_type< BatchedInterpolationDDom >, Layout, memory_space > > mixed_derivs_min1_max2=std::nullopt, std::optional< ddc::ChunkSpan< double const, batched_derivs_domain_type< BatchedInterpolationDDom >, Layout, memory_space > > mixed_derivs_max1_max2=std::nullopt) const
Compute a 2D spline approximation of a function.
BatchedInterpolationDDom batched_interpolation_domain(BatchedInterpolationDDom const &batched_interpolation_domain) const noexcept
Get the whole domain representing interpolation points.
ddc::DiscreteDomain< bsplines_type1, bsplines_type2 > spline_domain() const noexcept
Get the 2D domain on which spline coefficients are defined.
SplineBuilder2D(SplineBuilder2D &&x)=default
Move-constructs.
SplineBuilder2D & operator=(SplineBuilder2D &&x)=default
Move-assigns.
batched_spline_domain_type< BatchedInterpolationDDom > batched_spline_domain(BatchedInterpolationDDom const &batched_interpolation_domain) const noexcept
Get the whole domain on which spline coefficients are defined.
SplineBuilder2D(BatchedInterpolationDDom const &batched_interpolation_domain, std::optional< std::size_t > cols_per_chunk=std::nullopt, std::optional< unsigned int > preconditioner_max_block_size=std::nullopt)
Build a SplineBuilder2D acting on the interpolation domain contained in batched_interpolation_domain.
SplineBuilder2D(interpolation_domain_type const &interpolation_domain, std::optional< std::size_t > cols_per_chunk=std::nullopt, std::optional< unsigned int > preconditioner_max_block_size=std::nullopt)
Build a SplineBuilder2D acting on interpolation_domain.
~SplineBuilder2D()=default
Destructs.
SplineBuilder2D(SplineBuilder2D const &x)=delete
Copy-constructor is deleted.
interpolation_domain_type interpolation_domain() const noexcept
Get the domain for the 2D interpolation mesh used by this class.
batch_domain_type< BatchedInterpolationDDom > batch_domain(BatchedInterpolationDDom const &batched_interpolation_domain) const noexcept
Get the batch domain.
SplineBuilder2D & operator=(SplineBuilder2D const &x)=delete
Copy-assignment is deleted.
A class for creating a 3D spline approximation of a function.
SplineBuilder3D(SplineBuilder3D const &x)=delete
Copy-constructor is deleted.
void operator()(ddc::ChunkSpan< double, batched_spline_domain_type< BatchedInterpolationDDom >, Layout, memory_space > spline, ddc::ChunkSpan< double const, BatchedInterpolationDDom, Layout, memory_space > vals, std::optional< ddc::ChunkSpan< double const, batched_derivs_domain_type1< BatchedInterpolationDDom >, Layout, memory_space > > derivs_min1=std::nullopt, std::optional< ddc::ChunkSpan< double const, batched_derivs_domain_type1< BatchedInterpolationDDom >, Layout, memory_space > > derivs_max1=std::nullopt, std::optional< ddc::ChunkSpan< double const, batched_derivs_domain_type2< BatchedInterpolationDDom >, Layout, memory_space > > derivs_min2=std::nullopt, std::optional< ddc::ChunkSpan< double const, batched_derivs_domain_type2< BatchedInterpolationDDom >, Layout, memory_space > > derivs_max2=std::nullopt, std::optional< ddc::ChunkSpan< double const, batched_derivs_domain_type3< BatchedInterpolationDDom >, Layout, memory_space > > derivs_min3=std::nullopt, std::optional< ddc::ChunkSpan< double const, batched_derivs_domain_type3< BatchedInterpolationDDom >, Layout, memory_space > > derivs_max3=std::nullopt, std::optional< ddc::ChunkSpan< double const, batched_derivs_domain_type1_2< BatchedInterpolationDDom >, Layout, memory_space > > mixed_derivs_min1_min2=std::nullopt, std::optional< ddc::ChunkSpan< double const, batched_derivs_domain_type1_2< BatchedInterpolationDDom >, Layout, memory_space > > mixed_derivs_max1_min2=std::nullopt, std::optional< ddc::ChunkSpan< double const, batched_derivs_domain_type1_2< BatchedInterpolationDDom >, Layout, memory_space > > mixed_derivs_min1_max2=std::nullopt, std::optional< ddc::ChunkSpan< double const, batched_derivs_domain_type1_2< BatchedInterpolationDDom >, Layout, memory_space > > mixed_derivs_max1_max2=std::nullopt, std::optional< ddc::ChunkSpan< double const, batched_derivs_domain_type2_3< BatchedInterpolationDDom >, Layout, memory_space > > mixed_derivs_min2_min3=std::nullopt, std::optional< ddc::ChunkSpan< double const, batched_derivs_domain_type2_3< BatchedInterpolationDDom >, Layout, memory_space > > mixed_derivs_max2_min3=std::nullopt, std::optional< ddc::ChunkSpan< double const, batched_derivs_domain_type2_3< BatchedInterpolationDDom >, Layout, memory_space > > mixed_derivs_min2_max3=std::nullopt, std::optional< ddc::ChunkSpan< double const, batched_derivs_domain_type2_3< BatchedInterpolationDDom >, Layout, memory_space > > mixed_derivs_max2_max3=std::nullopt, std::optional< ddc::ChunkSpan< double const, batched_derivs_domain_type1_3< BatchedInterpolationDDom >, Layout, memory_space > > mixed_derivs_min1_min3=std::nullopt, std::optional< ddc::ChunkSpan< double const, batched_derivs_domain_type1_3< BatchedInterpolationDDom >, Layout, memory_space > > mixed_derivs_max1_min3=std::nullopt, std::optional< ddc::ChunkSpan< double const, batched_derivs_domain_type1_3< BatchedInterpolationDDom >, Layout, memory_space > > mixed_derivs_min1_max3=std::nullopt, std::optional< ddc::ChunkSpan< double const, batched_derivs_domain_type1_3< BatchedInterpolationDDom >, Layout, memory_space > > mixed_derivs_max1_max3=std::nullopt, std::optional< ddc::ChunkSpan< double const, batched_derivs_domain_type< BatchedInterpolationDDom >, Layout, memory_space > > mixed_derivs_min1_min2_min3=std::nullopt, std::optional< ddc::ChunkSpan< double const, batched_derivs_domain_type< BatchedInterpolationDDom >, Layout, memory_space > > mixed_derivs_max1_min2_min3=std::nullopt, std::optional< ddc::ChunkSpan< double const, batched_derivs_domain_type< BatchedInterpolationDDom >, Layout, memory_space > > mixed_derivs_min1_max2_min3=std::nullopt, std::optional< ddc::ChunkSpan< double const, batched_derivs_domain_type< BatchedInterpolationDDom >, Layout, memory_space > > mixed_derivs_max1_max2_min3=std::nullopt, std::optional< ddc::ChunkSpan< double const, batched_derivs_domain_type< BatchedInterpolationDDom >, Layout, memory_space > > mixed_derivs_min1_min2_max3=std::nullopt, std::optional< ddc::ChunkSpan< double const, batched_derivs_domain_type< BatchedInterpolationDDom >, Layout, memory_space > > mixed_derivs_max1_min2_max3=std::nullopt, std::optional< ddc::ChunkSpan< double const, batched_derivs_domain_type< BatchedInterpolationDDom >, Layout, memory_space > > mixed_derivs_min1_max2_max3=std::nullopt, std::optional< ddc::ChunkSpan< double const, batched_derivs_domain_type< BatchedInterpolationDDom >, Layout, memory_space > > mixed_derivs_max1_max2_max3=std::nullopt) const
Compute a 3D spline approximation of a function.
BatchedInterpolationDDom batched_interpolation_domain(BatchedInterpolationDDom const &batched_interpolation_domain) const noexcept
Get the whole domain representing interpolation points.
~SplineBuilder3D()=default
Destructs.
SplineBuilder3D(BatchedInterpolationDDom const &batched_interpolation_domain, std::optional< std::size_t > cols_per_chunk=std::nullopt, std::optional< unsigned int > preconditioner_max_block_size=std::nullopt)
Build a SplineBuilder3D acting on the interpolation domain contained in batched_interpolation_domain.
ddc::DiscreteDomain< bsplines_type1, bsplines_type2, bsplines_type3 > spline_domain() const noexcept
Get the 3D domain on which spline coefficients are defined.
interpolation_domain_type interpolation_domain() const noexcept
Get the domain for the 3D interpolation mesh used by this class.
SplineBuilder3D & operator=(SplineBuilder3D const &x)=delete
Copy-assignment is deleted.
SplineBuilder3D(interpolation_domain_type const &interpolation_domain, std::optional< std::size_t > cols_per_chunk=std::nullopt, std::optional< unsigned int > preconditioner_max_block_size=std::nullopt)
Build a SplineBuilder3D acting on interpolation_domain.
SplineBuilder3D(SplineBuilder3D &&x)=default
Move-constructs.
SplineBuilder3D & operator=(SplineBuilder3D &&x)=default
Move-assigns.
batch_domain_type< BatchedInterpolationDDom > batch_domain(BatchedInterpolationDDom const &batched_interpolation_domain) const noexcept
Get the batch domain.
batched_spline_domain_type< BatchedInterpolationDDom > batched_spline_domain(BatchedInterpolationDDom const &batched_interpolation_domain) const noexcept
Get the whole domain on which spline coefficients are defined.
A class for creating a spline approximation of a function.
batched_derivs_domain_type< BatchedInterpolationDDom > batched_derivs_xmax_domain(BatchedInterpolationDDom const &batched_interpolation_domain) const noexcept
Get the whole domain on which derivatives on upper boundary are defined.
static constexpr SplineSolver s_spline_solver
The SplineSolver giving the backend used to perform the spline approximation.
batch_domain_type< BatchedInterpolationDDom > batch_domain(BatchedInterpolationDDom const &batched_interpolation_domain) const noexcept
Get the batch domain.
std::tuple< ddc::Chunk< double, ddc::DiscreteDomain< ddc::Deriv< typename InterpolationDDim::continuous_dimension_type > >, ddc::KokkosAllocator< double, OutMemorySpace > >, ddc::Chunk< double, ddc::DiscreteDomain< InterpolationDDim >, ddc::KokkosAllocator< double, OutMemorySpace > >, ddc::Chunk< double, ddc::DiscreteDomain< ddc::Deriv< typename InterpolationDDim::continuous_dimension_type > >, ddc::KokkosAllocator< double, OutMemorySpace > > > quadrature_coefficients() const
Compute the quadrature coefficients associated to the b-splines used by this SplineBuilder.
SplineBuilder & operator=(SplineBuilder const &x)=delete
Copy-assignment is deleted.
SplineBuilder(SplineBuilder &&x)=default
Move-constructs.
static constexpr int s_nbe_xmax
The number of equations defining the boundary condition at the upper bound.
SplineBuilder(interpolation_domain_type const &interpolation_domain, std::optional< std::size_t > cols_per_chunk=std::nullopt, std::optional< unsigned int > preconditioner_max_block_size=std::nullopt)
Build a SplineBuilder acting on interpolation_domain.
static constexpr ddc::BoundCond s_bc_xmin
The boundary condition implemented at the lower bound.
BatchedInterpolationDDom batched_interpolation_domain(BatchedInterpolationDDom const &batched_interpolation_domain) const noexcept
Get the whole domain representing interpolation points.
SplineBuilder & operator=(SplineBuilder &&x)=default
Move-assigns.
SplineBuilder(SplineBuilder const &x)=delete
Copy-constructor is deleted.
SplineBuilder(BatchedInterpolationDDom const &batched_interpolation_domain, std::optional< std::size_t > cols_per_chunk=std::nullopt, std::optional< unsigned int > preconditioner_max_block_size=std::nullopt)
Build a SplineBuilder acting on the interpolation domain contained by batched_interpolation_domain.
static constexpr int s_nbv_xmax
The number of input values defining the boundary condition at the upper bound.
static constexpr bool s_odd
Indicates if the degree of the splines is odd or even.
static constexpr int s_nbv_xmin
The number of input values defining the boundary condition at the lower bound.
interpolation_domain_type interpolation_domain() const noexcept
Get the domain for the 1D interpolation mesh used by this class.
batched_derivs_domain_type< BatchedInterpolationDDom > batched_derivs_xmin_domain(BatchedInterpolationDDom const &batched_interpolation_domain) const noexcept
Get the whole domain on which derivatives on lower boundary are defined.
static constexpr ddc::BoundCond s_bc_xmax
The boundary condition implemented at the upper bound.
void operator()(ddc::ChunkSpan< double, batched_spline_domain_type< BatchedInterpolationDDom >, Layout, memory_space > spline, ddc::ChunkSpan< double const, BatchedInterpolationDDom, Layout, memory_space > vals, std::optional< ddc::ChunkSpan< double const, batched_derivs_domain_type< BatchedInterpolationDDom >, Layout, memory_space > > derivs_xmin=std::nullopt, std::optional< ddc::ChunkSpan< double const, batched_derivs_domain_type< BatchedInterpolationDDom >, Layout, memory_space > > derivs_xmax=std::nullopt) const
Compute a spline approximation of a function.
batched_spline_domain_type< BatchedInterpolationDDom > batched_spline_domain(BatchedInterpolationDDom const &batched_interpolation_domain) const noexcept
Get the whole domain on which spline coefficients are defined.
ddc::DiscreteDomain< bsplines_type > spline_domain() const noexcept
Get the 1D domain on which spline coefficients are defined.
~SplineBuilder()=default
Destructs.
static constexpr int s_nbe_xmin
The number of equations defining the boundary condition at the lower bound.
A class to evaluate, differentiate or integrate a 2D spline function.
void operator()(ddc::ChunkSpan< double, BatchedInterpolationDDom, Layout1, memory_space > const spline_eval, ddc::ChunkSpan< double const, batched_spline_domain_type< BatchedInterpolationDDom >, Layout2, memory_space > const spline_coef) const
Evaluate 2D spline function (described by its spline coefficients) on a mesh.
SplineEvaluator2D(SplineEvaluator2D &&x)=default
Move-constructs.
lower_extrapolation_rule_1_type lower_extrapolation_rule_dim_1() const
Get the lower extrapolation rule along the first dimension.
SplineEvaluator2D & operator=(SplineEvaluator2D const &x)=default
Copy-assigns.
void deriv(DElem const &deriv_order, ddc::ChunkSpan< double, BatchedInterpolationDDom, Layout1, memory_space > const spline_eval, ddc::ChunkSpan< ddc::Coordinate< CoordsDims... > const, BatchedInterpolationDDom, Layout2, memory_space > const coords_eval, ddc::ChunkSpan< double const, batched_spline_domain_type< BatchedInterpolationDDom >, Layout3, memory_space > const spline_coef) const
Differentiate 2D spline function (described by its spline coefficients) on a mesh along the dimension...
SplineEvaluator2D(SplineEvaluator2D const &x)=default
Copy-constructs.
~SplineEvaluator2D()=default
Destructs.
KOKKOS_FUNCTION double deriv(DElem const &deriv_order, ddc::Coordinate< CoordsDims... > const &coord_eval, ddc::ChunkSpan< double const, spline_domain_type, Layout, memory_space > const spline_coef) const
Differentiate 2D spline function (described by its spline coefficients) at a given coordinate along t...
void deriv(DElem const &deriv_order, ddc::ChunkSpan< double, BatchedInterpolationDDom, Layout1, memory_space > const spline_eval, ddc::ChunkSpan< double const, batched_spline_domain_type< BatchedInterpolationDDom >, Layout2, memory_space > const spline_coef) const
Differentiate 2D spline function (described by its spline coefficients) on a mesh along the dimension...
void integrate(ddc::ChunkSpan< double, BatchedDDom, Layout1, memory_space > const integrals, ddc::ChunkSpan< double const, BatchedSplineDDom, Layout2, memory_space > const spline_coef) const
Perform batched 2D integrations of a spline function (described by its spline coefficients) along the...
upper_extrapolation_rule_2_type upper_extrapolation_rule_dim_2() const
Get the upper extrapolation rule along the second dimension.
upper_extrapolation_rule_1_type upper_extrapolation_rule_dim_1() const
Get the upper extrapolation rule along the first dimension.
lower_extrapolation_rule_2_type lower_extrapolation_rule_dim_2() const
Get the lower extrapolation rule along the second dimension.
SplineEvaluator2D & operator=(SplineEvaluator2D &&x)=default
Move-assigns.
KOKKOS_FUNCTION double operator()(ddc::Coordinate< CoordsDims... > const &coord_eval, ddc::ChunkSpan< double const, spline_domain_type, Layout, memory_space > const spline_coef) const
Evaluate 2D spline function (described by its spline coefficients) at a given coordinate.
void operator()(ddc::ChunkSpan< double, BatchedInterpolationDDom, Layout1, memory_space > const spline_eval, ddc::ChunkSpan< ddc::Coordinate< CoordsDims... > const, BatchedInterpolationDDom, Layout2, memory_space > const coords_eval, ddc::ChunkSpan< double const, batched_spline_domain_type< BatchedInterpolationDDom >, Layout3, memory_space > const spline_coef) const
Evaluate 2D spline function (described by its spline coefficients) on a mesh.
SplineEvaluator2D(LowerExtrapolationRule1 const &lower_extrap_rule1, UpperExtrapolationRule1 const &upper_extrap_rule1, LowerExtrapolationRule2 const &lower_extrap_rule2, UpperExtrapolationRule2 const &upper_extrap_rule2)
Build a SplineEvaluator2D acting on batched_spline_domain.
A class to evaluate, differentiate or integrate a spline function.
void operator()(ddc::ChunkSpan< double, BatchedInterpolationDDom, Layout1, memory_space > const spline_eval, ddc::ChunkSpan< ddc::Coordinate< CoordsDims... > const, BatchedInterpolationDDom, Layout2, memory_space > const coords_eval, ddc::ChunkSpan< double const, batched_spline_domain_type< BatchedInterpolationDDom >, Layout3, memory_space > const spline_coef) const
Evaluate spline function (described by its spline coefficients) on a mesh.
upper_extrapolation_rule_type upper_extrapolation_rule() const
Get the upper extrapolation rule.
SplineEvaluator & operator=(SplineEvaluator const &x)=default
Copy-assigns.
SplineEvaluator & operator=(SplineEvaluator &&x)=default
Move-assigns.
SplineEvaluator(LowerExtrapolationRule const &lower_extrap_rule, UpperExtrapolationRule const &upper_extrap_rule)
Build a SplineEvaluator acting on batched_spline_domain.
lower_extrapolation_rule_type lower_extrapolation_rule() const
Get the lower extrapolation rule.
void deriv(DElem const &deriv_order, ddc::ChunkSpan< double, BatchedInterpolationDDom, Layout1, memory_space > const spline_eval, ddc::ChunkSpan< double const, batched_spline_domain_type< BatchedInterpolationDDom >, Layout2, memory_space > const spline_coef) const
Differentiate 1D spline function (described by its spline coefficients) on a mesh.
KOKKOS_FUNCTION double operator()(ddc::Coordinate< CoordsDims... > const &coord_eval, ddc::ChunkSpan< double const, spline_domain_type, Layout, memory_space > const spline_coef) const
Evaluate 1D spline function (described by its spline coefficients) at a given coordinate.
KOKKOS_FUNCTION double deriv(DElem const &deriv_order, ddc::Coordinate< CoordsDims... > const &coord_eval, ddc::ChunkSpan< double const, spline_domain_type, Layout, memory_space > const spline_coef) const
Differentiate 1D spline function (described by its spline coefficients) at a given coordinate.
SplineEvaluator(SplineEvaluator const &x)=default
Copy-constructs.
SplineEvaluator(SplineEvaluator &&x)=default
Move-constructs.
void deriv(DElem const &deriv_order, ddc::ChunkSpan< double, BatchedInterpolationDDom, Layout1, memory_space > const spline_eval, ddc::ChunkSpan< ddc::Coordinate< CoordsDims... > const, BatchedInterpolationDDom, Layout2, memory_space > const coords_eval, ddc::ChunkSpan< double const, batched_spline_domain_type< BatchedInterpolationDDom >, Layout3, memory_space > const spline_coef) const
Differentiate 1D spline function (described by its spline coefficients) on a mesh.
void integrate(ddc::ChunkSpan< double, BatchedDDom, Layout1, memory_space > const integrals, ddc::ChunkSpan< double const, BatchedSplineDDom, Layout2, memory_space > const spline_coef) const
Perform batched 1D integrations of a spline function (described by its spline coefficients) along the...
void operator()(ddc::ChunkSpan< double, BatchedInterpolationDDom, Layout1, memory_space > const spline_eval, ddc::ChunkSpan< double const, batched_spline_domain_type< BatchedInterpolationDDom >, Layout2, memory_space > const spline_coef) const
Evaluate a spline function (described by its spline coefficients) on a mesh.
~SplineEvaluator()=default
Destructs.
#define DDC_BUILD_DEPRECATED_CODE
The top-level namespace of DDC.
constexpr int n_boundary_equations(ddc::BoundCond const bc, std::size_t const degree)
Return the number of equations needed to describe a given boundary condition.
constexpr bool is_uniform_bsplines_v
Indicates if a tag corresponds to uniform B-splines or not.
BoundCond
An enum representing a spline boundary condition.
@ HOMOGENEOUS_HERMITE
Homogeneous Hermite boundary condition (derivatives are 0)
@ GREVILLE
Use Greville points instead of conditions on derivative for B-Spline interpolation.
@ HERMITE
Hermite boundary condition.
@ PERIODIC
Periodic boundary condition u(1)=u(n)
ddc::ChunkSpan< double, ddc::DiscreteDomain< DDim >, Layout, MemorySpace > integrals(ExecSpace const &execution_space, ddc::ChunkSpan< double, ddc::DiscreteDomain< DDim >, Layout, MemorySpace > int_vals)
Compute the integrals of the B-splines.
SplineSolver
An enum determining the backend solver of a SplineBuilder or SplineBuilder2d.
@ LAPACK
Enum member to identify the LAPACK-based solver (direct method)
@ GINKGO
Enum member to identify the Ginkgo-based solver (iterative method)
constexpr bool is_non_uniform_bsplines_v
Indicates if a tag corresponds to non-uniform B-splines or not.
A templated struct representing a discrete dimension storing the derivatives of a function along a co...
If the type DDim is a B-spline, defines type to the discrete dimension of the associated knots.