/src/fftw3/kernel/tensor5.c
Line | Count | Source (jump to first uncovered line) |
1 | | /* |
2 | | * Copyright (c) 2003, 2007-14 Matteo Frigo |
3 | | * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology |
4 | | * |
5 | | * This program is free software; you can redistribute it and/or modify |
6 | | * it under the terms of the GNU General Public License as published by |
7 | | * the Free Software Foundation; either version 2 of the License, or |
8 | | * (at your option) any later version. |
9 | | * |
10 | | * This program is distributed in the hope that it will be useful, |
11 | | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
12 | | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
13 | | * GNU General Public License for more details. |
14 | | * |
15 | | * You should have received a copy of the GNU General Public License |
16 | | * along with this program; if not, write to the Free Software |
17 | | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
18 | | * |
19 | | */ |
20 | | |
21 | | |
22 | | #include "kernel/ifftw.h" |
23 | | |
24 | | static void dimcpy(iodim *dst, const iodim *src, int rnk) |
25 | 6.63k | { |
26 | 6.63k | int i; |
27 | 6.63k | if (FINITE_RNK(rnk)) |
28 | 16.8k | for (i = 0; i < rnk; ++i) |
29 | 10.1k | dst[i] = src[i]; |
30 | 6.63k | } |
31 | | |
32 | | tensor *X(tensor_copy)(const tensor *sz) |
33 | 2.70k | { |
34 | 2.70k | tensor *x = X(mktensor)(sz->rnk); |
35 | 2.70k | dimcpy(x->dims, sz->dims, sz->rnk); |
36 | 2.70k | return x; |
37 | 2.70k | } |
38 | | |
39 | | /* like X(tensor_copy), but makes strides in-place by |
40 | | setting os = is if k == INPLACE_IS or is = os if k == INPLACE_OS. */ |
41 | | tensor *X(tensor_copy_inplace)(const tensor *sz, inplace_kind k) |
42 | 2.10k | { |
43 | 2.10k | tensor *x = X(tensor_copy)(sz); |
44 | 2.10k | if (FINITE_RNK(x->rnk)) { |
45 | 2.10k | int i; |
46 | 2.10k | if (k == INPLACE_OS) |
47 | 3.65k | for (i = 0; i < x->rnk; ++i) |
48 | 2.62k | x->dims[i].is = x->dims[i].os; |
49 | 1.07k | else |
50 | 3.75k | for (i = 0; i < x->rnk; ++i) |
51 | 2.68k | x->dims[i].os = x->dims[i].is; |
52 | 2.10k | } |
53 | 2.10k | return x; |
54 | 2.10k | } |
55 | | |
56 | | /* Like X(tensor_copy), but copy all of the dimensions *except* |
57 | | except_dim. */ |
58 | | tensor *X(tensor_copy_except)(const tensor *sz, int except_dim) |
59 | 358 | { |
60 | 358 | tensor *x; |
61 | | |
62 | 358 | A(FINITE_RNK(sz->rnk) && sz->rnk >= 1 && except_dim < sz->rnk); |
63 | 358 | x = X(mktensor)(sz->rnk - 1); |
64 | 358 | dimcpy(x->dims, sz->dims, except_dim); |
65 | 358 | dimcpy(x->dims + except_dim, sz->dims + except_dim + 1, |
66 | 358 | x->rnk - except_dim); |
67 | 358 | return x; |
68 | 358 | } |
69 | | |
70 | | /* Like X(tensor_copy), but copy only rnk dimensions starting |
71 | | with start_dim. */ |
72 | | tensor *X(tensor_copy_sub)(const tensor *sz, int start_dim, int rnk) |
73 | 0 | { |
74 | 0 | tensor *x; |
75 | |
|
76 | 0 | A(FINITE_RNK(sz->rnk) && start_dim + rnk <= sz->rnk); |
77 | 0 | x = X(mktensor)(rnk); |
78 | 0 | dimcpy(x->dims, sz->dims + start_dim, rnk); |
79 | 0 | return x; |
80 | 0 | } |
81 | | |
82 | | tensor *X(tensor_append)(const tensor *a, const tensor *b) |
83 | 1.60k | { |
84 | 1.60k | if (!FINITE_RNK(a->rnk) || !FINITE_RNK(b->rnk)) { |
85 | 0 | return X(mktensor)(RNK_MINFTY); |
86 | 1.60k | } else { |
87 | 1.60k | tensor *x = X(mktensor)(a->rnk + b->rnk); |
88 | 1.60k | dimcpy(x->dims, a->dims, a->rnk); |
89 | 1.60k | dimcpy(x->dims + a->rnk, b->dims, b->rnk); |
90 | 1.60k | return x; |
91 | 1.60k | } |
92 | 1.60k | } |