// ============================= // multiply: C = op(A) * op(B) // ============================= void mulMatMat(double* C, double* A, double* B, const int rA, const int cA, const int rB, const int cB, const char *mod) { #ifndef USE_BLAS // naive C implementations if ( (mod[0] == 'N') && (mod[1] == 'N') ) multAB(C, A, B,rA, cA, cB); else if ( (mod[0] == 'T') && (mod[1] == 'N') ) multAtB(C, A, B, rA, cA, cB); else if ( (mod[0] == 'N') && (mod[1] == 'T') ) multABt(C, A, B, rA, cA, rB); else if ( (mod[0] == 'T') && (mod[1] == 'T') ) multAtBt(C, A, B, rA, cA, rB); #else // rows(Op(A)), columns(Op(A)), columns(Op(B)), rows(C) ptrdiff_t ropA, copA, copB, rC; // can't pass consts to fortran ptrdiff_t rA0 = rA, rB0 = rB; char modA = mod[0], modB = mod[1]; double one = 1.0, zero = 0.0; if (mod[0] != 'S'){ if ( (mod[0] == 'N') && (mod[1] == 'N') ){ ropA = rA; copA = cA; copB = cB; rC = rA; } else if ( (mod[0] == 'T') && (mod[1] == 'N') ){ ropA = cA; copA = rA; copB = cB; rC = cA; } else if ( (mod[0] == 'N') && (mod[1] == 'T') ){ ropA = rA; copA = cA; copB = rB; rC = rA; } else if ( (mod[0] == 'T') && (mod[1] == 'T') ){ ropA = cA; copA = rA; copB = rB; rC = cA; } dgemm(&modA, &modB, &ropA, &copB, &copA, &one, A, &rA0, B, &rB0, &zero, C, &rC); } else { char side='L', uplo = 'U'; ropA = rA; copB = cB; dsymm(&side, &uplo, &ropA, &copB, &one, A, &rA0, B, &rB0, &zero, C, &rC); // why the f**k does this not work ??? } #endif }
void toast::lapack::symm ( char * SIDE, char * UPLO, int * M, int * N, double * ALPHA, double * A, int * LDA, double * B, int * LDB, double * BETA, double * C, int * LDC ) { dsymm ( SIDE, UPLO, M, N, ALPHA, A, LDA, B, LDB, BETA, C, LDC ); return; }