annotate extra/nurbs/src/tbasisfun.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
6958
23ff23c91d06 Slight modifications in the help
rafavzqz
parents: 6464
diff changeset
1 /* Copyright (C) 2009 Carlo de Falco
9403
2108d03d50de Fixed bug in 1D, added 3D case, added derivatives
rafavzqz
parents: 7204
diff changeset
2 Copyright (C) 2012 Rafael Vazquez
6958
23ff23c91d06 Slight modifications in the help
rafavzqz
parents: 6464
diff changeset
3
23ff23c91d06 Slight modifications in the help
rafavzqz
parents: 6464
diff changeset
4 This program is free software: you can redistribute it and/or modify
23ff23c91d06 Slight modifications in the help
rafavzqz
parents: 6464
diff changeset
5 it under the terms of the GNU General Public License as published by
11634
37d08939bb7b apply changes requested by David
cdf
parents: 10777
diff changeset
6 the Free Software Foundation, either version 3 of the License, or
6958
23ff23c91d06 Slight modifications in the help
rafavzqz
parents: 6464
diff changeset
7 (at your option) any later version.
6052
a30089ac3de9 surface derivatives
cdf
parents:
diff changeset
8
6958
23ff23c91d06 Slight modifications in the help
rafavzqz
parents: 6464
diff changeset
9 This program is distributed in the hope that it will be useful,
23ff23c91d06 Slight modifications in the help
rafavzqz
parents: 6464
diff changeset
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
23ff23c91d06 Slight modifications in the help
rafavzqz
parents: 6464
diff changeset
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
23ff23c91d06 Slight modifications in the help
rafavzqz
parents: 6464
diff changeset
12 GNU General Public License for more details.
6052
a30089ac3de9 surface derivatives
cdf
parents:
diff changeset
13
6958
23ff23c91d06 Slight modifications in the help
rafavzqz
parents: 6464
diff changeset
14 You should have received a copy of the GNU General Public License
23ff23c91d06 Slight modifications in the help
rafavzqz
parents: 6464
diff changeset
15 along with this program. If not, see <http://www.gnu.org/licenses/>.
6052
a30089ac3de9 surface derivatives
cdf
parents:
diff changeset
16 */
a30089ac3de9 surface derivatives
cdf
parents:
diff changeset
17
a30089ac3de9 surface derivatives
cdf
parents:
diff changeset
18 #include <octave/oct.h>
a30089ac3de9 surface derivatives
cdf
parents:
diff changeset
19 #include <iostream>
a30089ac3de9 surface derivatives
cdf
parents:
diff changeset
20
9610
c63293fe59a3 improved onebasisfunder__
cdf
parents: 9605
diff changeset
21 void onebasisfun__ (double u, octave_idx_type p, RowVector U, double *N)
6052
a30089ac3de9 surface derivatives
cdf
parents:
diff changeset
22 {
9610
c63293fe59a3 improved onebasisfunder__
cdf
parents: 9605
diff changeset
23 *N = 0.0;
9403
2108d03d50de Fixed bug in 1D, added 3D case, added derivatives
rafavzqz
parents: 7204
diff changeset
24 if ((u <= U.min ()) || ( u > U.max ()))
9610
c63293fe59a3 improved onebasisfunder__
cdf
parents: 9605
diff changeset
25 return;
6052
a30089ac3de9 surface derivatives
cdf
parents:
diff changeset
26 else if (p == 0)
9610
c63293fe59a3 improved onebasisfunder__
cdf
parents: 9605
diff changeset
27 {
c63293fe59a3 improved onebasisfunder__
cdf
parents: 9605
diff changeset
28 *N = 1.0;
c63293fe59a3 improved onebasisfunder__
cdf
parents: 9605
diff changeset
29 return;
9484
a4a172117b12 Changes to save time
rafavzqz
parents: 9406
diff changeset
30 }
9610
c63293fe59a3 improved onebasisfunder__
cdf
parents: 9605
diff changeset
31 else if (p == 1)
c63293fe59a3 improved onebasisfunder__
cdf
parents: 9605
diff changeset
32 {
c63293fe59a3 improved onebasisfunder__
cdf
parents: 9605
diff changeset
33 if (u < U(1))
c63293fe59a3 improved onebasisfunder__
cdf
parents: 9605
diff changeset
34 {
c63293fe59a3 improved onebasisfunder__
cdf
parents: 9605
diff changeset
35 *N = (u - U(0)) / (U(1) - U(0));
c63293fe59a3 improved onebasisfunder__
cdf
parents: 9605
diff changeset
36 return;
c63293fe59a3 improved onebasisfunder__
cdf
parents: 9605
diff changeset
37 }
c63293fe59a3 improved onebasisfunder__
cdf
parents: 9605
diff changeset
38 else
c63293fe59a3 improved onebasisfunder__
cdf
parents: 9605
diff changeset
39 {
c63293fe59a3 improved onebasisfunder__
cdf
parents: 9605
diff changeset
40 *N = (U(2) - u) / (U(2) - U(1));
c63293fe59a3 improved onebasisfunder__
cdf
parents: 9605
diff changeset
41 return;
c63293fe59a3 improved onebasisfunder__
cdf
parents: 9605
diff changeset
42 }
9484
a4a172117b12 Changes to save time
rafavzqz
parents: 9406
diff changeset
43 }
9610
c63293fe59a3 improved onebasisfunder__
cdf
parents: 9605
diff changeset
44 else if (p == 2)
c63293fe59a3 improved onebasisfunder__
cdf
parents: 9605
diff changeset
45 {
c63293fe59a3 improved onebasisfunder__
cdf
parents: 9605
diff changeset
46 double ln = u - U(0);
c63293fe59a3 improved onebasisfunder__
cdf
parents: 9605
diff changeset
47 double dn = U(3) - u;
c63293fe59a3 improved onebasisfunder__
cdf
parents: 9605
diff changeset
48 double ld = U(2) - U(0);
c63293fe59a3 improved onebasisfunder__
cdf
parents: 9605
diff changeset
49 double dd = U(3) - U(1);
c63293fe59a3 improved onebasisfunder__
cdf
parents: 9605
diff changeset
50 if (u < U(1))
c63293fe59a3 improved onebasisfunder__
cdf
parents: 9605
diff changeset
51 {
c63293fe59a3 improved onebasisfunder__
cdf
parents: 9605
diff changeset
52 *N = ln*ln / (ld * (U(1) - U(0)));
c63293fe59a3 improved onebasisfunder__
cdf
parents: 9605
diff changeset
53 return;
c63293fe59a3 improved onebasisfunder__
cdf
parents: 9605
diff changeset
54 }
c63293fe59a3 improved onebasisfunder__
cdf
parents: 9605
diff changeset
55 else if (u > U(2))
c63293fe59a3 improved onebasisfunder__
cdf
parents: 9605
diff changeset
56 {
c63293fe59a3 improved onebasisfunder__
cdf
parents: 9605
diff changeset
57 *N = dn*dn / (dd * (U(3) - U(2)));
c63293fe59a3 improved onebasisfunder__
cdf
parents: 9605
diff changeset
58 return;
c63293fe59a3 improved onebasisfunder__
cdf
parents: 9605
diff changeset
59 }
c63293fe59a3 improved onebasisfunder__
cdf
parents: 9605
diff changeset
60 else
c63293fe59a3 improved onebasisfunder__
cdf
parents: 9605
diff changeset
61 {
c63293fe59a3 improved onebasisfunder__
cdf
parents: 9605
diff changeset
62 if (ld != 0)
c63293fe59a3 improved onebasisfunder__
cdf
parents: 9605
diff changeset
63 *N += ln * (U(2) - u) / ((U(2) - U(1)) * ld);
c63293fe59a3 improved onebasisfunder__
cdf
parents: 9605
diff changeset
64
c63293fe59a3 improved onebasisfunder__
cdf
parents: 9605
diff changeset
65 if (dd != 0)
c63293fe59a3 improved onebasisfunder__
cdf
parents: 9605
diff changeset
66 *N += dn * (u - U(1)) / ((U(2) - U(1)) * dd);
c63293fe59a3 improved onebasisfunder__
cdf
parents: 9605
diff changeset
67 return;
c63293fe59a3 improved onebasisfunder__
cdf
parents: 9605
diff changeset
68 }
9484
a4a172117b12 Changes to save time
rafavzqz
parents: 9406
diff changeset
69 }
6052
a30089ac3de9 surface derivatives
cdf
parents:
diff changeset
70
a30089ac3de9 surface derivatives
cdf
parents:
diff changeset
71 double ln = u - U(0);
12672
59e8aae64812 prepare for release
cdf
parents: 11634
diff changeset
72 double ld = U(U.numel () - 2) - U(0);
6052
a30089ac3de9 surface derivatives
cdf
parents:
diff changeset
73 if (ld != 0)
9610
c63293fe59a3 improved onebasisfunder__
cdf
parents: 9605
diff changeset
74 {
c63293fe59a3 improved onebasisfunder__
cdf
parents: 9605
diff changeset
75 double tmp;
12672
59e8aae64812 prepare for release
cdf
parents: 11634
diff changeset
76 onebasisfun__ (u, p-1, U.extract (0, U.numel () - 2), &tmp);
9610
c63293fe59a3 improved onebasisfunder__
cdf
parents: 9605
diff changeset
77 *N += ln * tmp / ld;
c63293fe59a3 improved onebasisfunder__
cdf
parents: 9605
diff changeset
78 }
12672
59e8aae64812 prepare for release
cdf
parents: 11634
diff changeset
79 double dn = U(U.numel () - 1) - u;
59e8aae64812 prepare for release
cdf
parents: 11634
diff changeset
80 double dd = U(U.numel () - 1) - U(1);
6052
a30089ac3de9 surface derivatives
cdf
parents:
diff changeset
81 if (dd != 0)
9610
c63293fe59a3 improved onebasisfunder__
cdf
parents: 9605
diff changeset
82 {
c63293fe59a3 improved onebasisfunder__
cdf
parents: 9605
diff changeset
83 double tmp;
12672
59e8aae64812 prepare for release
cdf
parents: 11634
diff changeset
84 onebasisfun__ (u, p-1, U.extract (1, U.numel () - 1), &tmp);
9610
c63293fe59a3 improved onebasisfunder__
cdf
parents: 9605
diff changeset
85 *N += dn * tmp / dd;
c63293fe59a3 improved onebasisfunder__
cdf
parents: 9605
diff changeset
86 }
c63293fe59a3 improved onebasisfunder__
cdf
parents: 9605
diff changeset
87 return;
6052
a30089ac3de9 surface derivatives
cdf
parents:
diff changeset
88 }
a30089ac3de9 surface derivatives
cdf
parents:
diff changeset
89
10766
f1cb2286c7ef simple overloaded method
cdf
parents: 9610
diff changeset
90 void onebasisfun__ (double u, double p, RowVector U, double *N)
f1cb2286c7ef simple overloaded method
cdf
parents: 9610
diff changeset
91 { onebasisfun__ (u, static_cast<octave_idx_type> (p), U, N); }
9403
2108d03d50de Fixed bug in 1D, added 3D case, added derivatives
rafavzqz
parents: 7204
diff changeset
92
9610
c63293fe59a3 improved onebasisfunder__
cdf
parents: 9605
diff changeset
93 void onebasisfunder__ (double u, octave_idx_type p, RowVector U, double *N, double *Nder)
9403
2108d03d50de Fixed bug in 1D, added 3D case, added derivatives
rafavzqz
parents: 7204
diff changeset
94 {
9610
c63293fe59a3 improved onebasisfunder__
cdf
parents: 9605
diff changeset
95 double aux;
10777
7277ff03a3d7 Small changes
rafavzqz
parents: 10766
diff changeset
96 *N = 0.0; *Nder = 0.0;
7277ff03a3d7 Small changes
rafavzqz
parents: 10766
diff changeset
97 if ((u <= U.min ()) || ( u > U.max ()))
9610
c63293fe59a3 improved onebasisfunder__
cdf
parents: 9605
diff changeset
98 return;
10777
7277ff03a3d7 Small changes
rafavzqz
parents: 10766
diff changeset
99 else if (p == 0)
7277ff03a3d7 Small changes
rafavzqz
parents: 10766
diff changeset
100 {
7277ff03a3d7 Small changes
rafavzqz
parents: 10766
diff changeset
101 *N = 1.0;
7277ff03a3d7 Small changes
rafavzqz
parents: 10766
diff changeset
102 *Nder = 0.0;
9610
c63293fe59a3 improved onebasisfunder__
cdf
parents: 9605
diff changeset
103 return;
10777
7277ff03a3d7 Small changes
rafavzqz
parents: 10766
diff changeset
104 }
7277ff03a3d7 Small changes
rafavzqz
parents: 10766
diff changeset
105 else {
7277ff03a3d7 Small changes
rafavzqz
parents: 10766
diff changeset
106 double ln = u - U(0);
12672
59e8aae64812 prepare for release
cdf
parents: 11634
diff changeset
107 double ld = U(U.numel () - 2) - U(0);
10777
7277ff03a3d7 Small changes
rafavzqz
parents: 10766
diff changeset
108
7277ff03a3d7 Small changes
rafavzqz
parents: 10766
diff changeset
109 if (ld != 0)
9610
c63293fe59a3 improved onebasisfunder__
cdf
parents: 9605
diff changeset
110 {
12672
59e8aae64812 prepare for release
cdf
parents: 11634
diff changeset
111 onebasisfun__ (u, p-1, U.extract (0, U.numel () - 2), &aux);
10777
7277ff03a3d7 Small changes
rafavzqz
parents: 10766
diff changeset
112 aux = aux / ld;
7277ff03a3d7 Small changes
rafavzqz
parents: 10766
diff changeset
113 *N += ln * aux;
7277ff03a3d7 Small changes
rafavzqz
parents: 10766
diff changeset
114 *Nder += p * aux;
7277ff03a3d7 Small changes
rafavzqz
parents: 10766
diff changeset
115 }
9403
2108d03d50de Fixed bug in 1D, added 3D case, added derivatives
rafavzqz
parents: 7204
diff changeset
116
12672
59e8aae64812 prepare for release
cdf
parents: 11634
diff changeset
117 double dn = U(U.numel () - 1) - u;
59e8aae64812 prepare for release
cdf
parents: 11634
diff changeset
118 double dd = U(U.numel () - 1) - U(1);
10777
7277ff03a3d7 Small changes
rafavzqz
parents: 10766
diff changeset
119
7277ff03a3d7 Small changes
rafavzqz
parents: 10766
diff changeset
120 if (dd != 0)
9610
c63293fe59a3 improved onebasisfunder__
cdf
parents: 9605
diff changeset
121 {
12672
59e8aae64812 prepare for release
cdf
parents: 11634
diff changeset
122 onebasisfun__ (u, p-1, U.extract (1, U.numel () - 1), &aux);
9610
c63293fe59a3 improved onebasisfunder__
cdf
parents: 9605
diff changeset
123 aux = aux / dd;
c63293fe59a3 improved onebasisfunder__
cdf
parents: 9605
diff changeset
124 *N += dn *aux;
c63293fe59a3 improved onebasisfunder__
cdf
parents: 9605
diff changeset
125 *Nder -= p * aux;
c63293fe59a3 improved onebasisfunder__
cdf
parents: 9605
diff changeset
126 }
9403
2108d03d50de Fixed bug in 1D, added 3D case, added derivatives
rafavzqz
parents: 7204
diff changeset
127 }
2108d03d50de Fixed bug in 1D, added 3D case, added derivatives
rafavzqz
parents: 7204
diff changeset
128 }
6052
a30089ac3de9 surface derivatives
cdf
parents:
diff changeset
129
9405
869d0f838b63 Fixed the function name
rafavzqz
parents: 9403
diff changeset
130 DEFUN_DLD(tbasisfun, args, nargout,"\
9403
2108d03d50de Fixed bug in 1D, added 3D case, added derivatives
rafavzqz
parents: 7204
diff changeset
131 TBASISFUN: Compute a B- or T-Spline basis function, and its derivatives, from its local knot vector.\n\
6464
53d47faf74bf fixed test failures
cdf
parents: 6052
diff changeset
132 \n\
6052
a30089ac3de9 surface derivatives
cdf
parents:
diff changeset
133 usage:\n\
a30089ac3de9 surface derivatives
cdf
parents:
diff changeset
134 \n\
9403
2108d03d50de Fixed bug in 1D, added 3D case, added derivatives
rafavzqz
parents: 7204
diff changeset
135 [N, Nder] = tbasisfun (u, p, U)\n\
2108d03d50de Fixed bug in 1D, added 3D case, added derivatives
rafavzqz
parents: 7204
diff changeset
136 [N, Nder] = tbasisfun ([u; v], [p q], {U, V})\n\
2108d03d50de Fixed bug in 1D, added 3D case, added derivatives
rafavzqz
parents: 7204
diff changeset
137 [N, Nder] = tbasisfun ([u; v; w], [p q r], {U, V, W})\n\
6052
a30089ac3de9 surface derivatives
cdf
parents:
diff changeset
138 \n\
a30089ac3de9 surface derivatives
cdf
parents:
diff changeset
139 INPUT:\n\
a30089ac3de9 surface derivatives
cdf
parents:
diff changeset
140 u or [u; v] : points in parameter space where the basis function is to be\n\
a30089ac3de9 surface derivatives
cdf
parents:
diff changeset
141 evaluated \n\
a30089ac3de9 surface derivatives
cdf
parents:
diff changeset
142 \n\
a30089ac3de9 surface derivatives
cdf
parents:
diff changeset
143 U or {U, V} : local knot vector\n\
a30089ac3de9 surface derivatives
cdf
parents:
diff changeset
144 \n\
9403
2108d03d50de Fixed bug in 1D, added 3D case, added derivatives
rafavzqz
parents: 7204
diff changeset
145 p or [p q] : polynomial order of the basis function\n\
6052
a30089ac3de9 surface derivatives
cdf
parents:
diff changeset
146 \n\
a30089ac3de9 surface derivatives
cdf
parents:
diff changeset
147 OUTPUT:\n\
9403
2108d03d50de Fixed bug in 1D, added 3D case, added derivatives
rafavzqz
parents: 7204
diff changeset
148 N : basis function evaluated at the given parametric points\n\
2108d03d50de Fixed bug in 1D, added 3D case, added derivatives
rafavzqz
parents: 7204
diff changeset
149 Nder : gradient of the basis function evaluated at the given points\n")
6052
a30089ac3de9 surface derivatives
cdf
parents:
diff changeset
150
a30089ac3de9 surface derivatives
cdf
parents:
diff changeset
151 {
a30089ac3de9 surface derivatives
cdf
parents:
diff changeset
152
7204
937278c100fd removed warnings
cdf
parents: 6958
diff changeset
153 octave_value_list retval;
6052
a30089ac3de9 surface derivatives
cdf
parents:
diff changeset
154 Matrix u = args(0).matrix_value ();
a30089ac3de9 surface derivatives
cdf
parents:
diff changeset
155
9403
2108d03d50de Fixed bug in 1D, added 3D case, added derivatives
rafavzqz
parents: 7204
diff changeset
156 RowVector N(u.cols ());
9610
c63293fe59a3 improved onebasisfunder__
cdf
parents: 9605
diff changeset
157 double *Nptr = N.fortran_vec ();
c63293fe59a3 improved onebasisfunder__
cdf
parents: 9605
diff changeset
158
6052
a30089ac3de9 surface derivatives
cdf
parents:
diff changeset
159 if (! args(2).is_cell ())
a30089ac3de9 surface derivatives
cdf
parents:
diff changeset
160 {
a30089ac3de9 surface derivatives
cdf
parents:
diff changeset
161
a30089ac3de9 surface derivatives
cdf
parents:
diff changeset
162 double p = args(1).idx_type_value ();
a30089ac3de9 surface derivatives
cdf
parents:
diff changeset
163 RowVector U = args(2).row_vector_value (true, true);
a30089ac3de9 surface derivatives
cdf
parents:
diff changeset
164 assert (U.numel () == p+2);
a30089ac3de9 surface derivatives
cdf
parents:
diff changeset
165
9610
c63293fe59a3 improved onebasisfunder__
cdf
parents: 9605
diff changeset
166 if (nargout == 1)
c63293fe59a3 improved onebasisfunder__
cdf
parents: 9605
diff changeset
167 for (octave_idx_type ii = 0; ii < u.numel (); ii++)
c63293fe59a3 improved onebasisfunder__
cdf
parents: 9605
diff changeset
168 onebasisfun__ (u(ii), p, U, &(Nptr[ii]));
6052
a30089ac3de9 surface derivatives
cdf
parents:
diff changeset
169
9610
c63293fe59a3 improved onebasisfunder__
cdf
parents: 9605
diff changeset
170 if (nargout == 2)
c63293fe59a3 improved onebasisfunder__
cdf
parents: 9605
diff changeset
171 {
c63293fe59a3 improved onebasisfunder__
cdf
parents: 9605
diff changeset
172 RowVector Nder(u.cols ());
c63293fe59a3 improved onebasisfunder__
cdf
parents: 9605
diff changeset
173 double *Nderptr = Nder.fortran_vec ();
9403
2108d03d50de Fixed bug in 1D, added 3D case, added derivatives
rafavzqz
parents: 7204
diff changeset
174
9610
c63293fe59a3 improved onebasisfunder__
cdf
parents: 9605
diff changeset
175 for (octave_idx_type ii=0; ii<u.numel (); ii++)
c63293fe59a3 improved onebasisfunder__
cdf
parents: 9605
diff changeset
176 onebasisfunder__ (u(ii), p, U, &(Nptr[ii]), &(Nderptr[ii]));
9403
2108d03d50de Fixed bug in 1D, added 3D case, added derivatives
rafavzqz
parents: 7204
diff changeset
177
9610
c63293fe59a3 improved onebasisfunder__
cdf
parents: 9605
diff changeset
178 retval(1) = Nder;
c63293fe59a3 improved onebasisfunder__
cdf
parents: 9605
diff changeset
179 }
c63293fe59a3 improved onebasisfunder__
cdf
parents: 9605
diff changeset
180 }
c63293fe59a3 improved onebasisfunder__
cdf
parents: 9605
diff changeset
181 else
c63293fe59a3 improved onebasisfunder__
cdf
parents: 9605
diff changeset
182 {
c63293fe59a3 improved onebasisfunder__
cdf
parents: 9605
diff changeset
183 RowVector p = args(1).row_vector_value ();
12672
59e8aae64812 prepare for release
cdf
parents: 11634
diff changeset
184 if (p.numel () == 2)
9610
c63293fe59a3 improved onebasisfunder__
cdf
parents: 9605
diff changeset
185 {
c63293fe59a3 improved onebasisfunder__
cdf
parents: 9605
diff changeset
186 Cell C = args(2).cell_value ();
c63293fe59a3 improved onebasisfunder__
cdf
parents: 9605
diff changeset
187 RowVector U = C(0).row_vector_value (true, true);
c63293fe59a3 improved onebasisfunder__
cdf
parents: 9605
diff changeset
188 RowVector V = C(1).row_vector_value (true, true);
c63293fe59a3 improved onebasisfunder__
cdf
parents: 9605
diff changeset
189
c63293fe59a3 improved onebasisfunder__
cdf
parents: 9605
diff changeset
190 if (nargout == 1)
c63293fe59a3 improved onebasisfunder__
cdf
parents: 9605
diff changeset
191 {
c63293fe59a3 improved onebasisfunder__
cdf
parents: 9605
diff changeset
192 for (octave_idx_type ii=0; ii<u.cols (); ii++)
c63293fe59a3 improved onebasisfunder__
cdf
parents: 9605
diff changeset
193 {
c63293fe59a3 improved onebasisfunder__
cdf
parents: 9605
diff changeset
194 double Nu, Nv;
c63293fe59a3 improved onebasisfunder__
cdf
parents: 9605
diff changeset
195 onebasisfun__ (u(0, ii), octave_idx_type(p(0)), U, &Nu);
c63293fe59a3 improved onebasisfunder__
cdf
parents: 9605
diff changeset
196 onebasisfun__ (u(1, ii), octave_idx_type(p(1)), V, &Nv);
c63293fe59a3 improved onebasisfunder__
cdf
parents: 9605
diff changeset
197 Nptr[ii] = Nu * Nv;
c63293fe59a3 improved onebasisfunder__
cdf
parents: 9605
diff changeset
198 }
c63293fe59a3 improved onebasisfunder__
cdf
parents: 9605
diff changeset
199 }
c63293fe59a3 improved onebasisfunder__
cdf
parents: 9605
diff changeset
200 else if (nargout == 2)
c63293fe59a3 improved onebasisfunder__
cdf
parents: 9605
diff changeset
201 {
c63293fe59a3 improved onebasisfunder__
cdf
parents: 9605
diff changeset
202 double Nu, Nv, Ndu, Ndv;
c63293fe59a3 improved onebasisfunder__
cdf
parents: 9605
diff changeset
203 Matrix Nder (2, u.cols());
c63293fe59a3 improved onebasisfunder__
cdf
parents: 9605
diff changeset
204 double *Nderptr = Nder.fortran_vec ();
c63293fe59a3 improved onebasisfunder__
cdf
parents: 9605
diff changeset
205 for (octave_idx_type ii = 0; ii < u.cols (); ii++)
c63293fe59a3 improved onebasisfunder__
cdf
parents: 9605
diff changeset
206 {
c63293fe59a3 improved onebasisfunder__
cdf
parents: 9605
diff changeset
207 onebasisfunder__ (u(0, ii), octave_idx_type(p(0)), U, &Nu, &Ndu);
c63293fe59a3 improved onebasisfunder__
cdf
parents: 9605
diff changeset
208 onebasisfunder__ (u(1, ii), octave_idx_type(p(1)), V, &Nv, &Ndv);
c63293fe59a3 improved onebasisfunder__
cdf
parents: 9605
diff changeset
209 Nptr[ii] = Nu * Nv;
c63293fe59a3 improved onebasisfunder__
cdf
parents: 9605
diff changeset
210
c63293fe59a3 improved onebasisfunder__
cdf
parents: 9605
diff changeset
211 Nderptr[0 + (2 * ii)] = Ndu * Nv;
c63293fe59a3 improved onebasisfunder__
cdf
parents: 9605
diff changeset
212 Nderptr[1 + (2 * ii)] = Ndv * Nu;
c63293fe59a3 improved onebasisfunder__
cdf
parents: 9605
diff changeset
213 }
c63293fe59a3 improved onebasisfunder__
cdf
parents: 9605
diff changeset
214 retval(1) = Nder;
c63293fe59a3 improved onebasisfunder__
cdf
parents: 9605
diff changeset
215 }
c63293fe59a3 improved onebasisfunder__
cdf
parents: 9605
diff changeset
216
c63293fe59a3 improved onebasisfunder__
cdf
parents: 9605
diff changeset
217 }
12672
59e8aae64812 prepare for release
cdf
parents: 11634
diff changeset
218 else if (p.numel () == 3)
9610
c63293fe59a3 improved onebasisfunder__
cdf
parents: 9605
diff changeset
219 {
c63293fe59a3 improved onebasisfunder__
cdf
parents: 9605
diff changeset
220 Cell C = args(2).cell_value ();
c63293fe59a3 improved onebasisfunder__
cdf
parents: 9605
diff changeset
221 RowVector U = C(0).row_vector_value (true, true);
c63293fe59a3 improved onebasisfunder__
cdf
parents: 9605
diff changeset
222 RowVector V = C(1).row_vector_value (true, true);
c63293fe59a3 improved onebasisfunder__
cdf
parents: 9605
diff changeset
223 RowVector W = C(2).row_vector_value (true, true);
c63293fe59a3 improved onebasisfunder__
cdf
parents: 9605
diff changeset
224
c63293fe59a3 improved onebasisfunder__
cdf
parents: 9605
diff changeset
225 if (nargout == 1)
c63293fe59a3 improved onebasisfunder__
cdf
parents: 9605
diff changeset
226 {
c63293fe59a3 improved onebasisfunder__
cdf
parents: 9605
diff changeset
227 for (octave_idx_type ii = 0; ii < u.cols (); ii++)
c63293fe59a3 improved onebasisfunder__
cdf
parents: 9605
diff changeset
228 {
c63293fe59a3 improved onebasisfunder__
cdf
parents: 9605
diff changeset
229 double Nu, Nv, Nw;
c63293fe59a3 improved onebasisfunder__
cdf
parents: 9605
diff changeset
230 onebasisfun__ (u(0, ii), octave_idx_type(p(0)), U, &Nu);
c63293fe59a3 improved onebasisfunder__
cdf
parents: 9605
diff changeset
231 onebasisfun__ (u(1, ii), octave_idx_type(p(1)), V, &Nv);
c63293fe59a3 improved onebasisfunder__
cdf
parents: 9605
diff changeset
232 onebasisfun__ (u(2, ii), octave_idx_type(p(2)), W, &Nw);
c63293fe59a3 improved onebasisfunder__
cdf
parents: 9605
diff changeset
233 Nptr[ii] = Nu * Nv * Nw;
c63293fe59a3 improved onebasisfunder__
cdf
parents: 9605
diff changeset
234 }
c63293fe59a3 improved onebasisfunder__
cdf
parents: 9605
diff changeset
235 }
c63293fe59a3 improved onebasisfunder__
cdf
parents: 9605
diff changeset
236 else if (nargout == 2)
c63293fe59a3 improved onebasisfunder__
cdf
parents: 9605
diff changeset
237 {
c63293fe59a3 improved onebasisfunder__
cdf
parents: 9605
diff changeset
238 double Nu, Nv, Nw, Ndu, Ndv, Ndw;
c63293fe59a3 improved onebasisfunder__
cdf
parents: 9605
diff changeset
239 Matrix Nder (3, u.cols());
c63293fe59a3 improved onebasisfunder__
cdf
parents: 9605
diff changeset
240 double *Nderptr = Nder.fortran_vec ();
c63293fe59a3 improved onebasisfunder__
cdf
parents: 9605
diff changeset
241 for (octave_idx_type ii=0; ii<u.cols (); ii++)
c63293fe59a3 improved onebasisfunder__
cdf
parents: 9605
diff changeset
242 {
c63293fe59a3 improved onebasisfunder__
cdf
parents: 9605
diff changeset
243 onebasisfunder__ (u(0, ii), octave_idx_type(p(0)), U, &Nu, &Ndu);
c63293fe59a3 improved onebasisfunder__
cdf
parents: 9605
diff changeset
244 onebasisfunder__ (u(1, ii), octave_idx_type(p(1)), V, &Nv, &Ndv);
c63293fe59a3 improved onebasisfunder__
cdf
parents: 9605
diff changeset
245 onebasisfunder__ (u(2, ii), octave_idx_type(p(2)), W, &Nw, &Ndw);
c63293fe59a3 improved onebasisfunder__
cdf
parents: 9605
diff changeset
246 Nptr[ii] = Nu * Nv * Nw;
c63293fe59a3 improved onebasisfunder__
cdf
parents: 9605
diff changeset
247 Nderptr[0 + (3 * ii)] = Ndu * Nv * Nw;
c63293fe59a3 improved onebasisfunder__
cdf
parents: 9605
diff changeset
248 Nderptr[1 + (3 * ii)] = Ndv * Nu * Nw;
c63293fe59a3 improved onebasisfunder__
cdf
parents: 9605
diff changeset
249 Nderptr[2 + (3 * ii)] = Ndw * Nu * Nv;
c63293fe59a3 improved onebasisfunder__
cdf
parents: 9605
diff changeset
250 }
c63293fe59a3 improved onebasisfunder__
cdf
parents: 9605
diff changeset
251 retval(1) = Nder;
9403
2108d03d50de Fixed bug in 1D, added 3D case, added derivatives
rafavzqz
parents: 7204
diff changeset
252 }
9610
c63293fe59a3 improved onebasisfunder__
cdf
parents: 9605
diff changeset
253
9605
4fa3d0a20d75 Fixed the bug. Still to improve onebasisfunder__
rafavzqz
parents: 9600
diff changeset
254 }
9403
2108d03d50de Fixed bug in 1D, added 3D case, added derivatives
rafavzqz
parents: 7204
diff changeset
255 }
2108d03d50de Fixed bug in 1D, added 3D case, added derivatives
rafavzqz
parents: 7204
diff changeset
256 retval(0) = octave_value (N);
7204
937278c100fd removed warnings
cdf
parents: 6958
diff changeset
257 return retval;
6052
a30089ac3de9 surface derivatives
cdf
parents:
diff changeset
258 }
9406
ba58ac060a76 Added some simple tests
rafavzqz
parents: 9405
diff changeset
259
ba58ac060a76 Added some simple tests
rafavzqz
parents: 9405
diff changeset
260 /*
ba58ac060a76 Added some simple tests
rafavzqz
parents: 9405
diff changeset
261
ba58ac060a76 Added some simple tests
rafavzqz
parents: 9405
diff changeset
262 %!demo
ba58ac060a76 Added some simple tests
rafavzqz
parents: 9405
diff changeset
263 %! U = {[0 0 1/2 1 1], [0 0 0 1 1]};
ba58ac060a76 Added some simple tests
rafavzqz
parents: 9405
diff changeset
264 %! p = [3, 3];
ba58ac060a76 Added some simple tests
rafavzqz
parents: 9405
diff changeset
265 %! [X, Y] = meshgrid (linspace(0, 1, 30));
ba58ac060a76 Added some simple tests
rafavzqz
parents: 9405
diff changeset
266 %! u = [X(:), Y(:)]';
ba58ac060a76 Added some simple tests
rafavzqz
parents: 9405
diff changeset
267 %! N = tbasisfun (u, p, U);
ba58ac060a76 Added some simple tests
rafavzqz
parents: 9405
diff changeset
268 %! surf (X, Y, reshape (N, size(X)))
ba58ac060a76 Added some simple tests
rafavzqz
parents: 9405
diff changeset
269 %! title('Basis function associated to a local knot vector')
ba58ac060a76 Added some simple tests
rafavzqz
parents: 9405
diff changeset
270 %! hold off
ba58ac060a76 Added some simple tests
rafavzqz
parents: 9405
diff changeset
271
ba58ac060a76 Added some simple tests
rafavzqz
parents: 9405
diff changeset
272 %!test
ba58ac060a76 Added some simple tests
rafavzqz
parents: 9405
diff changeset
273 %! U = [0 1/2 1];
ba58ac060a76 Added some simple tests
rafavzqz
parents: 9405
diff changeset
274 %! p = 1;
ba58ac060a76 Added some simple tests
rafavzqz
parents: 9405
diff changeset
275 %! u = [0.3 0.4 0.6 0.7];
ba58ac060a76 Added some simple tests
rafavzqz
parents: 9405
diff changeset
276 %! [N, Nder] = tbasisfun (u, p, U);
ba58ac060a76 Added some simple tests
rafavzqz
parents: 9405
diff changeset
277 %! assert (N, [0.6 0.8 0.8 0.6], 1e-12);
ba58ac060a76 Added some simple tests
rafavzqz
parents: 9405
diff changeset
278 %! assert (Nder, [2 2 -2 -2], 1e-12);
ba58ac060a76 Added some simple tests
rafavzqz
parents: 9405
diff changeset
279
ba58ac060a76 Added some simple tests
rafavzqz
parents: 9405
diff changeset
280 %!test
ba58ac060a76 Added some simple tests
rafavzqz
parents: 9405
diff changeset
281 %! U = {[0 1/2 1] [0 1/2 1]};
ba58ac060a76 Added some simple tests
rafavzqz
parents: 9405
diff changeset
282 %! p = [1 1];
ba58ac060a76 Added some simple tests
rafavzqz
parents: 9405
diff changeset
283 %! u = [0.3 0.4 0.6 0.7; 0.3 0.4 0.6 0.7];
ba58ac060a76 Added some simple tests
rafavzqz
parents: 9405
diff changeset
284 %! [N, Nder] = tbasisfun (u, p, U);
ba58ac060a76 Added some simple tests
rafavzqz
parents: 9405
diff changeset
285 %! assert (N, [0.36 0.64 0.64 0.36], 1e-12);
ba58ac060a76 Added some simple tests
rafavzqz
parents: 9405
diff changeset
286 %! assert (Nder, [1.2 1.6 -1.6 -1.2; 1.2 1.6 -1.6 -1.2], 1e-12);
ba58ac060a76 Added some simple tests
rafavzqz
parents: 9405
diff changeset
287
ba58ac060a76 Added some simple tests
rafavzqz
parents: 9405
diff changeset
288 %!test
ba58ac060a76 Added some simple tests
rafavzqz
parents: 9405
diff changeset
289 %! U = {[0 1/2 1] [0 1/2 1] [0 1/2 1]};
ba58ac060a76 Added some simple tests
rafavzqz
parents: 9405
diff changeset
290 %! p = [1 1 1];
ba58ac060a76 Added some simple tests
rafavzqz
parents: 9405
diff changeset
291 %! u = [0.4 0.4 0.6 0.6; 0.4 0.4 0.6 0.6; 0.4 0.6 0.4 0.6];
ba58ac060a76 Added some simple tests
rafavzqz
parents: 9405
diff changeset
292 %! [N, Nder] = tbasisfun (u, p, U);
ba58ac060a76 Added some simple tests
rafavzqz
parents: 9405
diff changeset
293 %! assert (N, [0.512 0.512 0.512 0.512], 1e-12);
ba58ac060a76 Added some simple tests
rafavzqz
parents: 9405
diff changeset
294 %! assert (Nder, [1.28 1.28 -1.28 -1.28; 1.28 1.28 -1.28 -1.28; 1.28 -1.28 1.28 -1.28], 1e-12);
ba58ac060a76 Added some simple tests
rafavzqz
parents: 9405
diff changeset
295
ba58ac060a76 Added some simple tests
rafavzqz
parents: 9405
diff changeset
296 */