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

prepare for release
author cdf
date Mon, 17 Aug 2015 10:23:44 +0000
parents 37d08939bb7b
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: 5683
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: 9760
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: 5683
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: 5683
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 "low_level_functions.h"
7966
6e8d45e45fbf prepare for release
cdf
parents: 7203
diff changeset
19 #include <omp.h>
5683
be2ec0458410 separate oct files for low level functions
cdf
parents:
diff changeset
20
be2ec0458410 separate oct files for low level functions
cdf
parents:
diff changeset
21 static bool bspeval_bad_arguments(const octave_value_list& args);
be2ec0458410 separate oct files for low level functions
cdf
parents:
diff changeset
22
be2ec0458410 separate oct files for low level functions
cdf
parents:
diff changeset
23 DEFUN_DLD(bspeval, args, nargout,"\
be2ec0458410 separate oct files for low level functions
cdf
parents:
diff changeset
24 BSPEVAL: Evaluate B-Spline at parametric points\n\
be2ec0458410 separate oct files for low level functions
cdf
parents:
diff changeset
25 \n\
be2ec0458410 separate oct files for low level functions
cdf
parents:
diff changeset
26 \n\
be2ec0458410 separate oct files for low level functions
cdf
parents:
diff changeset
27 Calling Sequence:\n\
be2ec0458410 separate oct files for low level functions
cdf
parents:
diff changeset
28 \n\
be2ec0458410 separate oct files for low level functions
cdf
parents:
diff changeset
29 p = bspeval(d,c,k,u)\n\
be2ec0458410 separate oct files for low level functions
cdf
parents:
diff changeset
30 \n\
be2ec0458410 separate oct files for low level functions
cdf
parents:
diff changeset
31 INPUT:\n\
be2ec0458410 separate oct files for low level functions
cdf
parents:
diff changeset
32 \n\
be2ec0458410 separate oct files for low level functions
cdf
parents:
diff changeset
33 d - Degree of the B-Spline.\n\
be2ec0458410 separate oct files for low level functions
cdf
parents:
diff changeset
34 c - Control Points, matrix of size (dim,nc).\n\
be2ec0458410 separate oct files for low level functions
cdf
parents:
diff changeset
35 k - Knot sequence, row vector of size nk.\n\
be2ec0458410 separate oct files for low level functions
cdf
parents:
diff changeset
36 u - Parametric evaluation points, row vector of size nu.\n\
be2ec0458410 separate oct files for low level functions
cdf
parents:
diff changeset
37 \n\
be2ec0458410 separate oct files for low level functions
cdf
parents:
diff changeset
38 OUTPUT:\n\
be2ec0458410 separate oct files for low level functions
cdf
parents:
diff changeset
39 \n\
be2ec0458410 separate oct files for low level functions
cdf
parents:
diff changeset
40 p - Evaluated points, matrix of size (dim,nu)\n\
be2ec0458410 separate oct files for low level functions
cdf
parents:
diff changeset
41 ")
be2ec0458410 separate oct files for low level functions
cdf
parents:
diff changeset
42 {
be2ec0458410 separate oct files for low level functions
cdf
parents:
diff changeset
43
be2ec0458410 separate oct files for low level functions
cdf
parents:
diff changeset
44 octave_value_list retval;
7203
6a063e3b1dde removed warnings
cdf
parents: 6958
diff changeset
45 if (!bspeval_bad_arguments (args))
6a063e3b1dde removed warnings
cdf
parents: 6958
diff changeset
46 {
9760
801e6ee8521b omp fix
cdf
parents: 7966
diff changeset
47 int d = args(0).int_value();
801e6ee8521b omp fix
cdf
parents: 7966
diff changeset
48 Matrix c = args(1).matrix_value();
801e6ee8521b omp fix
cdf
parents: 7966
diff changeset
49 RowVector k = args(2).row_vector_value();
801e6ee8521b omp fix
cdf
parents: 7966
diff changeset
50 NDArray u = args(3).array_value();
7203
6a063e3b1dde removed warnings
cdf
parents: 6958
diff changeset
51
12672
59e8aae64812 prepare for release
cdf
parents: 11634
diff changeset
52 octave_idx_type nu = u.numel ();
7203
6a063e3b1dde removed warnings
cdf
parents: 6958
diff changeset
53 octave_idx_type mc = c.rows(),
6a063e3b1dde removed warnings
cdf
parents: 6958
diff changeset
54 nc = c.cols();
6a063e3b1dde removed warnings
cdf
parents: 6958
diff changeset
55
6a063e3b1dde removed warnings
cdf
parents: 6958
diff changeset
56 Matrix p(mc, nu, 0.0);
6a063e3b1dde removed warnings
cdf
parents: 6958
diff changeset
57
6a063e3b1dde removed warnings
cdf
parents: 6958
diff changeset
58 if (!error_state)
6a063e3b1dde removed warnings
cdf
parents: 6958
diff changeset
59 {
12672
59e8aae64812 prepare for release
cdf
parents: 11634
diff changeset
60 if (nc + d == k.numel () - 1)
7203
6a063e3b1dde removed warnings
cdf
parents: 6958
diff changeset
61 {
12672
59e8aae64812 prepare for release
cdf
parents: 11634
diff changeset
62 //#pragma omp parallel default (none) shared (d, c, k, u, nu, mc, nc, p)
7966
6e8d45e45fbf prepare for release
cdf
parents: 7203
diff changeset
63 {
6e8d45e45fbf prepare for release
cdf
parents: 7203
diff changeset
64 RowVector N(d+1,0.0);
6e8d45e45fbf prepare for release
cdf
parents: 7203
diff changeset
65 int s, tmp1;
6e8d45e45fbf prepare for release
cdf
parents: 7203
diff changeset
66 double tmp2;
12672
59e8aae64812 prepare for release
cdf
parents: 11634
diff changeset
67 //#pragma omp for
7966
6e8d45e45fbf prepare for release
cdf
parents: 7203
diff changeset
68 for (octave_idx_type col=0; col<nu; col++)
6e8d45e45fbf prepare for release
cdf
parents: 7203
diff changeset
69 {
6e8d45e45fbf prepare for release
cdf
parents: 7203
diff changeset
70 //printf ("thread %d, col %d\n", omp_get_thread_num (), col);
6e8d45e45fbf prepare for release
cdf
parents: 7203
diff changeset
71 s = findspan (nc-1, d, u(col), k);
6e8d45e45fbf prepare for release
cdf
parents: 7203
diff changeset
72 basisfun (s, u(col), d, k, N);
6e8d45e45fbf prepare for release
cdf
parents: 7203
diff changeset
73 tmp1 = s - d;
6e8d45e45fbf prepare for release
cdf
parents: 7203
diff changeset
74 for (octave_idx_type row(0); row<mc; row++)
6e8d45e45fbf prepare for release
cdf
parents: 7203
diff changeset
75 {
6e8d45e45fbf prepare for release
cdf
parents: 7203
diff changeset
76 tmp2 = 0.0;
6e8d45e45fbf prepare for release
cdf
parents: 7203
diff changeset
77 for ( octave_idx_type i(0); i<=d; i++)
6e8d45e45fbf prepare for release
cdf
parents: 7203
diff changeset
78 tmp2 += N(i)*c(row,tmp1+i);
6e8d45e45fbf prepare for release
cdf
parents: 7203
diff changeset
79 p(row,col) = tmp2;
6e8d45e45fbf prepare for release
cdf
parents: 7203
diff changeset
80 }
6e8d45e45fbf prepare for release
cdf
parents: 7203
diff changeset
81 }
6e8d45e45fbf prepare for release
cdf
parents: 7203
diff changeset
82 }// end omp
6e8d45e45fbf prepare for release
cdf
parents: 7203
diff changeset
83 }
7203
6a063e3b1dde removed warnings
cdf
parents: 6958
diff changeset
84 else
6a063e3b1dde removed warnings
cdf
parents: 6958
diff changeset
85 {
12672
59e8aae64812 prepare for release
cdf
parents: 11634
diff changeset
86 error("inconsistent bspline data, d + columns(c) != numel(k) - 1.");
7203
6a063e3b1dde removed warnings
cdf
parents: 6958
diff changeset
87 }
6a063e3b1dde removed warnings
cdf
parents: 6958
diff changeset
88 retval(0) = octave_value(p);
6a063e3b1dde removed warnings
cdf
parents: 6958
diff changeset
89 }
6a063e3b1dde removed warnings
cdf
parents: 6958
diff changeset
90 }
5683
be2ec0458410 separate oct files for low level functions
cdf
parents:
diff changeset
91 return retval;
be2ec0458410 separate oct files for low level functions
cdf
parents:
diff changeset
92 }
be2ec0458410 separate oct files for low level functions
cdf
parents:
diff changeset
93
7203
6a063e3b1dde removed warnings
cdf
parents: 6958
diff changeset
94 static bool bspeval_bad_arguments (const octave_value_list& args)
5683
be2ec0458410 separate oct files for low level functions
cdf
parents:
diff changeset
95 {
12672
59e8aae64812 prepare for release
cdf
parents: 11634
diff changeset
96 if (args.length () != 4)
5683
be2ec0458410 separate oct files for low level functions
cdf
parents:
diff changeset
97 {
7203
6a063e3b1dde removed warnings
cdf
parents: 6958
diff changeset
98 error("bspeval: wrong number of input arguments.");
5683
be2ec0458410 separate oct files for low level functions
cdf
parents:
diff changeset
99 return true;
be2ec0458410 separate oct files for low level functions
cdf
parents:
diff changeset
100 }
be2ec0458410 separate oct files for low level functions
cdf
parents:
diff changeset
101 if (!args(0).is_real_scalar())
be2ec0458410 separate oct files for low level functions
cdf
parents:
diff changeset
102 {
7203
6a063e3b1dde removed warnings
cdf
parents: 6958
diff changeset
103 error("bspeval: degree should be a scalar.");
5683
be2ec0458410 separate oct files for low level functions
cdf
parents:
diff changeset
104 return true;
be2ec0458410 separate oct files for low level functions
cdf
parents:
diff changeset
105 }
be2ec0458410 separate oct files for low level functions
cdf
parents:
diff changeset
106 if (!args(1).is_real_matrix())
be2ec0458410 separate oct files for low level functions
cdf
parents:
diff changeset
107 {
7203
6a063e3b1dde removed warnings
cdf
parents: 6958
diff changeset
108 error("bspeval: the control net should be a matrix of doubles.");
5683
be2ec0458410 separate oct files for low level functions
cdf
parents:
diff changeset
109 return true;
be2ec0458410 separate oct files for low level functions
cdf
parents:
diff changeset
110 }
be2ec0458410 separate oct files for low level functions
cdf
parents:
diff changeset
111 if (!args(2).is_real_matrix())
be2ec0458410 separate oct files for low level functions
cdf
parents:
diff changeset
112 {
7203
6a063e3b1dde removed warnings
cdf
parents: 6958
diff changeset
113 error("bspeval: the knot vector should be a real vector.");
5683
be2ec0458410 separate oct files for low level functions
cdf
parents:
diff changeset
114 return true;
be2ec0458410 separate oct files for low level functions
cdf
parents:
diff changeset
115 }
be2ec0458410 separate oct files for low level functions
cdf
parents:
diff changeset
116 if (!args(3).is_real_type())
be2ec0458410 separate oct files for low level functions
cdf
parents:
diff changeset
117 {
7203
6a063e3b1dde removed warnings
cdf
parents: 6958
diff changeset
118 error("bspeval: the set of parametric points should be an array of doubles.");
5683
be2ec0458410 separate oct files for low level functions
cdf
parents:
diff changeset
119 return true;
be2ec0458410 separate oct files for low level functions
cdf
parents:
diff changeset
120 }
be2ec0458410 separate oct files for low level functions
cdf
parents:
diff changeset
121 return false;
be2ec0458410 separate oct files for low level functions
cdf
parents:
diff changeset
122 }