137 std :: vector< FloatArray >
N(
nsd);
138 std :: vector< FloatMatrix > ders(
nsd);
143 for (
int i = 0; i <
nsd; i++ ) {
148 for (
int i = 0; i <
nsd; i++ ) {
160 #ifndef OPTIMIZED_VERSION_A4dot4
172 for (
int i = 0; i <
nsd; i++ ) {
175 #ifndef OPTIMIZED_VERSION_A4dot4
185 int uind = span[0] -
degree [ 0 ];
186 int vind = span[1] -
degree [ 1 ];
188 for (
int l = 0; l <=
degree [ 1 ]; l++ ) {
191 for (
int k = 0; k <=
degree [ 0 ]; k++ ) {
193 double w = this->
weights.at(ind + k);
195 tmp1[0] += ders [ 0 ](0, k) * vertexCoords[0] * w;
196 tmp1[1] += ders [ 0 ](0, k) * vertexCoords[1] * w;
197 tmp1[2] += ders [ 0 ](0, k) * w;
199 tmp2[0] += ders [ 0 ](1, k) * vertexCoords[0] * w;
200 tmp2[1] += ders [ 0 ](1, k) * vertexCoords[1] * w;
201 tmp2[2] += ders [ 0 ](1, k) * w;
206 Aders [ 0 ](0, 0) += ders [ 1 ](0, l) * tmp1[0];
207 Aders [ 1 ](0, 0) += ders [ 1 ](0, l) * tmp1[1];
208 wders(0, 0) += ders [ 1 ](0, l) * tmp1[2];
210 Aders [ 0 ](0, 1) += ders [ 1 ](1, l) * tmp1[0];
211 Aders [ 1 ](0, 1) += ders [ 1 ](1, l) * tmp1[1];
212 wders(0, 1) += ders [ 1 ](1, l) * tmp1[2];
214 Aders [ 0 ](1, 0) += ders [ 1 ](0, l) * tmp2[0];
215 Aders [ 1 ](1, 0) += ders [ 1 ](0, l) * tmp2[1];
216 wders(1, 0) += ders [ 1 ](0, l) * tmp2[2];
219 double weight = wders(0, 0);
221 #ifndef OPTIMIZED_VERSION_A4dot4
225 for (
int k = 0; k <= d; k++ ) {
226 for (
int l = 0; l <= d - k; l++ ) {
227 tmp1[0] = Aders [ 0 ](k, l);
228 tmp1[1] = Aders [ 1 ](k, l);
229 for ( j = 1; j <= l; j++ ) {
230 tmp1[0] -= wders(0, j) * Sders [ 0 ](k, l - j);
231 tmp1[1] -= wders(0, j) * Sders [ 1 ](k, l - j);
234 for (
int i = 1; i <= k; i++ ) {
235 tmp1[0] -= wders(i, 0) * Sders [ 0 ](k - i, l);
236 tmp1[1] -= wders(i, 0) * Sders [ 1 ](k - i, l);
238 for (
int j = 1; j <= l; j++ ) {
239 tmp2[0] += wders(i, j) * Sders [ 0 ](k - i, l - j);
240 tmp2[1] += wders(i, j) * Sders [ 1 ](k - i, l - j);
247 Sders [ 0 ](k, l) = tmp1[0] / weight;
248 Sders [ 1 ](k, l) = tmp1[1] / weight;
252 jacobian(0, 0) = Sders [ 0 ](1, 0);
253 jacobian(0, 1) = Sders [ 1 ](1, 0);
254 jacobian(1, 0) = Sders [ 0 ](0, 1);
255 jacobian(1, 1) = Sders [ 1 ](0, 1);
277 tmp1[0] = Aders [ 0 ](0, 0) / weight;
278 tmp1[1] = Aders [ 1 ](0, 0) / weight;
280 jacobian(0, 0) = ( Aders [ 0 ](1, 0) - wders(1, 0) * tmp1[0] ) / weight;
281 jacobian(0, 1) = ( Aders [ 1 ](1, 0) - wders(1, 0) * tmp1[1] ) / weight;
283 jacobian(1, 0) = ( Aders [ 0 ](0, 1) - wders(0, 1) * tmp1[0] ) / weight;
284 jacobian(1, 1) = ( Aders [ 1 ](0, 1) - wders(0, 1) * tmp1[1] ) / weight;
290 double product = Jacob * weight * weight;
293 for (
int l = 0; l <=
degree [ 1 ]; l++ ) {
294 for (
int k = 0; k <=
degree [ 0 ]; k++ ) {
295 double w =
weights.at(ind + k);
297 tmp1[0] = ders [ 0 ](1, k) * ders [ 1 ](0, l) * w * weight - ders [ 0 ](0, k) * ders [ 1 ](0, l) * w * wders(1, 0);
299 tmp1[1] = ders [ 0 ](0, k) * ders [ 1 ](1, l) * w * weight - ders [ 0 ](0, k) * ders [ 1 ](0, l) * w * wders(0, 1);
301 answer(cnt, 0) = ( +jacobian(1, 1) * tmp1[0] - jacobian(0, 1) * tmp1[1] ) /
product;
302 answer(cnt, 1) = ( -jacobian(1, 0) * tmp1[0] + jacobian(0, 0) * tmp1[1] ) /
product;
313 std :: vector< FloatArray > Aders(
nsd);
316 for (
int i = 0; i <
nsd; i++ ) {
317 Aders [ i ].resize(
nsd + 1);
326 int uind = span[0] -
degree [ 0 ];
328 for (
int k = 0; k <=
degree [ 0 ]; k++ ) {
330 double w = this->
weights.at(ind + k);
332 Aders [ 0 ][0] += ders [ 0 ](0, k) * vertexCoords[0] * w;
333 wders[0] += ders [ 0 ](0, k) * w;
335 Aders [ 0 ][1] += ders [ 0 ](1, k) * vertexCoords[0] * w;
336 wders[1] += ders [ 0 ](1, k) * w;
339 double weight = wders[0];
342 jacobian(0, 0) = ( Aders [ 0 ][1] - wders[1] * Aders [ 0 ][0] / weight ) / weight;
347 double product = Jacob * weight * weight;
350 for (
int k = 0; k <=
degree [ 0 ]; k++ ) {
351 double w = this->
weights.at(ind + k);
353 answer(cnt, 0) = ders [ 0 ](1, k) * w * weight - ders [ 0 ](0, k) * w * wders[1] /
product;
356 }
else if (
nsd == 2 ) {
360 int uind = span[0] -
degree [ 0 ];
361 int vind = span[1] -
degree [ 1 ];
363 for (
int l = 0; l <=
degree [ 1 ]; l++ ) {
366 for (
int k = 0; k <=
degree [ 0 ]; k++ ) {
368 double w = this->
weights.at(ind + k);
370 tmp1[0] += ders [ 0 ](0, k) * vertexCoords[0] * w;
371 tmp1[1] += ders [ 0 ](0, k) * vertexCoords[1] * w;
372 tmp1[2] += ders [ 0 ](0, k) * w;
374 tmp2[0] += ders [ 0 ](1, k) * vertexCoords[0] * w;
375 tmp2[1] += ders [ 0 ](1, k) * vertexCoords[1] * w;
376 tmp2[2] += ders [ 0 ](1, k) * w;
381 Aders [ 0 ][0] += ders [ 1 ](0, l) * tmp1[0];
382 Aders [ 1 ][0] += ders [ 1 ](0, l) * tmp1[1];
383 wders[0] += ders [ 1 ](0, l) * tmp1[2];
385 Aders [ 0 ][1] += ders [ 1 ](0, l) * tmp2[0];
386 Aders [ 1 ][1] += ders [ 1 ](0, l) * tmp2[1];
387 wders[1] += ders [ 1 ](0, l) * tmp2[2];
389 Aders [ 0 ][2] += ders [ 1 ](1, l) * tmp1[0];
390 Aders [ 1 ][2] += ders [ 1 ](1, l) * tmp1[1];
391 wders[2] += ders [ 1 ](1, l) * tmp1[2];
394 double weight = wders[0];
397 tmp1[0] = Aders [ 0 ][0] / weight;
398 tmp1[1] = Aders [ 1 ][0] / weight;
399 jacobian(0, 0) = ( Aders [ 0 ][1] - wders[1] * tmp1[0] ) / weight;
400 jacobian(0, 1) = ( Aders [ 1 ][1] - wders[1] * tmp1[1] ) / weight;
401 jacobian(1, 0) = ( Aders [ 0 ][2] - wders[2] * tmp1[0] ) / weight;
402 jacobian(1, 1) = ( Aders [ 1 ][2] - wders[2] * tmp1[1] ) / weight;
407 double product = Jacob * weight * weight;
410 for (
int l = 0; l <=
degree [ 1 ]; l++ ) {
411 for (
int k = 0; k <=
degree [ 0 ]; k++ ) {
412 double w = this->
weights.at(ind + k);
414 tmp1[0] = ders [ 0 ](1, k) * ders [ 1 ](0, l) * w * weight - ders [ 0 ](0, k) * ders [ 1 ](0, l) * w * wders[1];
416 tmp1[1] = ders [ 0 ](0, k) * ders [ 1 ](1, l) * w * weight - ders [ 0 ](0, k) * ders [ 1 ](0, l) * w * wders[2];
418 answer(cnt, 0) = ( +jacobian(1, 1) * tmp1[0] - jacobian(0, 1) * tmp1[1] ) /
product;
419 answer(cnt, 1) = ( -jacobian(1, 0) * tmp1[0] + jacobian(0, 0) * tmp1[1] ) /
product;
425 }
else if (
nsd == 3 ) {
430 int uind = span[0] -
degree [ 0 ];
431 int vind = span[1] -
degree [ 1 ];
432 int tind = span[2] -
degree [ 2 ];
434 for (
int m = 0; m <=
degree [ 2 ]; m++ ) {
439 for (
int l = 0; l <=
degree [ 1 ]; l++ ) {
442 for (
int k = 0; k <=
degree [ 0 ]; k++ ) {
444 double w = this->
weights.at(ind + k);
446 tmp1[0] += ders [ 0 ](0, k) * vertexCoords[0] * w;
447 tmp1[1] += ders [ 0 ](0, k) * vertexCoords[1] * w;
448 tmp1[2] += ders [ 0 ](0, k) * vertexCoords[2] * w;
449 tmp1[3] += ders [ 0 ](0, k) * w;
451 tmp2[0] += ders [ 0 ](1, k) * vertexCoords[0] * w;
452 tmp2[1] += ders [ 0 ](1, k) * vertexCoords[1] * w;
453 tmp2[2] += ders [ 0 ](1, k) * vertexCoords[2] * w;
454 tmp2[3] += ders [ 0 ](1, k) * w;
459 temp1[0] += ders [ 1 ](0, l) * tmp1[0];
460 temp1[1] += ders [ 1 ](0, l) * tmp1[1];
461 temp1[2] += ders [ 1 ](0, l) * tmp1[2];
462 temp1[3] += ders [ 1 ](0, l) * tmp1[3];
464 temp2[0] += ders [ 1 ](0, l) * tmp2[0];
465 temp2[1] += ders [ 1 ](0, l) * tmp2[1];
466 temp2[2] += ders [ 1 ](0, l) * tmp2[2];
467 temp2[3] += ders [ 1 ](0, l) * tmp2[3];
469 temp3[0] += ders [ 1 ](1, l) * tmp1[0];
470 temp3[1] += ders [ 1 ](1, l) * tmp1[1];
471 temp3[2] += ders [ 1 ](1, l) * tmp1[2];
472 temp3[3] += ders [ 1 ](1, l) * tmp1[3];
477 Aders [ 0 ][0] += ders [ 2 ](0, m) * temp1[0];
478 Aders [ 1 ][0] += ders [ 2 ](0, m) * temp1[1];
479 Aders [ 2 ][0] += ders [ 2 ](0, m) * temp1[2];
480 wders[0] += ders [ 2 ](0, m) * temp1[3];
482 Aders [ 0 ][1] += ders [ 2 ](0, m) * temp2[0];
483 Aders [ 1 ][1] += ders [ 2 ](0, m) * temp2[1];
484 Aders [ 2 ][1] += ders [ 2 ](0, m) * temp2[2];
485 wders[1] += ders [ 2 ](0, m) * temp2[3];
487 Aders [ 0 ][2] += ders [ 2 ](0, m) * temp3[0];
488 Aders [ 1 ][2] += ders [ 2 ](0, m) * temp3[1];
489 Aders [ 2 ][2] += ders [ 2 ](0, m) * temp3[2];
490 wders[2] += ders [ 2 ](0, m) * temp3[3];
492 Aders [ 0 ][3] += ders [ 2 ](1, m) * temp1[0];
493 Aders [ 1 ][3] += ders [ 2 ](1, m) * temp1[1];
494 Aders [ 2 ][3] += ders [ 2 ](1, m) * temp1[2];
495 wders[3] += ders [ 2 ](1, m) * temp1[3];
498 double weight = wders[0];
501 tmp1[0] = Aders [ 0 ][0] / weight;
502 tmp1[1] = Aders [ 1 ][0] / weight;
503 tmp1[2] = Aders [ 2 ][0] / weight;
504 jacobian(0, 0) = ( Aders [ 0 ][1] - wders[1] * tmp1[0] ) / weight;
505 jacobian(0, 1) = ( Aders [ 1 ][1] - wders[1] * tmp1[1] ) / weight;
506 jacobian(0, 2) = ( Aders [ 2 ][1] - wders[1] * tmp1[2] ) / weight;
507 jacobian(1, 0) = ( Aders [ 0 ][2] - wders[2] * tmp1[0] ) / weight;
508 jacobian(1, 1) = ( Aders [ 1 ][2] - wders[2] * tmp1[1] ) / weight;
509 jacobian(1, 2) = ( Aders [ 2 ][2] - wders[2] * tmp1[2] ) / weight;
510 jacobian(2, 0) = ( Aders [ 0 ][3] - wders[3] * tmp1[0] ) / weight;
511 jacobian(2, 1) = ( Aders [ 1 ][3] - wders[3] * tmp1[1] ) / weight;
512 jacobian(2, 2) = ( Aders [ 2 ][3] - wders[3] * tmp1[2] ) / weight;
517 double product = Jacob * weight * weight;
520 for (
int m = 0; m <=
degree [ 2 ]; m++ ) {
522 for (
int l = 0; l <=
degree [ 1 ]; l++ ) {
523 for (
int k = 0; k <=
degree [ 0 ]; k++ ) {
524 double w = this->
weights.at(ind + k);
526 tmp1[0] = ders [ 0 ](1, k) * ders [ 1 ](0, l) * ders [ 2 ](0, m) * w * weight - ders [ 0 ](0, k) * ders [ 1 ](0, l) * ders [ 2 ](0, m) * w * wders[1];
528 tmp1[1] = ders [ 0 ](0, k) * ders [ 1 ](1, l) * ders [ 2 ](0, m) * w * weight - ders [ 0 ](0, k) * ders [ 1 ](0, l) * ders [ 2 ](0, m) * w * wders[2];
530 tmp1[2] = ders [ 0 ](0, k) * ders [ 1 ](0, l) * ders [ 2 ](1, m) * w * weight - ders [ 0 ](0, k) * ders [ 1 ](0, l) * ders [ 2 ](0, m) * w * wders[3];
532 answer(cnt, 0) = ( ( jacobian(1, 1) * jacobian(2, 2) - jacobian(1, 2) * jacobian(2, 1) ) * tmp1[0] +
533 ( jacobian(0, 2) * jacobian(2, 1) - jacobian(0, 1) * jacobian(2, 2) ) * tmp1[1] +
534 ( jacobian(0, 1) * jacobian(1, 2) - jacobian(0, 2) * jacobian(1, 1) ) * tmp1[2] ) /
product;
535 answer(cnt, 1) = ( ( jacobian(1, 2) * jacobian(2, 0) - jacobian(1, 0) * jacobian(2, 2) ) * tmp1[0] +
536 ( jacobian(0, 0) * jacobian(2, 2) - jacobian(0, 2) * jacobian(2, 0) ) * tmp1[1] +
537 ( jacobian(0, 2) * jacobian(1, 0) - jacobian(0, 0) * jacobian(1, 2) ) * tmp1[2] ) /
product;
538 answer(cnt, 2) = ( ( jacobian(1, 0) * jacobian(2, 1) - jacobian(1, 1) * jacobian(2, 0) ) * tmp1[0] +
539 ( jacobian(0, 1) * jacobian(2, 0) - jacobian(0, 0) * jacobian(2, 1) ) * tmp1[1] +
540 ( jacobian(0, 0) * jacobian(1, 1) - jacobian(0, 1) * jacobian(1, 0) ) * tmp1[2] ) /
product;
663 std :: vector< FloatMatrix > ders(
nsd);
669 for (
int i = 0; i <
nsd; i++ ) {
674 for (
int i = 0; i <
nsd; i++ ) {
683 #ifndef OPTIMIZED_VERSION_A4dot4
695 for (
int i = 0; i <
nsd; i++ ) {
698 #ifndef OPTIMIZED_VERSION_A4dot4
708 int uind = span[0] -
degree [ 0 ];
709 int vind = span[1] -
degree [ 1 ];
711 for (
int l = 0; l <=
degree [ 1 ]; l++ ) {
714 for (
int k = 0; k <=
degree [ 0 ]; k++ ) {
716 double w = this->
weights.at(ind + k);
718 tmp1[0] += ders [ 0 ](0, k) * vertexCoords[0] * w;
719 tmp1[1] += ders [ 0 ](0, k) * vertexCoords[1] * w;
720 tmp1[2] += ders [ 0 ](0, k) * w;
722 tmp2[0] += ders [ 0 ](1, k) * vertexCoords[0] * w;
723 tmp2[1] += ders [ 0 ](1, k) * vertexCoords[1] * w;
724 tmp2[2] += ders [ 0 ](1, k) * w;
729 Aders [ 0 ](0, 0) += ders [ 1 ](0, l) * tmp1[0];
730 Aders [ 1 ](0, 0) += ders [ 1 ](0, l) * tmp1[1];
731 wders(0, 0) += ders [ 1 ](0, l) * tmp1[2];
733 Aders [ 0 ](0, 1) += ders [ 1 ](1, l) * tmp1[0];
734 Aders [ 1 ](0, 1) += ders [ 1 ](1, l) * tmp1[1];
735 wders(0, 1) += ders [ 1 ](1, l) * tmp1[2];
737 Aders [ 0 ](1, 0) += ders [ 1 ](0, l) * tmp2[0];
738 Aders [ 1 ](1, 0) += ders [ 1 ](0, l) * tmp2[1];
739 wders(1, 0) += ders [ 1 ](0, l) * tmp2[2];
742 double weight = wders(0, 0);
744 #ifndef OPTIMIZED_VERSION_A4dot4
748 for (
int k = 0; k <= d; k++ ) {
749 for (
int l = 0; l <= d - k; l++ ) {
750 tmp1[0] = Aders [ 0 ](k, l);
751 tmp1[1] = Aders [ 1 ](k, l);
752 for ( j = 1; j <= l; j++ ) {
753 tmp1[0] -= wders(0, j) * Sders [ 0 ](k, l - j);
754 tmp1[1] -= wders(0, j) * Sders [ 1 ](k, l - j);
757 for (
int i = 1; i <= k; i++ ) {
758 tmp1[0] -= wders(i, 0) * Sders [ 0 ](k - i, l);
759 tmp1[1] -= wders(i, 0) * Sders [ 1 ](k - i, l);
761 for (
int j = 1; j <= l; j++ ) {
762 tmp2[0] += wders(i, j) * Sders [ 0 ](k - i, l - j);
763 tmp2[1] += wders(i, j) * Sders [ 1 ](k - i, l - j);
770 Sders [ 0 ](k, l) = tmp1[0] / weight;
771 Sders [ 1 ](k, l) = tmp1[1] / weight;
775 jacobian(0, 0) = Sders [ 0 ](1, 0);
776 jacobian(0, 1) = Sders [ 1 ](1, 0);
777 jacobian(1, 0) = Sders [ 0 ](0, 1);
778 jacobian(1, 1) = Sders [ 1 ](0, 1);
800 tmp1[0] = Aders [ 0 ](0, 0) / weight;
801 tmp1[1] = Aders [ 1 ](0, 0) / weight;
803 jacobian(0, 0) = ( Aders [ 0 ](1, 0) - wders(1, 0) * tmp1[0] ) / weight;
804 jacobian(0, 1) = ( Aders [ 1 ](1, 0) - wders(1, 0) * tmp1[1] ) / weight;
806 jacobian(1, 0) = ( Aders [ 0 ](0, 1) - wders(0, 1) * tmp1[0] ) / weight;
807 jacobian(1, 1) = ( Aders [ 1 ](0, 1) - wders(0, 1) * tmp1[1] ) / weight;
814 std :: vector< FloatArray > Aders(
nsd);
817 for (
int i = 0; i <
nsd; i++ ) {
818 Aders [ i ].resize(
nsd + 1);
827 int uind = span[0] -
degree [ 0 ];
829 for (
int k = 0; k <=
degree [ 0 ]; k++ ) {
831 double w = this->
weights.at(ind + k);
833 Aders [ 0 ][0] += ders [ 0 ](0, k) * vertexCoords[0] * w;
834 wders[0] += ders [ 0 ](0, k) * w;
836 Aders [ 0 ][1] += ders [ 0 ](1, k) * vertexCoords[0] * w;
837 wders[1] += ders [ 0 ](1, k) * w;
840 double weight = wders[0];
843 jacobian(0, 0) = ( Aders [ 0 ][1] - wders[1] * Aders [ 0 ][0] / weight ) / weight;
844 }
else if (
nsd == 2 ) {
848 int uind = span[0] -
degree [ 0 ];
849 int vind = span[1] -
degree [ 1 ];
851 for (
int l = 0; l <=
degree [ 1 ]; l++ ) {
854 for (
int k = 0; k <=
degree [ 0 ]; k++ ) {
856 double w = this->
weights.at(ind + k);
858 tmp1[0] += ders [ 0 ](0, k) * vertexCoords[0] * w;
859 tmp1[1] += ders [ 0 ](0, k) * vertexCoords[1] * w;
860 tmp1[2] += ders [ 0 ](0, k) * w;
862 tmp2[0] += ders [ 0 ](1, k) * vertexCoords[0] * w;
863 tmp2[1] += ders [ 0 ](1, k) * vertexCoords[1] * w;
864 tmp2[2] += ders [ 0 ](1, k) * w;
869 Aders [ 0 ][0] += ders [ 1 ](0, l) * tmp1[0];
870 Aders [ 1 ][0] += ders [ 1 ](0, l) * tmp1[1];
871 wders[0] += ders [ 1 ](0, l) * tmp1[2];
873 Aders [ 0 ][1] += ders [ 1 ](0, l) * tmp2[0];
874 Aders [ 1 ][1] += ders [ 1 ](0, l) * tmp2[1];
875 wders[1] += ders [ 1 ](0, l) * tmp2[2];
877 Aders [ 0 ][2] += ders [ 1 ](1, l) * tmp1[0];
878 Aders [ 1 ][2] += ders [ 1 ](1, l) * tmp1[1];
879 wders[2] += ders [ 1 ](1, l) * tmp1[2];
882 double weight = wders[0];
885 tmp1[0] = Aders [ 0 ][0] / weight;
886 tmp1[1] = Aders [ 1 ][0] / weight;
887 jacobian(0, 0) = ( Aders [ 0 ][1] - wders[1] * tmp1[0] ) / weight;
888 jacobian(0, 1) = ( Aders [ 1 ][1] - wders[1] * tmp1[1] ) / weight;
889 jacobian(1, 0) = ( Aders [ 0 ][2] - wders[2] * tmp1[0] ) / weight;
890 jacobian(1, 1) = ( Aders [ 1 ][2] - wders[2] * tmp1[1] ) / weight;
891 }
else if (
nsd == 3 ) {
896 int uind = span[0] -
degree [ 0 ];
897 int vind = span[1] -
degree [ 1 ];
898 int tind = span[2] -
degree [ 2 ];
900 for (
int m = 0; m <=
degree [ 2 ]; m++ ) {
905 for (
int l = 0; l <=
degree [ 1 ]; l++ ) {
908 for (
int k = 0; k <=
degree [ 0 ]; k++ ) {
910 double w = this->
weights.at(ind + k);
912 tmp1[0] += ders [ 0 ](0, k) * vertexCoords[0] * w;
913 tmp1[1] += ders [ 0 ](0, k) * vertexCoords[1] * w;
914 tmp1[2] += ders [ 0 ](0, k) * vertexCoords[2] * w;
915 tmp1[3] += ders [ 0 ](0, k) * w;
917 tmp2[0] += ders [ 0 ](1, k) * vertexCoords[0] * w;
918 tmp2[1] += ders [ 0 ](1, k) * vertexCoords[1] * w;
919 tmp2[2] += ders [ 0 ](1, k) * vertexCoords[2] * w;
920 tmp2[3] += ders [ 0 ](1, k) * w;
925 temp1[0] += ders [ 1 ](0, l) * tmp1[0];
926 temp1[1] += ders [ 1 ](0, l) * tmp1[1];
927 temp1[2] += ders [ 1 ](0, l) * tmp1[2];
928 temp1[3] += ders [ 1 ](0, l) * tmp1[3];
930 temp2[0] += ders [ 1 ](0, l) * tmp2[0];
931 temp2[1] += ders [ 1 ](0, l) * tmp2[1];
932 temp2[2] += ders [ 1 ](0, l) * tmp2[2];
933 temp2[3] += ders [ 1 ](0, l) * tmp2[3];
935 temp3[0] += ders [ 1 ](1, l) * tmp1[0];
936 temp3[1] += ders [ 1 ](1, l) * tmp1[1];
937 temp3[2] += ders [ 1 ](1, l) * tmp1[2];
938 temp3[3] += ders [ 1 ](1, l) * tmp1[3];
943 Aders [ 0 ][0] += ders [ 2 ](0, m) * temp1[0];
944 Aders [ 1 ][0] += ders [ 2 ](0, m) * temp1[1];
945 Aders [ 2 ][0] += ders [ 2 ](0, m) * temp1[2];
946 wders[0] += ders [ 2 ](0, m) * temp1[3];
948 Aders [ 0 ][1] += ders [ 2 ](0, m) * temp2[0];
949 Aders [ 1 ][1] += ders [ 2 ](0, m) * temp2[1];
950 Aders [ 2 ][1] += ders [ 2 ](0, m) * temp2[2];
951 wders[1] += ders [ 2 ](0, m) * temp2[3];
953 Aders [ 0 ][2] += ders [ 2 ](0, m) * temp3[0];
954 Aders [ 1 ][2] += ders [ 2 ](0, m) * temp3[1];
955 Aders [ 2 ][2] += ders [ 2 ](0, m) * temp3[2];
956 wders[2] += ders [ 2 ](0, m) * temp3[3];
958 Aders [ 0 ][3] += ders [ 2 ](1, m) * temp1[0];
959 Aders [ 1 ][3] += ders [ 2 ](1, m) * temp1[1];
960 Aders [ 2 ][3] += ders [ 2 ](1, m) * temp1[2];
961 wders[3] += ders [ 2 ](1, m) * temp1[3];
964 double weight = wders[0];
967 tmp1[0] = Aders [ 0 ][0] / weight;
968 tmp1[1] = Aders [ 1 ][0] / weight;
969 tmp1[2] = Aders [ 2 ][0] / weight;
970 jacobian(0, 0) = ( Aders [ 0 ][1] - wders[1] * tmp1[0] ) / weight;
971 jacobian(0, 1) = ( Aders [ 1 ][1] - wders[1] * tmp1[1] ) / weight;
972 jacobian(0, 2) = ( Aders [ 2 ][1] - wders[1] * tmp1[2] ) / weight;
973 jacobian(1, 0) = ( Aders [ 0 ][2] - wders[2] * tmp1[0] ) / weight;
974 jacobian(1, 1) = ( Aders [ 1 ][2] - wders[2] * tmp1[1] ) / weight;
975 jacobian(1, 2) = ( Aders [ 2 ][2] - wders[2] * tmp1[2] ) / weight;
976 jacobian(2, 0) = ( Aders [ 0 ][3] - wders[3] * tmp1[0] ) / weight;
977 jacobian(2, 1) = ( Aders [ 1 ][3] - wders[3] * tmp1[1] ) / weight;
978 jacobian(2, 2) = ( Aders [ 2 ][3] - wders[3] * tmp1[2] ) / weight;