48 BSplineInterpolation :: initializeFrom(ir, pm, elnum, priority);
58 for (
int i = 0; i <
nsd; i++ ) {
59 if (
degree [ i ] > max_deg ) {
68 for (
int n = 0; n <
nsd; n++ ) {
69 localIndexKnotVector_tmp.
clear();
70 IR_GIVE_FIELD(ir, localIndexKnotVector_tmp, IFT_localIndexKnotVector [ n ]);
72 throw ValueInputException(ir, IFT_localIndexKnotVector [ n ],
"invalid size of knot vector");
78 indexKnotVec.resize(
degree [ 2 ] + 2 );
81 for (
int j = 0; j <
degree [ n ] + 2; j++ ) {
82 indexKnotVec [ p++ ] = localIndexKnotVector_tmp[pos++];
86 int indexKnotVal = indexKnotVec [ 0 ];
87 for (
int j = 1; j <
degree [ n ] + 2; j++ ) {
88 if ( indexKnotVal > indexKnotVec [ j ] ) {
89 throw ValueInputException(ir, IFT_localIndexKnotVector [ n ],
"local index knot vector is not monotonic");
97 indexKnotVal = indexKnotVec [ j ];
101 if ( indexKnotVal == indexKnotVec [ 0 ] ) {
102 throw ValueInputException(ir, IFT_localIndexKnotVector [ n ],
"local index knot vector is degenerated");
106 if ( indexKnotVec [ 0 ] <= 0 || indexKnotVal >
knotValues [ n ].giveSize() ) {
107 throw ValueInputException(ir, IFT_localIndexKnotVector [ n ],
"local index knot vector out of range");
166 std :: vector< FloatArray > tmp_ders(
nsd);
167 std :: vector< FloatMatrix > ders(
nsd);
182 for (
int i = 0; i <
nsd; i++ ) {
192 for (
int i = 0; i <
nsd; i++ ) {
193 ders [ i ].resize(2, count);
203 for (
int i = 0; i <
nsd; i++ ) {
212 for (
int k = 0; k < count; k++ ) {
213 for (
int i = 0; i <
nsd; i++ ) {
216 ders [ i ](0, k) = tmp_ders [ i ][0];
217 ders [ i ](1, k) = tmp_ders [ i ][1];
223 double w = this->
weights.at( mask[k] );
224 double xw = vertexCoords[0] * w;
225 double yw = vertexCoords[1] * w;
228 product = tmp_ders [ 0 ][0] * tmp_ders [ 1 ][0];
229 Aders [ 0 ](0, 0) +=
product * xw;
230 Aders [ 1 ](0, 0) +=
product * yw;
233 product = tmp_ders [ 0 ][1] * tmp_ders [ 1 ][0];
234 Aders [ 0 ](1, 0) +=
product * xw;
235 Aders [ 1 ](1, 0) +=
product * yw;
238 product = tmp_ders [ 0 ][0] * tmp_ders [ 1 ][1];
239 Aders [ 0 ](0, 1) +=
product * xw;
240 Aders [ 1 ](0, 1) +=
product * yw;
244 double weight = wders(0, 0);
261 temp[0] = Aders [ 0 ](0, 0) / weight;
262 temp[1] = Aders [ 1 ](0, 0) / weight;
263 jacobian(1, 0) = ( Aders [ 0 ](0, 1) - wders(0, 1) * temp[0] ) / weight;
264 jacobian(1, 1) = ( Aders [ 1 ](0, 1) - wders(0, 1) * temp[1] ) / weight;
265 jacobian(0, 0) = ( Aders [ 0 ](1, 0) - wders(1, 0) * temp[0] ) / weight;
266 jacobian(0, 1) = ( Aders [ 1 ](1, 0) - wders(1, 0) * temp[1] ) / weight;
271 double product = Jacob * weight * weight;
273 for (
int k = 0; k < count; k++ ) {
274 double w = this->
weights.at( mask[k] );
276 temp[0] = ders [ 0 ](1, k) * ders [ 1 ](0, k) * w * weight - ders [ 0 ](0, k) * ders [ 1 ](0, k) * w * wders(1, 0);
278 temp[1] = ders [ 0 ](0, k) * ders [ 1 ](1, k) * w * weight - ders [ 0 ](0, k) * ders [ 1 ](0, k) * w * wders(0, 1);
280 answer(k, 0) = ( jacobian(1, 1) * temp[0] - jacobian(0, 1) * temp[1] ) /
product;
281 answer(k, 1) = ( -jacobian(1, 0) * temp[0] + jacobian(0, 0) * temp[1] ) /
product;
350 std :: vector< FloatArray > ders(
nsd);
366 for (
int i = 0; i <
nsd; i++ ) {
382 for (
int i = 0; i <
nsd; i++ ) {
391 for (
int k = 0; k < count; k++ ) {
392 for (
int i = 0; i <
nsd; i++ ) {
399 double w = this->
weights.at( mask[k] );
400 double xw = vertexCoords[0] * w;
401 double yw = vertexCoords[1] * w;
404 product = ders [ 0 ][0] * ders [ 1 ][0];
405 Aders [ 0 ](0, 0) +=
product * xw;
406 Aders [ 1 ](0, 0) +=
product * yw;
409 product = ders [ 0 ][1] * ders [ 1 ][0];
410 Aders [ 0 ](1, 0) +=
product * xw;
411 Aders [ 1 ](1, 0) +=
product * yw;
414 product = ders [ 0 ][0] * ders [ 1 ][1];
415 Aders [ 0 ](0, 1) +=
product * xw;
416 Aders [ 1 ](0, 1) +=
product * yw;
420 double weight = wders(0, 0);
424 Sders[0](0,0) = Aders[0](0,0) / weight;
425 Sders[1](0,0) = Aders[1](0,0) / weight;
426 Sders[0](0,1) = (Aders[0](0,1)-wders(0,1)*Sders[0](0,0)) / weight;
427 Sders[1](0,1) = (Aders[1](0,1)-wders(0,1)*Sders[1](0,0)) / weight;
428 Sders[0](1,0) = (Aders[0](1,0)-wders(1,0)*Sders[0](0,0)) / weight;
429 Sders[1](1,0) = (Aders[1](1,0)-wders(1,0)*Sders[1](0,0)) / weight;
431 jacobian(0,0) = Sders[0](1,0);
432 jacobian(0,1) = Sders[1](1,0);
433 jacobian(1,0) = Sders[0](0,1);
434 jacobian(1,1) = Sders[1](0,1);
437 temp[0] = Aders [ 0 ](0, 0) / weight;
438 temp[1] = Aders [ 1 ](0, 0) / weight;
439 jacobian(1, 0) = ( Aders [ 0 ](0, 1) - wders(0, 1) * temp[0] ) / weight;
440 jacobian(1, 1) = ( Aders [ 1 ](0, 1) - wders(0, 1) * temp[1] ) / weight;
441 jacobian(0, 0) = ( Aders [ 0 ](1, 0) - wders(1, 0) * temp[0] ) / weight;
442 jacobian(0, 1) = ( Aders [ 1 ](1, 0) - wders(1, 0) * temp[1] ) / weight;
607double TSplineInterpolation :: basisFunction(
double u,
int p,
const FloatArray &U,
const IntArray &I)
const
609 int span, prepend, append;
613 span = BSplineInterpolation :: findSpan(prepend + append, p, u, openLocalKnotVector);
614 BSplineInterpolation :: basisFuns(
N, span, u, p, openLocalKnotVector);
618 return N(p - span + prepend);
626 int span, prepend, append;
631 span = BSplineInterpolation :: findSpan(prepend + append, p, u, openLocalKnotVector);
632 BSplineInterpolation :: dersBasisFuns(n, u, span, p, openLocalKnotVector, Ders);
637 for (
int i = 0; i <= n; i++ ) {
638 ders[i] = Ders(i, p - span + prepend);
643void TSplineInterpolation :: createLocalKnotVector(
FloatArray &openLocalKnotVector,
int p,
const FloatArray &U,
const IntArray &I,
int &prepend,
int &append)
const
645 int j = 0, index_first = I [ 0 ], index_last = I [ p + 1 ], mult_first = 1, mult_last = 1;
646 double first = U.
at(index_first), last = U.
at(index_last);
648 for (
int i = 0; i <
nsd; i++ ) {
649 if (
degree [ i ] > max_deg ) {
653 openLocalKnotVector.
resize( 3 * max_deg + 2 );
655 for (
int i = 1; i < p + 1; i++ ) {
656 if ( I [ i ] != index_first ) {
663 for (
int i = p; i > 0; i-- ) {
664 if ( I [ i ] != index_last ) {
671 prepend = p + 1 - mult_first;
672 append = p + 1 - mult_last;
675 for (
int i = 0; i <= prepend; i++ ) {
676 openLocalKnotVector [ j++ ] = first;
680 for (
int i = 1; i <= p; i++ ) {
681 openLocalKnotVector [ j++ ] = U.
at(I [ i ]);
685 for (
int i = 0; i <= append; i++ ) {
686 openLocalKnotVector [ j++ ] = last;