calcBasisFunctionDerivatives function

dynamic calcBasisFunctionDerivatives(
  1. dynamic span,
  2. dynamic u,
  3. dynamic p,
  4. dynamic n,
  5. dynamic U,
)

Implementation

calcBasisFunctionDerivatives( span, u, p, n, U ) {

	var zeroArr = [];
	for ( var i = 0; i <= p; ++ i )
		zeroArr[ i ] = 0.0;

	var ders = [];

	for ( var i = 0; i <= n; ++ i )
		ders[ i ] = zeroArr.sublist( 0 );

	var ndu = [];

	for ( var i = 0; i <= p; ++ i )
		ndu[ i ] = zeroArr.sublist( 0 );

	ndu[ 0 ][ 0 ] = 1.0;

	var left = zeroArr.sublist( 0 );
	var right = zeroArr.sublist( 0 );

	for ( var j = 1; j <= p; ++ j ) {

		left[ j ] = u - U[ span + 1 - j ];
		right[ j ] = U[ span + j ] - u;

		var saved = 0.0;

		for ( var r = 0; r < j; ++ r ) {

			var rv = right[ r + 1 ];
			var lv = left[ j - r ];
			ndu[ j ][ r ] = rv + lv;

			var temp = ndu[ r ][ j - 1 ] / ndu[ j ][ r ];
			ndu[ r ][ j ] = saved + rv * temp;
			saved = lv * temp;

		}

		ndu[ j ][ j ] = saved;

	}

	for ( var j = 0; j <= p; ++ j ) {

		ders[ 0 ][ j ] = ndu[ j ][ p ];

	}

	for ( var r = 0; r <= p; ++ r ) {

		var s1 = 0;
		var s2 = 1;

		var a = [];
		for ( var i = 0; i <= p; ++ i ) {

			a[ i ] = zeroArr.sublist( 0 );

		}

		a[ 0 ][ 0 ] = 1.0;

		for ( var k = 1; k <= n; ++ k ) {

			var d = 0.0;
			var rk = r - k;
			var pk = p - k;

			if ( r >= k ) {

				a[ s2 ][ 0 ] = a[ s1 ][ 0 ] / ndu[ pk + 1 ][ rk ];
				d = a[ s2 ][ 0 ] * ndu[ rk ][ pk ];

			}

			var j1 = ( rk >= - 1 ) ? 1 : - rk;
			var j2 = ( r - 1 <= pk ) ? k - 1 : p - r;

			for ( var j = j1; j <= j2; ++ j ) {

				a[ s2 ][ j ] = ( a[ s1 ][ j ] - a[ s1 ][ j - 1 ] ) / ndu[ pk + 1 ][ rk + j ];
				d += a[ s2 ][ j ] * ndu[ rk + j ][ pk ];

			}

			if ( r <= pk ) {

				a[ s2 ][ k ] = - a[ s1 ][ k - 1 ] / ndu[ pk + 1 ][ r ];
				d += a[ s2 ][ k ] * ndu[ r ][ pk ];

			}

			ders[ k ][ r ] = d;

			var j = s1;
			s1 = s2;
			s2 = j;

		}

	}

	var r = p;

	for ( var k = 1; k <= n; ++ k ) {

		for ( var j = 0; j <= p; ++ j ) {

			ders[ k ][ j ] *= r;

		}

		r *= p - k;

	}

	return ders;

}