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) {
70 Ji[i] = dc ? d1[i] : casadi_blazing_dbasis<T1>(d1[i], t[i], inv3[i]);
77 stride1 = offset[1]-offset[0]-4-1;
78 stride2 = (offset[2]-offset[1]-4)*stride1;
79 for (
int j=0;j<4;++j) {
80 for (
int k=0;k<4;++k) {
81 C[j+4*k] = simde_mm256_loadu_pd(
82 dc+(starts[1]+j)*stride1+(starts[2]+k)*stride2+starts[0]-1);
85 dc += stride2*(offset[3]-offset[2]-4);
87 J[0] = casadi_blazing_tensor_ttv3<T1>(C, Ji[0], d0[1], d0[2]);
91 stride1 = offset[1]-offset[0]-4;
92 stride2 = (offset[2]-offset[1]-4-1)*stride1;
93 for (
int j=0;j<4;++j) {
94 for (
int k=0;k<4;++k) {
98 C[j+4*k] = simde_mm256_loadu_pd(
99 dc+(starts[1]+j-1)*stride1+(starts[2]+k)*stride2+starts[0]);
103 dc += stride2*(offset[3]-offset[2]-4);
105 J[1] = casadi_blazing_tensor_ttv3<T1>(C, d0[0], Ji[1], d0[2]);
109 stride1 = offset[1]-offset[0]-4;
110 stride2 = (offset[2]-offset[1]-4)*stride1;
111 for (
int j=0;j<4;++j) {
112 for (
int k=0;k<4;++k) {
116 C[j+4*k] = simde_mm256_loadu_pd(
117 dc+(starts[1]+j)*stride1+(starts[2]+k-1)*stride2+starts[0]);
122 J[2] = casadi_blazing_tensor_ttv3<T1>(C, d0[0], d0[1], Ji[2]);
129 for (
int i = 0; i < 3; ++i) {
130 Hi[i] = ddc ? d2[i] : casadi_blazing_d2basis<T1>(d2[i], t[i], inv2[i], inv3[i]);
136 stride1 = offset[1]-offset[0]-4-2;
137 stride2 = (offset[2]-offset[1]-4)*stride1;
138 for (
int j=0;j<4;++j) {
139 for (
int k=0;k<4;++k) {
140 C[j+4*k] = simde_mm256_loadu_pd(
141 ddc+(starts[1]+j)*stride1+(starts[2]+k)*stride2+starts[0]-2);
144 ddc += stride2*(offset[3]-offset[2]-4);
146 H[0] = casadi_blazing_tensor_ttv3<T1>(C, Hi[0], d0[1], d0[2]);
150 stride1 = offset[1]-offset[0]-4;
151 stride2 = (offset[2]-offset[1]-4-2)*stride1;
152 for (
int j=0;j<4;++j) {
153 for (
int k=0;k<4;++k) {
157 C[j+4*k] = simde_mm256_loadu_pd(
158 ddc+(starts[1]+j-2)*stride1+(starts[2]+k)*stride2+starts[0]);
162 ddc += stride2*(offset[3]-offset[2]-4);
164 H[4] = casadi_blazing_tensor_ttv3<T1>(C, d0[0], Hi[1], d0[2]);
168 stride1 = offset[1]-offset[0]-4;
169 stride2 = (offset[2]-offset[1]-4)*stride1;
170 for (
int j=0;j<4;++j) {
171 for (
int k=0;k<4;++k) {
175 C[j+4*k] = simde_mm256_loadu_pd(
176 ddc+(starts[1]+j)*stride1+(starts[2]+k-2)*stride2+starts[0]);
180 ddc += stride2*(offset[3]-offset[2]-4-2);
182 H[8] = casadi_blazing_tensor_ttv3<T1>(C, d0[0], d0[1], Hi[2]);
187 stride1 = offset[1]-offset[0]-5;
188 stride2 = (offset[2]-offset[1]-5)*stride1;
189 for (
int j=0;j<4;++j) {
190 for (
int k=0;k<4;++k) {
194 C[j+4*k] = simde_mm256_loadu_pd(
195 ddc+(starts[1]+j-1)*stride1+(starts[2]+k)*stride2+starts[0]-1);
199 ddc += stride2*(offset[3]-offset[2]-4);
201 H[1] = H[3] = casadi_blazing_tensor_ttv3<T1>(C, Ji[0], Ji[1], d0[2]);
205 stride1 = offset[1]-offset[0]-4;
206 stride2 = (offset[2]-offset[1]-5)*stride1;
207 for (
int j=0;j<4;++j) {
208 for (
int k=0;k<4;++k) {
212 C[j+4*k] = simde_mm256_loadu_pd(
213 ddc+(starts[1]+j-1)*stride1+(starts[2]+k-1)*stride2+starts[0]);
217 ddc += stride2*(offset[3]-offset[2]-5);
219 H[5] = H[7] = casadi_blazing_tensor_ttv3<T1>(C, d0[0], Ji[1], Ji[2]);
223 stride1 = offset[1]-offset[0]-5;
224 stride2 = (offset[2]-offset[1]-4)*stride1;
225 for (
int j=0;j<4;++j) {
226 for (
int k=0;k<4;++k) {
230 C[j+4*k] = simde_mm256_loadu_pd(
231 ddc+(starts[1]+j)*stride1+(starts[2]+k-1)*stride2+starts[0]-1);
236 H[2] = H[6] = casadi_blazing_tensor_ttv3<T1>(C, Ji[0], d0[1], Ji[2]);