227 std :: vector< FloatMatrix > ders(
nsd);
232 for (
int i = 0; i <
nsd; i++ ) {
237 for (
int i = 0; i <
nsd; i++ ) {
246 int uind = span[0] -
degree [ 0 ];
248 for (
int k = 0; k <=
degree [ 0 ]; k++ ) {
250 jacobian(0, 0) += ders [ 0 ](1, k) * vertexCoords[0];
255 if ( fabs(Jacob) < 1.0e-10 ) {
260 for (
int k = 0; k <=
degree [ 0 ]; k++ ) {
261 answer(cnt, 0) = ders [ 0 ](1, k) / Jacob;
264 }
else if (
nsd == 2 ) {
267 int uind = span[0] -
degree [ 0 ];
268 int vind = span[1] -
degree [ 1 ];
270 for (
int l = 0; l <=
degree [ 1 ]; l++ ) {
273 for (
int k = 0; k <=
degree [ 0 ]; k++ ) {
276 tmp1[0] += ders [ 0 ](1, k) * vertexCoords[0];
277 tmp1[1] += ders [ 0 ](1, k) * vertexCoords[1];
279 tmp2[0] += ders [ 0 ](0, k) * vertexCoords[0];
280 tmp2[1] += ders [ 0 ](0, k) * vertexCoords[1];
285 jacobian(0, 0) += ders [ 1 ](0, l) * tmp1[0];
286 jacobian(0, 1) += ders [ 1 ](0, l) * tmp1[1];
288 jacobian(1, 0) += ders [ 1 ](1, l) * tmp2[0];
289 jacobian(1, 1) += ders [ 1 ](1, l) * tmp2[1];
294 if ( fabs(Jacob) < 1.0e-10 ) {
299 for (
int l = 0; l <=
degree [ 1 ]; l++ ) {
300 for (
int k = 0; k <=
degree [ 0 ]; k++ ) {
301 tmp1[0] = ders [ 0 ](1, k) * ders [ 1 ](0, l);
302 tmp1[1] = ders [ 0 ](0, k) * ders [ 1 ](1, l);
303 answer(cnt, 0) = ( +jacobian(1, 1) * tmp1[0] - jacobian(0, 1) * tmp1[1] ) / Jacob;
304 answer(cnt, 1) = ( -jacobian(1, 0) * tmp1[0] + jacobian(0, 0) * tmp1[1] ) / Jacob;
308 }
else if (
nsd == 3 ) {
312 int uind = span[0] -
degree [ 0 ];
313 int vind = span[1] -
degree [ 1 ];
314 int tind = span[2] -
degree [ 2 ];
316 for (
int m = 0; m <=
degree [ 2 ]; m++ ) {
321 for (
int l = 0; l <=
degree [ 1 ]; l++ ) {
324 for (
int k = 0; k <=
degree [ 0 ]; k++ ) {
327 tmp1[0] += ders [ 0 ](1, k) * vertexCoords[0];
328 tmp1[1] += ders [ 0 ](1, k) * vertexCoords[1];
329 tmp1[2] += ders [ 0 ](1, k) * vertexCoords[2];
331 tmp2[0] += ders [ 0 ](0, k) * vertexCoords[0];
332 tmp2[1] += ders [ 0 ](0, k) * vertexCoords[1];
333 tmp2[2] += ders [ 0 ](0, k) * vertexCoords[2];
338 temp1[0] += ders [ 1 ](0, l) * tmp1[0];
339 temp1[1] += ders [ 1 ](0, l) * tmp1[1];
340 temp1[2] += ders [ 1 ](0, l) * tmp1[2];
342 temp2[0] += ders [ 1 ](1, l) * tmp2[0];
343 temp2[1] += ders [ 1 ](1, l) * tmp2[1];
344 temp2[2] += ders [ 1 ](1, l) * tmp2[1];
346 temp3[0] += ders [ 1 ](0, l) * tmp2[0];
347 temp3[1] += ders [ 1 ](0, l) * tmp2[1];
348 temp3[2] += ders [ 1 ](0, l) * tmp2[1];
353 jacobian(0, 0) += ders [ 2 ](0, m) * temp1[0];
354 jacobian(0, 1) += ders [ 2 ](0, m) * temp1[1];
355 jacobian(0, 2) += ders [ 2 ](0, m) * temp1[2];
357 jacobian(1, 0) += ders [ 2 ](0, m) * temp2[0];
358 jacobian(1, 1) += ders [ 2 ](0, m) * temp2[1];
359 jacobian(1, 2) += ders [ 2 ](0, m) * temp2[2];
361 jacobian(2, 0) += ders [ 2 ](1, m) * temp3[0];
362 jacobian(2, 1) += ders [ 2 ](1, m) * temp3[1];
363 jacobian(2, 2) += ders [ 2 ](1, m) * temp3[2];
368 if ( fabs(Jacob) < 1.0e-10 ) {
373 for (
int m = 0; m <=
degree [ 2 ]; m++ ) {
374 for (
int l = 0; l <=
degree [ 1 ]; l++ ) {
375 for (
int k = 0; k <=
degree [ 0 ]; k++ ) {
376 tmp1[0] = ders [ 0 ](1, k) * ders [ 1 ](0, l) * ders [ 2 ](0, m);
377 tmp1[1] = ders [ 0 ](0, k) * ders [ 1 ](1, l) * ders [ 2 ](0, m);
378 tmp1[2] = ders [ 0 ](0, k) * ders [ 1 ](0, l) * ders [ 2 ](1, m);
379 answer(cnt, 0) = ( ( jacobian(1, 1) * jacobian(2, 2) - jacobian(1, 2) * jacobian(2, 1) ) * tmp1[0] +
380 ( jacobian(0, 2) * jacobian(2, 1) - jacobian(0, 1) * jacobian(2, 2) ) * tmp1[1] +
381 ( jacobian(0, 1) * jacobian(1, 2) - jacobian(0, 2) * jacobian(1, 1) ) * tmp1[2] ) / Jacob;
382 answer(cnt, 1) = ( ( jacobian(1, 2) * jacobian(2, 0) - jacobian(1, 0) * jacobian(2, 2) ) * tmp1[0] +
383 ( jacobian(0, 0) * jacobian(2, 2) - jacobian(0, 2) * jacobian(2, 0) ) * tmp1[1] +
384 ( jacobian(0, 2) * jacobian(1, 0) - jacobian(0, 0) * jacobian(1, 2) ) * tmp1[2] ) / Jacob;
385 answer(cnt, 2) = ( ( jacobian(1, 0) * jacobian(2, 1) - jacobian(1, 1) * jacobian(2, 0) ) * tmp1[0] +
386 ( jacobian(0, 1) * jacobian(2, 0) - jacobian(0, 0) * jacobian(2, 1) ) * tmp1[1] +
387 ( jacobian(0, 0) * jacobian(1, 1) - jacobian(0, 1) * jacobian(1, 0) ) * tmp1[2] ) / Jacob;
486 std :: vector< FloatMatrix > ders(
nsd);
492 for (
int i = 0; i <
nsd; i++ ) {
497 for (
int i = 0; i <
nsd; i++ ) {
504 int uind = span[0] -
degree [ 0 ];
506 for (
int k = 0; k <=
degree [ 0 ]; k++ ) {
508 jacobian(0, 0) += ders [ 0 ](1, k) * vertexCoords[0];
510 }
else if (
nsd == 2 ) {
513 int uind = span[0] -
degree [ 0 ];
514 int vind = span[1] -
degree [ 1 ];
516 for (
int l = 0; l <=
degree [ 1 ]; l++ ) {
519 for (
int k = 0; k <=
degree [ 0 ]; k++ ) {
522 tmp1[0] += ders [ 0 ](1, k) * vertexCoords[0];
523 tmp1[1] += ders [ 0 ](1, k) * vertexCoords[1];
525 tmp2[0] += ders [ 0 ](0, k) * vertexCoords[0];
526 tmp2[1] += ders [ 0 ](0, k) * vertexCoords[1];
531 jacobian(0, 0) += ders [ 1 ](0, l) * tmp1[0];
532 jacobian(0, 1) += ders [ 1 ](0, l) * tmp1[1];
534 jacobian(1, 0) += ders [ 1 ](1, l) * tmp2[0];
535 jacobian(1, 1) += ders [ 1 ](1, l) * tmp2[1];
537 }
else if (
nsd == 3 ) {
541 int uind = span[0] -
degree [ 0 ];
542 int vind = span[1] -
degree [ 1 ];
543 int tind = span[2] -
degree [ 2 ];
545 for (
int m = 0; m <=
degree [ 2 ]; m++ ) {
550 for (
int l = 0; l <=
degree [ 1 ]; l++ ) {
553 for (
int k = 0; k <=
degree [ 0 ]; k++ ) {
556 tmp1.
add(ders [ 0 ](1, k), vertexCoords);
557 tmp2.
add(ders [ 0 ](0, k), vertexCoords);
562 temp1.add(ders [ 1 ](0, l), tmp1);
563 temp2.add(ders [ 1 ](1, l), tmp2);
564 temp3.
add(ders [ 1 ](0, l), tmp2);
569 jacobian(0, 0) += ders [ 2 ](0, m) * temp1[0];
570 jacobian(0, 1) += ders [ 2 ](0, m) * temp1[1];
571 jacobian(0, 2) += ders [ 2 ](0, m) * temp1[2];
573 jacobian(1, 0) += ders [ 2 ](0, m) * temp2[0];
574 jacobian(1, 1) += ders [ 2 ](0, m) * temp2[1];
575 jacobian(1, 2) += ders [ 2 ](0, m) * temp2[2];
577 jacobian(2, 0) += ders [ 2 ](1, m) * temp3[0];
578 jacobian(2, 1) += ders [ 2 ](1, m) * temp3[1];
579 jacobian(2, 2) += ders [ 2 ](1, m) * temp3[2];
582 OOFEM_ERROR(
"giveTransformationJacobian not implemented for nsd = %d",
nsd);
675void BSplineInterpolation :: dersBasisFuns(
int n,
double u,
int span,
int p,
const FloatArray &U,
FloatMatrix &ders)
const
684 ders.
resize(n + 1, p + 1);
687 for (
int j = 1; j <= p; j++ ) {
688 left[j] = u - U [ span + 1 - j ];
689 right[j] = U [ span + j ] - u;
692 for (
int r = 0; r < j; r++ ) {
694 ndu(j, r) = right(r + 1) + left(j - r);
695 double temp = ndu(r, j - 1) / ndu(j, r);
697 ndu(r, j) = saved + right(r + 1) * temp;
698 saved = left(j - r) * temp;
704 for (
int j = 0; j <= p; j++ ) {
705 ders(0, j) = ndu(j, p);
710 for (
int r = 0; r <= p; r++ ) {
716 for (
int k = 1; k <= n; k++ ) {
724 a(s2, 0) = a(s1, 0) / ndu(pk + 1, rk);
725 d = a(s2, 0) * ndu(rk, pk);
740 for (
int j = j1; j <= j2; j++ ) {
741 a(s2, j) = ( a(s1, j) - a(s1, j - 1) ) / ndu(pk + 1, rk + j);
742 d += a(s2, j) * ndu(rk + j, pk);
746 a(s2, k) = -a(s1, k - 1) / ndu(pk + 1, r);
747 d += a(s2, k) * ndu(r, pk);
757 for (
int k = 1; k <= n; k++ ) {
758 for (
int j = 0; j <= p; j++ ) {