1 /* 2 * Copyright (C) 2015 FFLAS-FFPACK 3 * 4 * Written by Brice Boyer (briceboyer) <boyer.brice@gmail.com> 5 * 6 * 7 * ========LICENCE======== 8 * This file is part of the library FFLAS-FFPACK. 9 * 10 * FFLAS-FFPACK is free software: you can redistribute it and/or modify 11 * it under the terms of the GNU Lesser General Public 12 * License as published by the Free Software Foundation; either 13 * version 2.1 of the License, or (at your option) any later version. 14 * 15 * This library is distributed in the hope that it will be useful, 16 * but WITHOUT ANY WARRANTY; without even the implied warranty of 17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 18 * Lesser General Public License for more detAils. 19 * 20 * You should have received a copy of the GNU Lesser General Public 21 * License along with this library; if not, write to the Free Software 22 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 23 * ========LICENCE======== 24 *. 25 */ 26 27 /** @file fflas_lvl3.C 28 * @author Brice Boyer 29 * @brief C functions calls for level 3 FFLAS in fflas-c.h 30 * @see fflas/fflas_level3.inl 31 */ 32 33 #include "fflas-ffpack/interfaces/libs/fflas_c.h" 34 #include "fflas-ffpack/fflas/fflas.h" 35 #include "givaro/modular-balanced.h" 36 #include "givaro/modular.h" 37 38 using Givaro::Modular ; 39 using Givaro::ModularBalanced ; 40 using namespace FFLAS ; 41 42 43 #ifdef __cplusplus 44 extern "C" { 45 #endif 46 47 void ftrsm_3_modular_double(const double p,const enum FFLAS_C_SIDE Side,const enum FFLAS_C_UPLO Uplo,const enum FFLAS_C_TRANSPOSE tA,const enum FFLAS_C_DIAG Diag,const size_t m,const size_t n,const double alpha,const double * A,const size_t ldA,double * B,const size_t ldB,bool positive)48 ftrsm_3_modular_double (const double p, const enum FFLAS_C_SIDE Side, 49 const enum FFLAS_C_UPLO Uplo, 50 const enum FFLAS_C_TRANSPOSE tA, 51 const enum FFLAS_C_DIAG Diag, 52 const size_t m, const size_t n, 53 const double alpha, 54 const double * A, 55 const size_t ldA, 56 double * B, const size_t ldB 57 , bool positive ) 58 { 59 if (positive) { 60 Modular<double> F(p); 61 ftrsm(F,(enum FFLAS_SIDE)Side,(enum FFLAS_UPLO)Uplo,(FFLAS_TRANSPOSE)tA,(enum FFLAS_DIAG)Diag,m,n,alpha,A,ldA,B,ldB); 62 } else { 63 ModularBalanced<double> F(p); 64 ftrsm(F,(enum FFLAS_SIDE)Side,(enum FFLAS_UPLO)Uplo,(FFLAS_TRANSPOSE)tA,(enum FFLAS_DIAG)Diag,m,n,alpha,A,ldA,B,ldB); 65 } 66 } 67 68 69 void ftrmm_3_modular_double(const double p,const enum FFLAS_C_SIDE Side,const enum FFLAS_C_UPLO Uplo,const enum FFLAS_C_TRANSPOSE tA,const enum FFLAS_C_DIAG Diag,const size_t m,const size_t n,const double alpha,double * A,const size_t ldA,double * B,const size_t ldB,bool positive)70 ftrmm_3_modular_double (const double p, const enum FFLAS_C_SIDE Side, 71 const enum FFLAS_C_UPLO Uplo, 72 const enum FFLAS_C_TRANSPOSE tA, 73 const enum FFLAS_C_DIAG Diag, 74 const size_t m, const size_t n, 75 const double alpha, 76 double * A, const size_t ldA, 77 double * B, const size_t ldB 78 , bool positive ) 79 { 80 if (positive) { 81 Modular<double> F(p); 82 ftrmm(F,(enum FFLAS_SIDE)Side,(enum FFLAS_UPLO)Uplo,(FFLAS_TRANSPOSE)tA,(enum FFLAS_DIAG)Diag,m,n,alpha,A,ldA,B,ldB); 83 } else { 84 ModularBalanced<double> F(p); 85 ftrmm(F,(enum FFLAS_SIDE)Side,(enum FFLAS_UPLO)Uplo,(FFLAS_TRANSPOSE)tA,(enum FFLAS_DIAG)Diag,m,n,alpha,A,ldA,B,ldB); 86 } 87 } 88 89 double * fgemm_3_modular_double(const double p,const enum FFLAS_C_TRANSPOSE tA,const enum FFLAS_C_TRANSPOSE tB,const size_t m,const size_t n,const size_t k,const double alpha,const double * A,const size_t ldA,const double * B,const size_t ldB,const double betA,double * C,const size_t ldC,bool positive)90 fgemm_3_modular_double( const double p, 91 const enum FFLAS_C_TRANSPOSE tA, 92 const enum FFLAS_C_TRANSPOSE tB, 93 const size_t m, 94 const size_t n, 95 const size_t k, 96 const double alpha, 97 const double * A, const size_t ldA, 98 const double * B, const size_t ldB, 99 const double betA, 100 double * C, const size_t ldC, 101 bool positive ) 102 103 { 104 if (positive) { 105 Modular<double> F(p); 106 return fgemm(F,(FFLAS_TRANSPOSE)tA,(FFLAS_TRANSPOSE)tB,m,n,k,alpha,A,ldA,B,ldB,betA,C,ldC); 107 } else { 108 ModularBalanced<double> F(p); 109 return fgemm(F,(FFLAS_TRANSPOSE)tA,(FFLAS_TRANSPOSE)tB,m,n,k,alpha,A,ldA,B,ldB,betA,C,ldC); 110 } 111 return nullptr; 112 } 113 114 115 double * fsquare_3_modular_double(const double p,const enum FFLAS_C_TRANSPOSE tA,const size_t n,const double alpha,const double * A,const size_t ldA,const double betA,double * C,const size_t ldC,bool positive)116 fsquare_3_modular_double (const double p, 117 const enum FFLAS_C_TRANSPOSE tA, 118 const size_t n, 119 const double alpha, 120 const double * A, 121 const size_t ldA, 122 const double betA, 123 double * C, 124 const size_t ldC 125 , bool positive ) 126 { 127 if (positive) { 128 Modular<double> F(p); 129 return fsquare(F,(FFLAS_TRANSPOSE)tA,n,alpha,A,ldA,betA,C,ldC); 130 } else { 131 ModularBalanced<double> F(p); 132 return fsquare(F,(FFLAS_TRANSPOSE)tA,n,alpha,A,ldA,betA,C,ldC); 133 } 134 return nullptr; 135 } 136 137 138 139 #ifdef __cplusplus 140 } 141 #endif 142 /* -*- mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ 143 // vim:sts=4:sw=4:ts=4:et:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s 144