-
Notifications
You must be signed in to change notification settings - Fork 3
/
linear_vect_to_field.cpp
130 lines (80 loc) · 2.47 KB
/
linear_vect_to_field.cpp
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
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
#include"linear.h"
#include"fields_enum.h"
VectorXd linear::field_to_vctr(const sfield_list::take sf ) {
typedef std::pair<int,FT> idx_val;
std::vector<idx_val> idx_vals;
// std::vector<int> indices;
// std::vector<FT> ff;
for(F_v_it fv=T.finite_vertices_begin();
fv!=T.finite_vertices_end();
fv++) {
int idx = fv->idx.val();
if( idx < 0 ) continue;
idx_vals.push_back( idx_val( idx , fv->sfield(sf).val() ) );
// ff.push_back( fv->sfield(sf).val() );
}
int N = idx_vals.size();
VectorXd vctr( N );
// vctr.resize(N);
for(int nn=0; nn < N ; nn++) {
vctr( idx_vals[nn].first ) = idx_vals[nn].second;
// cout << indices[nn] << " : "
// << ff[nn] << endl;
}
return vctr;
}
void linear::vfield_to_vctrs(const vfield_list::take vf , VectorXd& vx, VectorXd& vy ) {
typedef std::pair<int,FT> idx_val;
std::vector<idx_val> idx_vals_x;
std::vector<idx_val> idx_vals_y;
for(F_v_it fv=T.finite_vertices_begin();
fv!=T.finite_vertices_end();
fv++) {
int idx = fv->idx.val();
if( idx < 0 ) continue;
Vector_2 vv = fv->vfield(vf).val();
idx_vals_x.push_back( idx_val( idx , vv.x() ) );
idx_vals_y.push_back( idx_val( idx , vv.y() ) );
}
int N = idx_vals_x.size();
vx.resize( N );
vy.resize( N );
// vctr.resize(N);
for(int nn=0; nn < N ; nn++) {
vx( idx_vals_x[nn].first ) = idx_vals_x[nn].second;
vy( idx_vals_y[nn].first ) = idx_vals_y[nn].second;
}
return;
}
void linear::vctr_to_field(const VectorXd& vv, const sfield_list::take sf ) {
// int nn=0;
for(F_v_it fv=T.finite_vertices_begin();
fv!=T.finite_vertices_end();
fv++) {
int idx = fv->idx.val();
if( idx < 0 ) continue;
// check (only makes sense if vertices are re-labeled at every step)
// if(index!=nn) {
// std::cout << "Error transfering from vector onto field " << scalarf << std::endl;
// }
// cout << idx << " ";
// cout << vv[ idx ] << endl;
fv->sfield(sf).set( vv[ idx ] );
// ++nn;
// cout << index << " : "
// << vv[index] << endl;
}
return;
}
void linear::vctrs_to_vfield(const VectorXd& vx,
const VectorXd& vy,
const vfield_list::take vf ) {
for(F_v_it fv=T.finite_vertices_begin();
fv!=T.finite_vertices_end();
fv++) {
int idx = fv->idx.val();
if( idx < 0 ) continue;
fv->vfield(vf).set( Vector_2 ( vx[ idx ] , vy[idx] ) );
}
return;
}