Changeset 18148


Ignore:
Timestamp:
06/12/14 14:38:13 (11 years ago)
Author:
Mathieu Morlighem
Message:

NEW: implemeted matrix inversion

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  
    33 */
    44
     5#include "../Elements/elements.h"
    56/*Headers*/
    67/*{{{*/
     
    309310        return noerr;
    310311}/*}}}*/
     312
    311313void Matrix2x2Determinant(IssmDouble* Adet,IssmDouble* A){/*{{{*/
    312314        /*Compute determinant of a 2x2 matrix*/
     
    332334
    333335}/*}}}*/
     336
    334337void Matrix3x3Determinant(IssmDouble* Adet,IssmDouble* A){/*{{{*/
    335338        /*Compute determinant of a 3x3 matrix*/
     
    337340        /*det = a*(e*i-f*h)-b*(d*i-f*g)+c*(d*h-e*g)*/
    338341        *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/*}}}*/
     344IssmDouble 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;
    339352}
    340353/*}}}*/
     
    368381
    369382}/*}}}*/
     383
     384void 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/*}}}*/
     413void 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}/*}}}*/
     456void 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}/*}}}*/
    370474void 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  
    1111int  MatrixMultiply( IssmDouble* a, int nrowa, int ncola, int itrna, IssmDouble* b, int nrowb, int ncolb, int itrnb, IssmDouble* c, int iaddc );
    1212int  MatrixInverse( IssmDouble* a, int ndim, int nrow, IssmDouble* b, int nvec, IssmDouble* pdet );
     13
    1314void Matrix2x2Invert(IssmDouble* Ainv, IssmDouble* A);
    1415void Matrix2x2Determinant(IssmDouble* Adet,IssmDouble* A);
     16
    1517void Matrix3x3Invert(IssmDouble* Ainv, IssmDouble* A);
    1618void Matrix3x3Determinant(IssmDouble* Adet,IssmDouble* A);
     19IssmDouble Matrix3x3Determinant( IssmDouble a1,IssmDouble a2,IssmDouble a3, IssmDouble b1,IssmDouble b2,IssmDouble b3, IssmDouble c1,IssmDouble c2,IssmDouble c3);
    1720void Matrix3x3Solve(IssmDouble* X,IssmDouble* A,IssmDouble* B);
     21
     22void Matrix4x4Adjoint(IssmDouble* Aadj, IssmDouble* A);
     23void Matrix4x4Invert(IssmDouble* Ainv, IssmDouble* A);
     24void Matrix4x4Determinant(IssmDouble* Adet,IssmDouble* A);
    1825void Matrix4x4Solve(IssmDouble* X,IssmDouble* A,IssmDouble* B);
    1926
Note: See TracChangeset for help on using the changeset viewer.