39 #include "ac/lapack.h"
44 for (
int it = 1; it <= r.
iGetSize(); it++) {
45 w_out(it,it) =
std::pow(1-(r(it)), 2);
51 for (
int it = 1; it <= r.
iGetSize(); it++) {
52 w_out(it,it) =
std::pow(1-r(it), 4)*(4*r(it) + 1);
58 for (
int it = 1; it <= r.
iGetSize(); it++) {
67 for (
unsigned int i=0; i<3; i++){
71 for (
unsigned int i=0; i< k; i++){
73 for (
unsigned int j=0; j<3; j++){
74 P(i+1,j+2) = PosMb[
id[i]][j];
83 for (
unsigned int i=0; i<3; i++){
86 for (
unsigned int i=0; i<3; i++){
87 p(i+5) = PosFem[i] * PosFem[0];
88 for (
unsigned int i=0; i<2; i++){
89 p(i+8)= PosFem[i+1] * PosFem[1];
92 p(10) = PosFem[2]*PosFem[2];
94 for (
unsigned int i=0; i<k; i++){
96 for (
unsigned int j=0; j<3; j++){
97 P(i+1,j+2) = PosMb[
id[i]][j];
99 for (
unsigned int j=0; j<3; j++){
100 P(i+1,j+5) = PosMb[
id[i]][j] * PosMb[
id[i]][0];
102 for (
unsigned int j=0; j<2; j++){
103 P(i+1,j+8) = PosMb[
id[i]][j+1] * PosMb[
id[i]][1];
105 P(i+1,10) = PosMb[
id[i]][2] * PosMb[
id[i]][2];
110 MLSP::MLSP(
unsigned int NodesN,
int WgType,
bool LinQuad)
111 :N(NodesN), pP(), pW(), pp()
118 std::cout <<
"C0 RBF" << std::endl;
122 std::cout <<
"C2 RBF" << std::endl;
126 std::cout <<
"C4 RBF" << std::endl;
136 pP.ResizeReset(N,10);
160 ANNpointArray data = annAllocPts(mb_size,dim);
161 ANNpoint query = annAllocPt(dim);
162 ANNidxArray idx =
new ANNidx[N];
163 ANNdistArray dist =
new ANNdist[N];
166 for (
unsigned i = 0 ; i < mb_size ; i++){
167 for (
unsigned j = 0 ; j < dim ; j++){
168 data[i][j] = mb_data.
data[i].X(j+1);
175 for (
unsigned i = 0; i < fem_size ; i++){
177 for (
unsigned j = 0 ; j < dim ; j++){
178 query[j] = fem_data.
data[i].X(j+1);
181 pTree->annkSearch(query, N, idx, dist);
183 pOr->SetP(query, data, idx, N, pp, pP);
186 double dm =
sqrt(dist[N-1]);
187 for (
unsigned j = 0; j < N ; j++){
188 r(j+1) =
sqrt(dist[j])/(1.05*dm);
191 pWg->SetWeight(r,pW);
193 int d2 = pP.iGetNumCols();
199 double* S =
new double[d2];
202 int nvl =
int(2*
log(d2/26))+1;
203 int lwork =12*d2 + 2*d2*25 + 8*d2*nvl + d2*ord + 676;
204 double* work =
new double[lwork];
205 int* iwork =
new int[(3 * d2 * nvl + 11 * d2)];
206 __FC_DECL__(dgelsd)(&d2, &d2, &ord, A.pdGetMat(),
207 &d2, B.pdGetMat(), &d2, S, &rcond, &rank, work, &lwork, iwork, &info);
213 for (
unsigned int j = 0 ; j < N ; j++){
214 pH->operator()(i+1, idx[j]+1) = h(j+1);
223 const std::vector<Vec3>& Adj)
231 unsigned Nadj = Adj.size();
232 unsigned mb_base_size = mb_size/(Nadj+1);
234 unsigned k = N/(Nadj+1);
237 ANNpointArray data = annAllocPts(mb_size,dim);
238 ANNpointArray data_temp = annAllocPts(mb_base_size,dim);
239 ANNpoint query = annAllocPt(dim);
240 ANNidxArray idx =
new ANNidx[N];
241 ANNidxArray idx_temp =
new ANNidx[k];
242 ANNdistArray dist =
new ANNdist[N];
243 ANNdistArray dist_temp =
new ANNdist[k];
246 for (
unsigned i = 0 ; i < mb_base_size ; i++){
247 for (
unsigned j = 0 ; j < dim ; j++){
248 data_temp[i][j] = mb_data.
data[i].X(j+1);
249 data[i*(Nadj+1)][j] = mb_data.
data[i].X(j+1);
250 for (
unsigned i_a = 0; i_a < Nadj ; i_a++){
251 for (
unsigned d = 0; d < dim ; d++){
252 data[i*(Nadj+1)+i_a+1][d] = mb_data.
data[i].X(d+1)+Adj[i_a](d+1);
261 for (
unsigned i = 0; i < fem_size ; i++){
263 for (
unsigned j = 0 ; j < dim ; j++){
264 query[j] = fem_data.
data[i].X(j+1);
267 pTree->annkSearch(query, k, idx_temp, dist_temp);
269 for (
unsigned i_node = 0; i_node < k ; i_node++) {
270 idx[i_node*(Nadj+1)] = idx_temp[i_node]*(Nadj+1);
271 dist[i_node*(Nadj+1)] = dist_temp[i_node];
272 unsigned count_a = 1;
273 for (std::vector<Vec3>::const_iterator it_adj = Adj.begin();
274 it_adj != Adj.end(); ++it_adj)
276 ANNpoint adj = annAllocPt(dim);
277 for (
unsigned int d = 0 ; d < dim ; d++) {
278 adj[d] = data_temp[idx_temp[i_node]][d]+it_adj->dGet(d+1);
280 ANNdist dist_adj = annDist(dim,query,adj);
281 idx[i_node*(Nadj+1)+count_a] = idx_temp[i_node]*(Nadj+1)+count_a;
282 dist[i_node*(Nadj+1)+count_a] = dist_adj;
285 pOr->SetP(query, data, idx, N, pp, pP);
288 double dm =
sqrt(dist[N-1]);
289 for (
unsigned j = 0; j < N ; j++){
290 r(j+1) =
sqrt(dist[j])/(1.05*dm);
293 pWg->SetWeight(r,pW);
295 int d2 = pP.iGetNumCols();
301 double* S =
new double[d2];
304 int nvl =
int(2*
log(d2/26))+1;
305 int lwork =12*d2 + 2*d2*25 + 8*d2*nvl + d2*ord + 676;
306 double* work =
new double[lwork];
307 int* iwork =
new int[(3 * d2 * nvl + 11 * d2)];
308 __FC_DECL__(dgelsd)(&d2, &d2, &ord, A.pdGetMat(),
309 &d2, B.pdGetMat(), &d2, S, &rcond, &rank, work, &lwork, iwork, &info);
315 for (
unsigned int j = 0 ; j < N ; j++){
316 pH->operator()(i+1, idx[j]+1) = h(j+1);
GradientExpression< BinaryExpr< FuncPow, LhsExpr, RhsExpr > > pow(const GradientExpression< LhsExpr > &u, const GradientExpression< RhsExpr > &v)
integer iGetNumRows(void) const
std::vector< Geometry > data
virtual integer iGetSize(void) const
integer iGetNumCols(void) const
GradientExpression< UnaryExpr< FuncLog, Expr > > log(const GradientExpression< Expr > &u)
GradientExpression< UnaryExpr< FuncSqrt, Expr > > sqrt(const GradientExpression< Expr > &u)
#define SAFENEWWITHCONSTRUCTOR(pnt, item, constructor)