27 void casadi_blazing_3d_boor_eval(T1* f, T1* J, T1* H,
const T1* all_knots,
const T1* all_knots_cache,
const casadi_int* offset,
const T1* c,
const T1* dc,
const T1* ddc,
const T1* all_x,
const casadi_int* lookup_mode, casadi_int* iw, T1* w) {
32 casadi_int stride1 = offset[1]-offset[0]-4;
33 casadi_int stride2 = (offset[2]-offset[1]-4)*stride1;
35 simde__m256d zero = simde_mm256_set1_pd(0.0);
39 simde__m256d d0[3], d1[3], d2[3];
40 const T1* inv2[3] = {0, 0, 0};
const T1* inv3[3] = {0, 0, 0};
41 const T1* dim_cache = all_knots_cache;
42 for (
int i = 0; i < 3; ++i) {
43 starts[i] = casadi_blazing_boor_init<T1>(all_x[i], all_knots, dim_cache,
44 offset[i], offset[i+1], lookup_mode[i], &d0[i], &d1[i], &d2[i], &inv2[i], &inv3[i]);
45 if (dim_cache) dim_cache += 2 + 3 * (offset[i+1] - offset[i]);
50 for (
int j=0;j<4;++j) {
51 for (
int k=0;k<4;++k) {
52 C[j+4*k] = simde_mm256_loadu_pd(c+(starts[1]+j)*stride1+(starts[2]+k)*stride2+starts[0]);
57 f[0] = casadi_blazing_tensor_ttv3<T1>(C, &d0[0], &d0[1], &d0[2]);
63 for (
int i = 0; i < 3; ++i) {
64 t[i] = all_knots + offset[i] + starts[i];
69 for (
int i = 0; i < 3; ++i) {
73 casadi_blazing_dbasis<T1>(&Ji[i], &d1[i], t[i], inv3[i]);
81 stride1 = offset[1]-offset[0]-4-1;
82 stride2 = (offset[2]-offset[1]-4)*stride1;
83 for (
int j=0;j<4;++j) {
84 for (
int k=0;k<4;++k) {
85 C[j+4*k] = simde_mm256_loadu_pd(
86 dc+(starts[1]+j)*stride1+(starts[2]+k)*stride2+starts[0]-1);
89 dc += stride2*(offset[3]-offset[2]-4);
91 J[0] = casadi_blazing_tensor_ttv3<T1>(C, &Ji[0], &d0[1], &d0[2]);
95 stride1 = offset[1]-offset[0]-4;
96 stride2 = (offset[2]-offset[1]-4-1)*stride1;
97 for (
int j=0;j<4;++j) {
98 for (
int k=0;k<4;++k) {
102 C[j+4*k] = simde_mm256_loadu_pd(
103 dc+(starts[1]+j-1)*stride1+(starts[2]+k)*stride2+starts[0]);
107 dc += stride2*(offset[3]-offset[2]-4);
109 J[1] = casadi_blazing_tensor_ttv3<T1>(C, &d0[0], &Ji[1], &d0[2]);
113 stride1 = offset[1]-offset[0]-4;
114 stride2 = (offset[2]-offset[1]-4)*stride1;
115 for (
int j=0;j<4;++j) {
116 for (
int k=0;k<4;++k) {
120 C[j+4*k] = simde_mm256_loadu_pd(
121 dc+(starts[1]+j)*stride1+(starts[2]+k-1)*stride2+starts[0]);
126 J[2] = casadi_blazing_tensor_ttv3<T1>(C, &d0[0], &d0[1], &Ji[2]);
133 for (
int i = 0; i < 3; ++i) {
137 casadi_blazing_d2basis<T1>(&Hi[i], &d2[i], t[i], inv2[i], inv3[i]);
144 stride1 = offset[1]-offset[0]-4-2;
145 stride2 = (offset[2]-offset[1]-4)*stride1;
146 for (
int j=0;j<4;++j) {
147 for (
int k=0;k<4;++k) {
148 C[j+4*k] = simde_mm256_loadu_pd(
149 ddc+(starts[1]+j)*stride1+(starts[2]+k)*stride2+starts[0]-2);
152 ddc += stride2*(offset[3]-offset[2]-4);
154 H[0] = casadi_blazing_tensor_ttv3<T1>(C, &Hi[0], &d0[1], &d0[2]);
158 stride1 = offset[1]-offset[0]-4;
159 stride2 = (offset[2]-offset[1]-4-2)*stride1;
160 for (
int j=0;j<4;++j) {
161 for (
int k=0;k<4;++k) {
165 C[j+4*k] = simde_mm256_loadu_pd(
166 ddc+(starts[1]+j-2)*stride1+(starts[2]+k)*stride2+starts[0]);
170 ddc += stride2*(offset[3]-offset[2]-4);
172 H[4] = casadi_blazing_tensor_ttv3<T1>(C, &d0[0], &Hi[1], &d0[2]);
176 stride1 = offset[1]-offset[0]-4;
177 stride2 = (offset[2]-offset[1]-4)*stride1;
178 for (
int j=0;j<4;++j) {
179 for (
int k=0;k<4;++k) {
183 C[j+4*k] = simde_mm256_loadu_pd(
184 ddc+(starts[1]+j)*stride1+(starts[2]+k-2)*stride2+starts[0]);
188 ddc += stride2*(offset[3]-offset[2]-4-2);
190 H[8] = casadi_blazing_tensor_ttv3<T1>(C, &d0[0], &d0[1], &Hi[2]);
195 stride1 = offset[1]-offset[0]-5;
196 stride2 = (offset[2]-offset[1]-5)*stride1;
197 for (
int j=0;j<4;++j) {
198 for (
int k=0;k<4;++k) {
202 C[j+4*k] = simde_mm256_loadu_pd(
203 ddc+(starts[1]+j-1)*stride1+(starts[2]+k)*stride2+starts[0]-1);
207 ddc += stride2*(offset[3]-offset[2]-4);
209 H[1] = H[3] = casadi_blazing_tensor_ttv3<T1>(C, &Ji[0], &Ji[1], &d0[2]);
213 stride1 = offset[1]-offset[0]-4;
214 stride2 = (offset[2]-offset[1]-5)*stride1;
215 for (
int j=0;j<4;++j) {
216 for (
int k=0;k<4;++k) {
220 C[j+4*k] = simde_mm256_loadu_pd(
221 ddc+(starts[1]+j-1)*stride1+(starts[2]+k-1)*stride2+starts[0]);
225 ddc += stride2*(offset[3]-offset[2]-5);
227 H[5] = H[7] = casadi_blazing_tensor_ttv3<T1>(C, &d0[0], &Ji[1], &Ji[2]);
231 stride1 = offset[1]-offset[0]-5;
232 stride2 = (offset[2]-offset[1]-4)*stride1;
233 for (
int j=0;j<4;++j) {
234 for (
int k=0;k<4;++k) {
238 C[j+4*k] = simde_mm256_loadu_pd(
239 ddc+(starts[1]+j)*stride1+(starts[2]+k-1)*stride2+starts[0]-1);
244 H[2] = H[6] = casadi_blazing_tensor_ttv3<T1>(C, &Ji[0], &d0[1], &Ji[2]);