static plan *mkplan(const solver *ego, const problem *p_, planner *plnr) { const problem_dft *p = (const problem_dft *) p_; P *pln; INT n; INT is, os; static const plan_adt padt = { X(dft_solve), awake, print, destroy }; if (!applicable(ego, p_, plnr)) return (plan *) 0; n = p->sz->dims[0].n; is = p->sz->dims[0].is; os = p->sz->dims[0].os; pln = MKPLAN_DFT(P, &padt, apply); if (!mkP(pln, n, is, os, p->ro, p->io, plnr)) { X(ifree)(pln); return (plan *) 0; } return &(pln->super.super); }
static plan *mkplan_dit(const solver *ego, const problem *p_, planner *plnr) { const problem_dft *p = (const problem_dft *) p_; P_dit *pln = 0; int n, r, m; int is, os; plan *cld = (plan *) 0; static const plan_adt padt = { X(dft_solve), awake_dit, print_dit, destroy_dit }; if (!applicable_dit(ego, p_, plnr)) goto nada; n = p->sz->dims[0].n; is = p->sz->dims[0].is; os = p->sz->dims[0].os; r = X(first_divisor)(n); m = n / r; cld = X(mkplan_d)(plnr, X(mkproblem_dft_d)(X(mktensor_1d)(m, r * is, os), X(mktensor_1d)(r, is, m * os), p->ri, p->ii, p->ro, p->io)); if (!cld) goto nada; pln = MKPLAN_DFT(P_dit, &padt, apply_dit); if (!mkP(&pln->super, r, os*m, os*m, p->ro, p->io, plnr)) goto nada; pln->os = os; pln->m = m; pln->cld = cld; pln->W = 0; pln->super.super.super.ops.add += 2 * (r-1); pln->super.super.super.ops.mul += 4 * (r-1); X(ops_madd)(m, &pln->super.super.super.ops, &cld->ops, &pln->super.super.super.ops); return &(pln->super.super.super); nada: X(plan_destroy_internal)(cld); X(ifree0)(pln); return (plan *) 0; }