Changeset 18148
- Timestamp:
- 06/12/14 14:38:13 (11 years ago)
- Location:
- issm/trunk-jpl/src/c/shared/Matrix
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
issm/trunk-jpl/src/c/shared/Matrix/MatrixUtils.cpp
r18063 r18148 3 3 */ 4 4 5 #include "../Elements/elements.h" 5 6 /*Headers*/ 6 7 /*{{{*/ … … 309 310 return noerr; 310 311 }/*}}}*/ 312 311 313 void Matrix2x2Determinant(IssmDouble* Adet,IssmDouble* A){/*{{{*/ 312 314 /*Compute determinant of a 2x2 matrix*/ … … 332 334 333 335 }/*}}}*/ 336 334 337 void Matrix3x3Determinant(IssmDouble* Adet,IssmDouble* A){/*{{{*/ 335 338 /*Compute determinant of a 3x3 matrix*/ … … 337 340 /*det = a*(e*i-f*h)-b*(d*i-f*g)+c*(d*h-e*g)*/ 338 341 *Adet= A[0]*A[4]*A[8]-A[0]*A[5]*A[7]-A[3]*A[1]*A[8]+A[3]*A[2]*A[7]+A[6]*A[1]*A[5]-A[6]*A[2]*A[4]; 342 } 343 /*}}}*/ 344 IssmDouble Matrix3x3Determinant(IssmDouble a1,IssmDouble a2,IssmDouble a3, IssmDouble b1,IssmDouble b2,IssmDouble b3, IssmDouble c1,IssmDouble c2,IssmDouble c3){/*{{{*/ 345 /*Compute determinant of a 3x3 matrix*/ 346 347 /*det = a*(e*i-f*h)-b*(d*i-f*g)+c*(d*h-e*g) 348 * a b c a1 a2 a3 349 * d e f b1 b2 b3 350 * g h i c1 c2 c3 */ 351 return a1*b2*c3-a1*b3*c2-b1*a2*c3+b1*a3*c2+c1*a2*b3-c1*a3*b2; 339 352 } 340 353 /*}}}*/ … … 368 381 369 382 }/*}}}*/ 383 384 void Matrix4x4Determinant(IssmDouble* Adet,IssmDouble* A){/*{{{*/ 385 /*Compute determinant of a 4x4 matrix*/ 386 387 IssmDouble a1 = A[0*4+0]; 388 IssmDouble b1 = A[0*4+1]; 389 IssmDouble c1 = A[0*4+2]; 390 IssmDouble d1 = A[0*4+3]; 391 392 IssmDouble a2 = A[1*4+0]; 393 IssmDouble b2 = A[1*4+1]; 394 IssmDouble c2 = A[1*4+2]; 395 IssmDouble d2 = A[1*4+3]; 396 397 IssmDouble a3 = A[2*4+0]; 398 IssmDouble b3 = A[2*4+1]; 399 IssmDouble c3 = A[2*4+2]; 400 IssmDouble d3 = A[2*4+3]; 401 402 IssmDouble a4 = A[3*4+0]; 403 IssmDouble b4 = A[3*4+1]; 404 IssmDouble c4 = A[3*4+2]; 405 IssmDouble d4 = A[3*4+3]; 406 407 *Adet= a1 * Matrix3x3Determinant(b2, b3, b4, c2, c3, c4, d2, d3, d4) 408 - b1 * Matrix3x3Determinant(a2, a3, a4, c2, c3, c4, d2, d3, d4) 409 + c1 * Matrix3x3Determinant(a2, a3, a4, b2, b3, b4, d2, d3, d4) 410 - d1 * Matrix3x3Determinant(a2, a3, a4, b2, b3, b4, c2, c3, c4); 411 } 412 /*}}}*/ 413 void Matrix4x4Adjoint(IssmDouble* Aadj,IssmDouble* A){/*{{{*/ 414 415 IssmDouble a1 = A[0*4+0]; 416 IssmDouble b1 = A[0*4+1]; 417 IssmDouble c1 = A[0*4+2]; 418 IssmDouble d1 = A[0*4+3]; 419 420 IssmDouble a2 = A[1*4+0]; 421 IssmDouble b2 = A[1*4+1]; 422 IssmDouble c2 = A[1*4+2]; 423 IssmDouble d2 = A[1*4+3]; 424 425 IssmDouble a3 = A[2*4+0]; 426 IssmDouble b3 = A[2*4+1]; 427 IssmDouble c3 = A[2*4+2]; 428 IssmDouble d3 = A[2*4+3]; 429 430 IssmDouble a4 = A[3*4+0]; 431 IssmDouble b4 = A[3*4+1]; 432 IssmDouble c4 = A[3*4+2]; 433 IssmDouble d4 = A[3*4+3]; 434 435 /* Row column labeling reversed since we transpose rows & columns*/ 436 Aadj[0*4+0] = Matrix3x3Determinant(b2, b3, b4, c2, c3, c4, d2, d3, d4); 437 Aadj[1*4+0] = - Matrix3x3Determinant(a2, a3, a4, c2, c3, c4, d2, d3, d4); 438 Aadj[2*4+0] = Matrix3x3Determinant(a2, a3, a4, b2, b3, b4, d2, d3, d4); 439 Aadj[3*4+0] = - Matrix3x3Determinant(a2, a3, a4, b2, b3, b4, c2, c3, c4); 440 441 Aadj[0*4+1] = - Matrix3x3Determinant(b1, b3, b4, c1, c3, c4, d1, d3, d4); 442 Aadj[1*4+1] = Matrix3x3Determinant(a1, a3, a4, c1, c3, c4, d1, d3, d4); 443 Aadj[2*4+1] = - Matrix3x3Determinant(a1, a3, a4, b1, b3, b4, d1, d3, d4); 444 Aadj[3*4+1] = Matrix3x3Determinant(a1, a3, a4, b1, b3, b4, c1, c3, c4); 445 446 Aadj[0*4+2] = Matrix3x3Determinant(b1, b2, b4, c1, c2, c4, d1, d2, d4); 447 Aadj[1*4+2] = - Matrix3x3Determinant(a1, a2, a4, c1, c2, c4, d1, d2, d4); 448 Aadj[2*4+2] = Matrix3x3Determinant(a1, a2, a4, b1, b2, b4, d1, d2, d4); 449 Aadj[3*4+2] = - Matrix3x3Determinant(a1, a2, a4, b1, b2, b4, c1, c2, c4); 450 451 Aadj[0*4+3] = - Matrix3x3Determinant(b1, b2, b3, c1, c2, c3, d1, d2, d3); 452 Aadj[1*4+3] = Matrix3x3Determinant(a1, a2, a3, c1, c2, c3, d1, d2, d3); 453 Aadj[2*4+3] = - Matrix3x3Determinant(a1, a2, a3, b1, b2, b3, d1, d2, d3); 454 Aadj[3*4+3] = Matrix3x3Determinant(a1, a2, a3, b1, b2, b3, c1, c2, c3); 455 }/*}}}*/ 456 void Matrix4x4Invert(IssmDouble* Ainv,IssmDouble* A){/*{{{*/ 457 458 /*Intermediaries*/ 459 IssmDouble det; 460 461 /*Compute determinant*/ 462 Matrix4x4Determinant(&det,A); 463 if(fabs(det) < DBL_EPSILON){ 464 printarray(A,4,4); 465 _error_("Determinant smaller than machine epsilon"); 466 } 467 468 /*Compute adjoint matrix*/ 469 Matrix4x4Adjoint(Ainv,A); 470 471 /*Scalte adjoint matrix to get inverse*/ 472 for(int i=0;i<4*4;i++) Ainv[i] = Ainv[i]/det; 473 }/*}}}*/ 370 474 void Matrix4x4Solve(IssmDouble* X,IssmDouble* A,IssmDouble *B){/*{{{*/ 371 _error_("STOP"); 372 }/*}}}*/ 475 IssmDouble Ainv[4][4]; 476 477 Matrix4x4Invert(&Ainv[0][0],A); 478 for(int i=0;i<4;i++) X[i]=Ainv[i][0]*B[0] + Ainv[i][1]*B[1] + Ainv[i][2]*B[2] + Ainv[i][3]*B[3]; 479 }/*}}}*/ -
issm/trunk-jpl/src/c/shared/Matrix/matrix.h
r17548 r18148 11 11 int MatrixMultiply( IssmDouble* a, int nrowa, int ncola, int itrna, IssmDouble* b, int nrowb, int ncolb, int itrnb, IssmDouble* c, int iaddc ); 12 12 int MatrixInverse( IssmDouble* a, int ndim, int nrow, IssmDouble* b, int nvec, IssmDouble* pdet ); 13 13 14 void Matrix2x2Invert(IssmDouble* Ainv, IssmDouble* A); 14 15 void Matrix2x2Determinant(IssmDouble* Adet,IssmDouble* A); 16 15 17 void Matrix3x3Invert(IssmDouble* Ainv, IssmDouble* A); 16 18 void Matrix3x3Determinant(IssmDouble* Adet,IssmDouble* A); 19 IssmDouble Matrix3x3Determinant( IssmDouble a1,IssmDouble a2,IssmDouble a3, IssmDouble b1,IssmDouble b2,IssmDouble b3, IssmDouble c1,IssmDouble c2,IssmDouble c3); 17 20 void Matrix3x3Solve(IssmDouble* X,IssmDouble* A,IssmDouble* B); 21 22 void Matrix4x4Adjoint(IssmDouble* Aadj, IssmDouble* A); 23 void Matrix4x4Invert(IssmDouble* Ainv, IssmDouble* A); 24 void Matrix4x4Determinant(IssmDouble* Adet,IssmDouble* A); 18 25 void Matrix4x4Solve(IssmDouble* X,IssmDouble* A,IssmDouble* B); 19 26
Note:
See TracChangeset
for help on using the changeset viewer.