Mercurial > hg > sv-dependency-builds
comparison src/fftw-3.3.5/mpi/dtensor.c @ 42:2cd0e3b3e1fd
Current fftw source
author | Chris Cannam |
---|---|
date | Tue, 18 Oct 2016 13:40:26 +0100 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
41:481f5f8c5634 | 42:2cd0e3b3e1fd |
---|---|
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 #include "ifftw-mpi.h" | |
22 | |
23 dtensor *XM(mkdtensor)(int rnk) | |
24 { | |
25 dtensor *x; | |
26 | |
27 A(rnk >= 0); | |
28 | |
29 #if defined(STRUCT_HACK_KR) | |
30 if (FINITE_RNK(rnk) && rnk > 1) | |
31 x = (dtensor *)MALLOC(sizeof(dtensor) + (rnk - 1) * sizeof(ddim), | |
32 TENSORS); | |
33 else | |
34 x = (dtensor *)MALLOC(sizeof(dtensor), TENSORS); | |
35 #elif defined(STRUCT_HACK_C99) | |
36 if (FINITE_RNK(rnk)) | |
37 x = (dtensor *)MALLOC(sizeof(dtensor) + rnk * sizeof(ddim), | |
38 TENSORS); | |
39 else | |
40 x = (dtensor *)MALLOC(sizeof(dtensor), TENSORS); | |
41 #else | |
42 x = (dtensor *)MALLOC(sizeof(dtensor), TENSORS); | |
43 if (FINITE_RNK(rnk) && rnk > 0) | |
44 x->dims = (ddim *)MALLOC(sizeof(ddim) * rnk, TENSORS); | |
45 else | |
46 x->dims = 0; | |
47 #endif | |
48 | |
49 x->rnk = rnk; | |
50 return x; | |
51 } | |
52 | |
53 void XM(dtensor_destroy)(dtensor *sz) | |
54 { | |
55 #if !defined(STRUCT_HACK_C99) && !defined(STRUCT_HACK_KR) | |
56 X(ifree0)(sz->dims); | |
57 #endif | |
58 X(ifree)(sz); | |
59 } | |
60 | |
61 void XM(dtensor_md5)(md5 *p, const dtensor *t) | |
62 { | |
63 int i; | |
64 X(md5int)(p, t->rnk); | |
65 if (FINITE_RNK(t->rnk)) { | |
66 for (i = 0; i < t->rnk; ++i) { | |
67 const ddim *q = t->dims + i; | |
68 X(md5INT)(p, q->n); | |
69 X(md5INT)(p, q->b[IB]); | |
70 X(md5INT)(p, q->b[OB]); | |
71 } | |
72 } | |
73 } | |
74 | |
75 dtensor *XM(dtensor_copy)(const dtensor *sz) | |
76 { | |
77 dtensor *x = XM(mkdtensor)(sz->rnk); | |
78 int i; | |
79 if (FINITE_RNK(sz->rnk)) | |
80 for (i = 0; i < sz->rnk; ++i) | |
81 x->dims[i] = sz->dims[i]; | |
82 return x; | |
83 } | |
84 | |
85 dtensor *XM(dtensor_canonical)(const dtensor *sz, int compress) | |
86 { | |
87 int i, rnk; | |
88 dtensor *x; | |
89 block_kind k; | |
90 | |
91 if (!FINITE_RNK(sz->rnk)) | |
92 return XM(mkdtensor)(sz->rnk); | |
93 for (i = rnk = 0; i < sz->rnk; ++i) { | |
94 if (sz->dims[i].n <= 0) | |
95 return XM(mkdtensor)(RNK_MINFTY); | |
96 else if (!compress || sz->dims[i].n > 1) | |
97 ++rnk; | |
98 } | |
99 x = XM(mkdtensor)(rnk); | |
100 for (i = rnk = 0; i < sz->rnk; ++i) { | |
101 if (!compress || sz->dims[i].n > 1) { | |
102 x->dims[rnk].n = sz->dims[i].n; | |
103 FORALL_BLOCK_KIND(k) { | |
104 if (XM(num_blocks)(sz->dims[i].n, sz->dims[i].b[k]) == 1) | |
105 x->dims[rnk].b[k] = sz->dims[i].n; | |
106 else | |
107 x->dims[rnk].b[k] = sz->dims[i].b[k]; | |
108 } | |
109 ++rnk; | |
110 } | |
111 } | |
112 return x; | |
113 } | |
114 | |
115 int XM(dtensor_validp)(const dtensor *sz) | |
116 { | |
117 int i; | |
118 if (sz->rnk < 0) return 0; | |
119 if (FINITE_RNK(sz->rnk)) | |
120 for (i = 0; i < sz->rnk; ++i) | |
121 if (sz->dims[i].n < 0 | |
122 || sz->dims[i].b[IB] <= 0 | |
123 || sz->dims[i].b[OB] <= 0) | |
124 return 0; | |
125 return 1; | |
126 } | |
127 | |
128 void XM(dtensor_print)(const dtensor *t, printer *p) | |
129 { | |
130 if (FINITE_RNK(t->rnk)) { | |
131 int i; | |
132 int first = 1; | |
133 p->print(p, "("); | |
134 for (i = 0; i < t->rnk; ++i) { | |
135 const ddim *d = t->dims + i; | |
136 p->print(p, "%s(%D %D %D)", | |
137 first ? "" : " ", | |
138 d->n, d->b[IB], d->b[OB]); | |
139 first = 0; | |
140 } | |
141 p->print(p, ")"); | |
142 } else { | |
143 p->print(p, "rank-minfty"); | |
144 } | |
145 | |
146 } |