liblapackwrap 0.1

blaswrap_core.c File Reference

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "liblapackwrap/blaswrap_<llw_typeset"
#include "liblapackwrap/blaswrap_functions_<llw_typeset"
Include dependency graph for blaswrap_core.c:

Go to the source code of this file.

Functions

h c int llw_< llw_typeset > _gemm_a (char transa, char transb, int M, int N, int K, LLW_< llw_typeset >_COMPLEX *alpha, LLW_CONST LLW_< llw_typeset >_COMPLEX *A, int LDA, LLW_CONST LLW_< llw_typeset >_COMPLEX *B, int LDB, LLW_< llw_typeset >_COMPLEX **C)
int llw_< llw_typeset > _gemm (char transa, char transb, int M, int N, int K, LLW_< llw_typeset >_COMPLEX *alpha, LLW_CONST LLW_< llw_typeset >_COMPLEX *A, int LDA, LLW_CONST LLW_< llw_typeset >_COMPLEX *B, int LDB, LLW_< llw_typeset >_COMPLEX *beta, LLW_< llw_typeset >_COMPLEX *C, int LDC)

Function Documentation

int llw_<llw_typeset> _gemm ( char  transa,
char  transb,
int  M,
int  N,
int  K,
LLW_< llw_typeset >_COMPLEX *  alpha,
LLW_CONST LLW_< llw_typeset >_COMPLEX *  A,
int  LDA,
LLW_CONST LLW_< llw_typeset >_COMPLEX *  B,
int  LDB,
LLW_< llw_typeset >_COMPLEX *  beta,
LLW_< llw_typeset >_COMPLEX *  C,
int  LDC 
)

Definition at line 43 of file blaswrap_core.c.

                                                                                                                                                                                                                                                                                      {
  int ka=(transa=='N')?K:M;
  int kb=(transb=='N')?K:N;
  LLW_<llw_typeset>_COMPLEX *a;
  LLW_<llw_typeset>_COMPLEX *b;
  #ifdef LLW_CONST
  a = (LLW_<llw_typeset>_COMPLEX*)malloc(LDA*ka*sizeof(LLW_<llw_typeset>_COMPLEX));
  if(a == NULL) return 100;
  b = (LLW_<llw_typeset>_COMPLEX*)malloc(LDA*kb*sizeof(LLW_<llw_typeset>_COMPLEX));
  if(b == NULL) {
    free(a);
    return 100;
  }
  memcpy(a, A, LDA*ka*sizeof(LLW_<llw_typeset>_COMPLEX));
  memcpy(b, B, LDB*kb*sizeof(LLW_<llw_typeset>_COMPLEX));
  #else
  a = A;
  b = B;
  #endif
  #ifdef FCALL
  GEMM(&transa, &transb, &M, &N, &K, 
       #ifdef LLW_<llw_typeset>_IS_COMPLEX
       (LAPACK_COMPLEX_TYPENAME*)alpha, 
       #else
       (LAPACK_COMPLEX_TYPENAME*)&alpha, 
       #endif
       (LAPACK_COMPLEX_TYPENAME*)a, &LDA, (LAPACK_COMPLEX_TYPENAME*)b, &LDB, 
       #ifdef LLW_<llw_typeset>_IS_COMPLEX
       (LAPACK_COMPLEX_TYPENAME*)beta, 
       #else
       (LAPACK_COMPLEX_TYPENAME*)&beta, 
       #endif
       (LAPACK_COMPLEX_TYPENAME*)C, &LDC);
  #else
  GEMM(transa, transb, M, N, K, 
       #ifdef LLW_<llw_typeset>_IS_COMPLEX
       (LAPACK_COMPLEX_TYPENAME*)alpha,
       #else
       *alpha,
       #endif
       (LAPACK_COMPLEX_TYPENAME*)a, LDA, (LAPACK_COMPLEX_TYPENAME*)b, LDB,
       #ifdef LLW_<llw_typeset>_IS_COMPLEX
       (LAPACK_COMPLEX_TYPENAME*)beta,
       #else
       *beta,
       #endif
       (LAPACK_COMPLEX_TYPENAME*)C, LDC);
  #endif
  #ifdef LLW_CONST
  free(a);
  free(b);
  #endif
  return 0;
}
h c int llw_<llw_typeset> _gemm_a ( char  transa,
char  transb,
int  M,
int  N,
int  K,
LLW_< llw_typeset >_COMPLEX *  alpha,
LLW_CONST LLW_< llw_typeset >_COMPLEX *  A,
int  LDA,
LLW_CONST LLW_< llw_typeset >_COMPLEX *  B,
int  LDB,
LLW_< llw_typeset >_COMPLEX **  C 
)

frontend for llw_<llw_typeset>_gemm but if you don't have a matrix C yet (clearly, if you're calling this routine, you want one.

Definition at line 29 of file blaswrap_core.c.

                                                                                                                                                                                                                                               {
  *C = (LLW_<llw_typeset>_COMPLEX*)malloc(M*N*sizeof(LLW_<llw_typeset>_COMPLEX));
  if((*C) == NULL) return 100;
  //fprintf(stderr, "N=%d M=%d N*M=%lu\n", M, N, (long unsigned)M*N);
  for(long unsigned i=0; i<M*N; i++) {
    //fprintf(stderr, "\tC=%p *C=%p (*C)[%lu]=%g\n", (void*)C, (void*)*C, i, (*C)[i]);
    llw_bw_<llw_typeset>_set_from_double(&((*C)[i]), 0);
    //fprintf(stderr, "\t\t->(*C)[%lu]=%g\n", i, (*C)[i]);
  }
  LLW_<llw_typeset>_COMPLEX zero;
  llw_bw_<llw_typeset>_set_from_double(&zero, 0.0);
  return llw_<llw_typeset>_gemm(transa, transb, M, N, K, alpha, A, LDA, B, LDB, &zero, *C, M);
}
 All Classes Files Functions Variables Defines