51 a1 = (k - fudge) * (k - fudge + 1);
56 int a3 = fudge * (fudge + 1);
88 return (((4 * bw * bw * bw) + (6 * bw * bw) - (8 * bw)) / 24) + bw;
111 for (
int i = 0; i < m; ++i)
129 int offset = ((l / 2) * ((l / 2) + 1)) - ((m / 2) * ((m / 2) + 1));
131 offset += (l / 2) + 1;
162 double* prevprev = workspace;
163 double* prev = prevprev + bw;
164 double* temp1 = prev + bw;
165 double* temp2 = temp1 + bw;
166 double* temp3 = temp2 + bw;
167 double* temp4 = temp3 + bw;
168 double* x_i = temp4 + bw;
169 double* eval_args = x_i + bw;
170 double* cosres = eval_args + bw;
172 double* tableptr = tablespace;
181 for (
int i = 0; i < bw; ++i)
185 for (
int i = 0; i < bw; ++i)
188 Pmm_L2(m, eval_args, bw, prev);
191 for (
int i = 0; i < bw; ++i)
192 prev[i] /= sin(eval_args[i]);
202 memcpy(temp4, prev,
sizeof(
double) * bw);
203 fftw_plan plan = fftw_plan_r2r_1d(bw, temp4, cosres, FFTW_REDFT10, FFTW_ESTIMATE);
205 cosres[0] *= M_SQRT1_2;
206 double fudge = 1. / sqrt(bw);
207 for (
int i = 0; i < bw; ++i)
211 for (
int i = 0; i <= k; i += 2)
212 tableptr[i / 2] = cosres[i];
214 tableptr += k / 2 + 1;
217 for (
int i = 0; i < bw - m - 1; ++i) {
221 vec_add(temp3, temp1, temp4, bw);
225 cosres[0] *= M_SQRT1_2;
226 for (
int j = 0; j < bw; ++j)
231 for (
int j = (i % 2) ? 0 : 1; j <= k; j += 2)
232 tableptr[j / 2] = cosres[j];
234 tableptr += k / 2 + 1;
237 memcpy(prevprev, prev,
sizeof(
double) * bw);
238 memcpy(prev, temp4,
sizeof(
double) * bw);
241 fftw_destroy_plan(plan);
257 return ((l - 1) / 2) + 1;
278 return ((bw - row - 1) / 2) + 1;
306 double* trans_tableptr = result;
310 memcpy(result, cos_pml_table,
sizeof(
double) *
TableSize(m, bw));
314 for (
int row = 0; row < bw; ++row) {
316 if (row == (bw - 1) && (m % 2))
324 tableptr = cos_pml_table + (row / 2);
326 tableptr = cos_pml_table + (m / 2) + 1 + (row / 2);
331 int end_row = (m % 2) == 0 ? row : row + 1;
332 for (
int i = m; i <= end_row; ++i)
337 tableptr = cos_pml_table + offset;
345 stride = m + 2 - (m % 2) + (row % 2);
353 int costable_offset = 0;
354 for (
int i = 0; i < rowsize; ++i) {
355 trans_tableptr[i] = tableptr[costable_offset];
356 costable_offset += stride;
360 trans_tableptr += rowsize;
388 double** spharmonic_pml_table = (
double**)malloc(
sizeof(
double*) * bw);
390 spharmonic_pml_table[0] = resultspace;
395 for (
int i = 1; i < bw; ++i) {
396 spharmonic_pml_table[i] = spharmonic_pml_table[i - 1] +
TableSize(i - 1, bw);
400 return spharmonic_pml_table;
416 double** transpose_spharmonic_pml_table = (
double**)malloc(
sizeof(
double*) * bw);
418 transpose_spharmonic_pml_table[0] = resultspace;
422 for (
int i = 1; i < bw; ++i) {
423 transpose_spharmonic_pml_table[i] = transpose_spharmonic_pml_table[i - 1] +
TableSize(i - 1, bw);
427 return transpose_spharmonic_pml_table;
436 for (
int i = m; i < bw; ++i)
452 double** seminaive_naive_table = (
double**)malloc(
sizeof(
double) * (bw + 1));
455 seminaive_naive_table[0] = resultspace;
458 for (
int i = 1; i < m; ++i) {
459 seminaive_naive_table[i] = seminaive_naive_table[i - 1] +
TableSize(i - 1, bw);
465 seminaive_naive_table[m] = seminaive_naive_table[m - 1] +
TableSize(m - 1, bw);
469 for (
int i = m + 1; i < bw; ++i) {
470 seminaive_naive_table[i] = seminaive_naive_table[i - 1] + (2 * bw * (bw - (i - 1)));
474 return seminaive_naive_table;
491 double* resultspace,
double* workspace) {
492 double** trans_seminaive_naive_pml_table = (
double**)malloc(
sizeof(
double*) * (bw + 1));
498 trans_seminaive_naive_pml_table[0] = resultspace;
501 for (
int i = 1; i < m; ++i) {
502 trans_seminaive_naive_pml_table[i] = trans_seminaive_naive_pml_table[i - 1] +
TableSize(i - 1, bw);
508 trans_seminaive_naive_pml_table[m] = trans_seminaive_naive_pml_table[m - 1] +
TableSize(m - 1, bw);
512 for (
int i = m + 1; i < bw; ++i) {
513 trans_seminaive_naive_pml_table[i] = trans_seminaive_naive_pml_table[i - 1] + (2 * bw * (bw - (i - 1)));
517 return trans_seminaive_naive_pml_table;