summaryrefslogtreecommitdiff
path: root/plugins/supereq/shibatch_rdft.c
blob: 2a352f7ea2e4830bf56264336c3ee0c43efdc515 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <stdint.h>

#include "SIMDBase.h"
#include "DFT.h"

typedef float REAL;
#define TYPE SIMDBase_TYPE_FLOAT

void rfft(int n,int isign,REAL *x) {
    static DFT *p = NULL;
    static int ipsize = 0;
    static int mode = 0;
    int newipsize;
    if (n == 0) {
        if (p) {
            DFT_dispose(p, mode);
            p = NULL;
        }
        return;
    }
    n = 1 << n;
    newipsize = 2+sqrt(n/2);
    if (newipsize > ipsize) {
        ipsize = newipsize;

        if (p) {
            DFT_dispose(p, mode);
            p = NULL;
        }

        mode = SIMDBase_chooseBestMode(TYPE);
        p = DFT_init(mode, n, 0);
    }

    DFT_execute(p, mode, x, 1);
}