-
Notifications
You must be signed in to change notification settings - Fork 41
/
curvexyzfourier.h
89 lines (76 loc) · 3.21 KB
/
curvexyzfourier.h
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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
#pragma once
#include "curve.h"
template<class Array>
class CurveXYZFourier : public Curve<Array> {
/*
CurveXYZFourier is a curve that is represented in cartesian
coordinates using the following Fourier series:
x(phi) = \sum_{m=0}^{order} x_{c,m}cos(m*phi) + \sum_{m=1}^order x_{s,m}sin(m*phi)
y(phi) = \sum_{m=0}^{order} y_{c,m}cos(m*phi) + \sum_{m=1}^order y_{s,m}sin(m*phi)
z(phi) = \sum_{m=0}^{order} z_{c,m}cos(m*phi) + \sum_{m=1}^order z_{s,m}sin(m*phi)
The dofs are stored in the order
[x_{c,0},...,x_{c,order},x_{s,1},...,x_{s,order},y_{c,0},....]
*/
private:
int order;
public:
using Curve<Array>::quadpoints;
using Curve<Array>::numquadpoints;
vector<vector<double>> dofs;
CurveXYZFourier(int _numquadpoints, int _order) : Curve<Array>(_numquadpoints), order(_order) {
dofs = vector<vector<double>> {
vector<double>(2*order+1, 0.),
vector<double>(2*order+1, 0.),
vector<double>(2*order+1, 0.)
};
}
CurveXYZFourier(vector<double> _quadpoints, int _order) : Curve<Array>(_quadpoints), order(_order) {
dofs = vector<vector<double>> {
vector<double>(2*order+1, 0.),
vector<double>(2*order+1, 0.),
vector<double>(2*order+1, 0.)
};
}
CurveXYZFourier(Array _quadpoints, int _order) : Curve<Array>(_quadpoints), order(_order) {
dofs = vector<vector<double>> {
vector<double>(2*order+1, 0.),
vector<double>(2*order+1, 0.),
vector<double>(2*order+1, 0.)
};
}
inline int num_dofs() override {
return 3*(2*order+1);
}
void set_dofs_impl(const vector<double>& _dofs) override {
int counter = 0;
for (int i = 0; i < 3; ++i) {
dofs[i][0] = _dofs[counter++];
for (int j = 1; j < order+1; ++j) {
dofs[i][2*j-1] = _dofs[counter++];
dofs[i][2*j] = _dofs[counter++];
}
}
}
vector<double> get_dofs() override {
auto _dofs = vector<double>(num_dofs(), 0.);
int counter = 0;
for (int i = 0; i < 3; ++i) {
_dofs[counter++] = dofs[i][0];
for (int j = 1; j < order+1; ++j) {
_dofs[counter++] = dofs[i][2*j-1];
_dofs[counter++] = dofs[i][2*j];
}
}
return _dofs;
}
void gamma_impl(Array& data, Array& quadpoints) override;
void gammadash_impl(Array& data) override;
void gammadashdash_impl(Array& data) override;
void gammadashdashdash_impl(Array& data) override;
void dgamma_by_dcoeff_impl(Array& data) override;
void dgammadash_by_dcoeff_impl(Array& data) override;
void dgammadashdash_by_dcoeff_impl(Array& data) override;
void dgammadashdashdash_by_dcoeff_impl(Array& data) override;
Array dgamma_by_dcoeff_vjp(Array& v) override;
Array dgammadash_by_dcoeff_vjp(Array& v) override;
};