annotate extra/nurbs/src/nrb_srf_basisfun__.cc @ 12672:59e8aae64812 octave-forge

prepare for release
author cdf
date Mon, 17 Aug 2015 10:23:44 +0000
parents 27ae5ff9ec05
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
5683
be2ec0458410 separate oct files for low level functions
cdf
parents:
diff changeset
1 /* Copyright (C) 2009 Carlo de Falco
be2ec0458410 separate oct files for low level functions
cdf
parents:
diff changeset
2
6958
23ff23c91d06 Slight modifications in the help
rafavzqz
parents: 5787
diff changeset
3 This program is free software: you can redistribute it and/or modify
5683
be2ec0458410 separate oct files for low level functions
cdf
parents:
diff changeset
4 it under the terms of the GNU General Public License as published by
11634
37d08939bb7b apply changes requested by David
cdf
parents: 9923
diff changeset
5 the Free Software Foundation, either version 3 of the License, or
5683
be2ec0458410 separate oct files for low level functions
cdf
parents:
diff changeset
6 (at your option) any later version.
6958
23ff23c91d06 Slight modifications in the help
rafavzqz
parents: 5787
diff changeset
7
5683
be2ec0458410 separate oct files for low level functions
cdf
parents:
diff changeset
8 This program is distributed in the hope that it will be useful,
be2ec0458410 separate oct files for low level functions
cdf
parents:
diff changeset
9 but WITHOUT ANY WARRANTY; without even the implied warranty of
be2ec0458410 separate oct files for low level functions
cdf
parents:
diff changeset
10 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
be2ec0458410 separate oct files for low level functions
cdf
parents:
diff changeset
11 GNU General Public License for more details.
be2ec0458410 separate oct files for low level functions
cdf
parents:
diff changeset
12
be2ec0458410 separate oct files for low level functions
cdf
parents:
diff changeset
13 You should have received a copy of the GNU General Public License
6958
23ff23c91d06 Slight modifications in the help
rafavzqz
parents: 5787
diff changeset
14 along with this program. If not, see <http://www.gnu.org/licenses/>.
5683
be2ec0458410 separate oct files for low level functions
cdf
parents:
diff changeset
15 */
be2ec0458410 separate oct files for low level functions
cdf
parents:
diff changeset
16
be2ec0458410 separate oct files for low level functions
cdf
parents:
diff changeset
17 #include <octave/oct.h>
be2ec0458410 separate oct files for low level functions
cdf
parents:
diff changeset
18 #include <octave/oct-map.h>
be2ec0458410 separate oct files for low level functions
cdf
parents:
diff changeset
19 #include <octave/parse.h>
be2ec0458410 separate oct files for low level functions
cdf
parents:
diff changeset
20 #include "low_level_functions.h"
be2ec0458410 separate oct files for low level functions
cdf
parents:
diff changeset
21
be2ec0458410 separate oct files for low level functions
cdf
parents:
diff changeset
22 DEFUN_DLD(nrb_srf_basisfun__, args, nargout,"\
be2ec0458410 separate oct files for low level functions
cdf
parents:
diff changeset
23 NRB_SRF_BASISFUN__: Undocumented private function\
be2ec0458410 separate oct files for low level functions
cdf
parents:
diff changeset
24 ")
be2ec0458410 separate oct files for low level functions
cdf
parents:
diff changeset
25 {
be2ec0458410 separate oct files for low level functions
cdf
parents:
diff changeset
26
be2ec0458410 separate oct files for low level functions
cdf
parents:
diff changeset
27 octave_value_list retval, newargs;
be2ec0458410 separate oct files for low level functions
cdf
parents:
diff changeset
28
be2ec0458410 separate oct files for low level functions
cdf
parents:
diff changeset
29 const NDArray points = args(0).array_value();
12027
27ae5ff9ec05 remove use of deprecated class Octave_map
cdf
parents: 12026
diff changeset
30 const octave_scalar_map nrb = args(1).scalar_map_value();
5683
be2ec0458410 separate oct files for low level functions
cdf
parents:
diff changeset
31
be2ec0458410 separate oct files for low level functions
cdf
parents:
diff changeset
32 if (!error_state)
be2ec0458410 separate oct files for low level functions
cdf
parents:
diff changeset
33 {
be2ec0458410 separate oct files for low level functions
cdf
parents:
diff changeset
34
12026
8e05006444f4 remove use of deprecated class Octave_map
cdf
parents: 11634
diff changeset
35 const Cell knots = nrb.contents("knots").cell_value();
8e05006444f4 remove use of deprecated class Octave_map
cdf
parents: 11634
diff changeset
36 const NDArray coefs = nrb.contents("coefs").array_value();
8e05006444f4 remove use of deprecated class Octave_map
cdf
parents: 11634
diff changeset
37 octave_idx_type m = static_cast<octave_idx_type> ((nrb.contents("number").vector_value())(0)) - 1; // m = size (nrb.coefs, 2) -1;
8e05006444f4 remove use of deprecated class Octave_map
cdf
parents: 11634
diff changeset
38 octave_idx_type n = static_cast<octave_idx_type> ((nrb.contents("number").vector_value())(1)) - 1; // n = size (nrb.coefs, 3) -1;
8e05006444f4 remove use of deprecated class Octave_map
cdf
parents: 11634
diff changeset
39 octave_idx_type p = static_cast<octave_idx_type> ((nrb.contents("order").vector_value())(0)) - 1; // p = nrb.order(1) -1;
8e05006444f4 remove use of deprecated class Octave_map
cdf
parents: 11634
diff changeset
40 octave_idx_type q = static_cast<octave_idx_type> ((nrb.contents("order").vector_value())(1)) - 1; // q = nrb.order(2) -1;
5683
be2ec0458410 separate oct files for low level functions
cdf
parents:
diff changeset
41
8034
93208857ec22 remove calls to deprecated array constructor
cdf
parents: 6958
diff changeset
42 Array<idx_vector> idx(dim_vector (2, 1), idx_vector(':'));
5787
a87f8cef00df indexing fix and closed knot vector
cdf
parents: 5683
diff changeset
43 idx(0) = 0;
5683
be2ec0458410 separate oct files for low level functions
cdf
parents:
diff changeset
44 const NDArray u(points.index (idx).squeeze ()); // u = points(1,:);
be2ec0458410 separate oct files for low level functions
cdf
parents:
diff changeset
45
5787
a87f8cef00df indexing fix and closed knot vector
cdf
parents: 5683
diff changeset
46 idx(0) = 1;
5683
be2ec0458410 separate oct files for low level functions
cdf
parents:
diff changeset
47 const NDArray v(points.index (idx).squeeze ()); // v = points(2,:);
be2ec0458410 separate oct files for low level functions
cdf
parents:
diff changeset
48
12672
59e8aae64812 prepare for release
cdf
parents: 12027
diff changeset
49 octave_idx_type npt = u.numel (); // npt = length(u);
5683
be2ec0458410 separate oct files for low level functions
cdf
parents:
diff changeset
50 RowVector M(p+1, 0.0), N (q+1, 0.0);
be2ec0458410 separate oct files for low level functions
cdf
parents:
diff changeset
51 Matrix RIkJk(npt, (p+1)*(q+1), 0.0);
be2ec0458410 separate oct files for low level functions
cdf
parents:
diff changeset
52 Matrix indIkJk(npt, (p+1)*(q+1), 0.0);
be2ec0458410 separate oct files for low level functions
cdf
parents:
diff changeset
53 RowVector denom(npt, 0.0);
be2ec0458410 separate oct files for low level functions
cdf
parents:
diff changeset
54
be2ec0458410 separate oct files for low level functions
cdf
parents:
diff changeset
55 const RowVector U(knots(0).row_vector_value ()); // U = nrb.knots{1};
be2ec0458410 separate oct files for low level functions
cdf
parents:
diff changeset
56
be2ec0458410 separate oct files for low level functions
cdf
parents:
diff changeset
57 const RowVector V(knots(1).row_vector_value ()); // V = nrb.knots{2};
be2ec0458410 separate oct files for low level functions
cdf
parents:
diff changeset
58
8034
93208857ec22 remove calls to deprecated array constructor
cdf
parents: 6958
diff changeset
59 Array<idx_vector> idx2(dim_vector (3, 1), idx_vector(':')); idx2(0) = 3;
5683
be2ec0458410 separate oct files for low level functions
cdf
parents:
diff changeset
60 NDArray w (coefs.index (idx2).squeeze ()); // w = squeeze(nrb.coefs(4,:,:));
be2ec0458410 separate oct files for low level functions
cdf
parents:
diff changeset
61
be2ec0458410 separate oct files for low level functions
cdf
parents:
diff changeset
62 RowVector spu(u);
be2ec0458410 separate oct files for low level functions
cdf
parents:
diff changeset
63 for (octave_idx_type ii(0); ii < npt; ii++)
be2ec0458410 separate oct files for low level functions
cdf
parents:
diff changeset
64 {
be2ec0458410 separate oct files for low level functions
cdf
parents:
diff changeset
65 spu(ii) = findspan(m, p, u(ii), U);
be2ec0458410 separate oct files for low level functions
cdf
parents:
diff changeset
66 } // spu = findspan (m, p, u, U);
be2ec0458410 separate oct files for low level functions
cdf
parents:
diff changeset
67
be2ec0458410 separate oct files for low level functions
cdf
parents:
diff changeset
68 newargs(3) = U; newargs(2) = p; newargs(1) = u; newargs(0) = spu;
be2ec0458410 separate oct files for low level functions
cdf
parents:
diff changeset
69 Matrix Ik = feval (std::string("numbasisfun"), newargs, 1)(0).matrix_value (); // Ik = numbasisfun (spu, u, p, U);
be2ec0458410 separate oct files for low level functions
cdf
parents:
diff changeset
70
be2ec0458410 separate oct files for low level functions
cdf
parents:
diff changeset
71 RowVector spv(v);
12672
59e8aae64812 prepare for release
cdf
parents: 12027
diff changeset
72 for (octave_idx_type ii(0); ii < v.numel (); ii++)
5683
be2ec0458410 separate oct files for low level functions
cdf
parents:
diff changeset
73 {
be2ec0458410 separate oct files for low level functions
cdf
parents:
diff changeset
74 spv(ii) = findspan(n, q, v(ii), V);
be2ec0458410 separate oct files for low level functions
cdf
parents:
diff changeset
75 } // spv = findspan (n, q, v, V);
be2ec0458410 separate oct files for low level functions
cdf
parents:
diff changeset
76
be2ec0458410 separate oct files for low level functions
cdf
parents:
diff changeset
77 newargs(3) = V; newargs(2) = q; newargs(1) = v; newargs(0) = spv;
be2ec0458410 separate oct files for low level functions
cdf
parents:
diff changeset
78 Matrix Jk = feval (std::string("numbasisfun"), newargs, 1)(0).matrix_value (); // Jk = numbasisfun (spv, v, q, V);
be2ec0458410 separate oct files for low level functions
cdf
parents:
diff changeset
79
be2ec0458410 separate oct files for low level functions
cdf
parents:
diff changeset
80 Matrix NuIkuk(npt, p+1, 0.0);
be2ec0458410 separate oct files for low level functions
cdf
parents:
diff changeset
81 for (octave_idx_type ii(0); ii < npt; ii++)
be2ec0458410 separate oct files for low level functions
cdf
parents:
diff changeset
82 {
be2ec0458410 separate oct files for low level functions
cdf
parents:
diff changeset
83 basisfun (int(spu(ii)), u(ii), p, U, M);
be2ec0458410 separate oct files for low level functions
cdf
parents:
diff changeset
84 NuIkuk.insert (M, ii, 0);
be2ec0458410 separate oct files for low level functions
cdf
parents:
diff changeset
85 } // NuIkuk = basisfun (spu, u, p, U);
be2ec0458410 separate oct files for low level functions
cdf
parents:
diff changeset
86
12672
59e8aae64812 prepare for release
cdf
parents: 12027
diff changeset
87 Matrix NvJkvk(v.numel (), q+1, 0.0);
5683
be2ec0458410 separate oct files for low level functions
cdf
parents:
diff changeset
88 for (octave_idx_type ii(0); ii < npt; ii++)
be2ec0458410 separate oct files for low level functions
cdf
parents:
diff changeset
89 {
be2ec0458410 separate oct files for low level functions
cdf
parents:
diff changeset
90 basisfun(int(spv(ii)), v(ii), q, V, N);
be2ec0458410 separate oct files for low level functions
cdf
parents:
diff changeset
91 NvJkvk.insert (N, ii, 0);
be2ec0458410 separate oct files for low level functions
cdf
parents:
diff changeset
92 } // NvJkvk = basisfun (spv, v, q, V);
be2ec0458410 separate oct files for low level functions
cdf
parents:
diff changeset
93
be2ec0458410 separate oct files for low level functions
cdf
parents:
diff changeset
94
be2ec0458410 separate oct files for low level functions
cdf
parents:
diff changeset
95 for (octave_idx_type k(0); k < npt; k++)
be2ec0458410 separate oct files for low level functions
cdf
parents:
diff changeset
96 for (octave_idx_type ii(0); ii < p+1; ii++)
be2ec0458410 separate oct files for low level functions
cdf
parents:
diff changeset
97 for (octave_idx_type jj(0); jj < q+1; jj++)
9923
00ad2879fd6b avoid compiler warning
cdf
parents: 8034
diff changeset
98 denom(k) += NuIkuk(k, ii) * NvJkvk(k, jj) *
00ad2879fd6b avoid compiler warning
cdf
parents: 8034
diff changeset
99 w(static_cast<octave_idx_type> (Ik(k, ii)),
00ad2879fd6b avoid compiler warning
cdf
parents: 8034
diff changeset
100 static_cast<octave_idx_type> (Jk(k, jj)));
5683
be2ec0458410 separate oct files for low level functions
cdf
parents:
diff changeset
101
be2ec0458410 separate oct files for low level functions
cdf
parents:
diff changeset
102
be2ec0458410 separate oct files for low level functions
cdf
parents:
diff changeset
103 for (octave_idx_type k(0); k < npt; k++)
be2ec0458410 separate oct files for low level functions
cdf
parents:
diff changeset
104 for (octave_idx_type ii(0); ii < p+1; ii++)
be2ec0458410 separate oct files for low level functions
cdf
parents:
diff changeset
105 for (octave_idx_type jj(0); jj < q+1; jj++)
be2ec0458410 separate oct files for low level functions
cdf
parents:
diff changeset
106 {
9923
00ad2879fd6b avoid compiler warning
cdf
parents: 8034
diff changeset
107
00ad2879fd6b avoid compiler warning
cdf
parents: 8034
diff changeset
108 RIkJk(k, octave_idx_type(ii+(p+1)*jj)) = NuIkuk(k, ii) * NvJkvk(k, jj) *
00ad2879fd6b avoid compiler warning
cdf
parents: 8034
diff changeset
109 w(static_cast<octave_idx_type> (Ik(k, ii)), static_cast<octave_idx_type> (Jk(k, jj)))
00ad2879fd6b avoid compiler warning
cdf
parents: 8034
diff changeset
110 / denom(k);
00ad2879fd6b avoid compiler warning
cdf
parents: 8034
diff changeset
111
00ad2879fd6b avoid compiler warning
cdf
parents: 8034
diff changeset
112 indIkJk(k, octave_idx_type(ii+(p+1)*jj))= Ik(k, ii) + (m+1) * Jk(k, jj) + 1;
5683
be2ec0458410 separate oct files for low level functions
cdf
parents:
diff changeset
113 }
be2ec0458410 separate oct files for low level functions
cdf
parents:
diff changeset
114
be2ec0458410 separate oct files for low level functions
cdf
parents:
diff changeset
115 // for k=1:npt
be2ec0458410 separate oct files for low level functions
cdf
parents:
diff changeset
116 // [Jkb, Ika] = meshgrid(Jk(k, :), Ik(k, :));
be2ec0458410 separate oct files for low level functions
cdf
parents:
diff changeset
117 // indIkJk(k, :) = sub2ind([m+1, n+1], Ika(:)+1, Jkb(:)+1);
be2ec0458410 separate oct files for low level functions
cdf
parents:
diff changeset
118 // wIkaJkb(1:p+1, 1:q+1) = reshape (w(indIkJk(k, :)), p+1, q+1);
be2ec0458410 separate oct files for low level functions
cdf
parents:
diff changeset
119
be2ec0458410 separate oct files for low level functions
cdf
parents:
diff changeset
120 // NuIkukaNvJkvk(1:p+1, 1:q+1) = (NuIkuk(k, :).' * NvJkvk(k, :));
be2ec0458410 separate oct files for low level functions
cdf
parents:
diff changeset
121 // RIkJk(k, :) = (NuIkukaNvJkvk .* wIkaJkb ./ sum(sum(NuIkukaNvJkvk .* wIkaJkb)))(:).';
be2ec0458410 separate oct files for low level functions
cdf
parents:
diff changeset
122 // end
be2ec0458410 separate oct files for low level functions
cdf
parents:
diff changeset
123
be2ec0458410 separate oct files for low level functions
cdf
parents:
diff changeset
124 retval(0) = RIkJk; // B = RIkJk;
be2ec0458410 separate oct files for low level functions
cdf
parents:
diff changeset
125 retval(1) = indIkJk; // N = indIkJk;
be2ec0458410 separate oct files for low level functions
cdf
parents:
diff changeset
126
be2ec0458410 separate oct files for low level functions
cdf
parents:
diff changeset
127 }
be2ec0458410 separate oct files for low level functions
cdf
parents:
diff changeset
128 return retval;
be2ec0458410 separate oct files for low level functions
cdf
parents:
diff changeset
129 }