//=====================================================
// File   :  f77_interface.hh
// Author :  L. Plagne <laurent.plagne@edf.fr)>
// Copyright (C) EDF R&D,  lun sep 30 14:23:24 CEST 2002
//=====================================================
//
// This program is free software; you can redistribute it and/or
// modify it under the terms of the GNU General Public License
// as published by the Free Software Foundation; either version 2
// of the License, or (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License for more details.
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
//
#ifndef F77_INTERFACE_HH
#define F77_INTERFACE_HH
#include "f77_interface_base.hh"
#include <string>

extern "C"
{
  void dmxv_(double * A, int * N, double * X, int * M, double *R);
  void smxv_(float * A, int * N, float * X, int * M, float *R);

  void dmxm_(double * A, int * N, double * B, int * M, double *C, int * K);
  void smxm_(float * A, int * N, float * B, int * M, float *C, int * K);

  void data_(double * A, double *X, int * N);
  void sata_(float * A, float *X, int * N);

  void daat_(double * A, double *X, int * N);
  void saat_(float * A, float *X, int * N);

  void saxpy_(int * N, float * coef, float * X, float *Y);
  void daxpy_(int * N, double * coef, double * X, double *Y);
}

template<class real>
class f77_interface : public f77_interface_base<real>
{
public :

  typedef typename f77_interface_base<real>::gene_matrix gene_matrix;
  typedef typename f77_interface_base<real>::gene_vector gene_vector;

  static inline std::string name( void )
  {
    return "f77";
  }

  static inline void matrix_vector_product(gene_matrix & A, gene_vector & B, gene_vector & X, int N)
  {
    dmxv_(A,&N,B,&N,X);
  }

  static inline void matrix_matrix_product(gene_matrix & A, gene_matrix & B, gene_matrix & X, int N)
  {
    dmxm_(A,&N,B,&N,X,&N);
  }

  static inline void ata_product(gene_matrix & A, gene_matrix & X, int N)
  {
    data_(A,X,&N);
  }

  static inline void aat_product(gene_matrix & A, gene_matrix & X, int N)
  {
    daat_(A,X,&N);
  }

  static  inline void axpy(real coef, const gene_vector & X, gene_vector & Y, int N)
  {
    int one=1;
    daxpy_(&N,&coef,X,Y);
  }


};


template<>
class f77_interface<float> : public f77_interface_base<float>
{
public :

  static inline std::string name( void )
  {
    return "F77";
  }


  static inline void matrix_vector_product(gene_matrix & A, gene_vector & B, gene_vector & X, int N)
  {
    smxv_(A,&N,B,&N,X);
  }

  static inline void matrix_matrix_product(gene_matrix & A, gene_matrix & B, gene_matrix & X, int N)
  {
    smxm_(A,&N,B,&N,X,&N);
  }

  static inline void ata_product(gene_matrix & A, gene_matrix & X, int N)
  {
    sata_(A,X,&N);
  }

  static inline void aat_product(gene_matrix & A, gene_matrix & X, int N)
  {
    saat_(A,X,&N);
  }


  static  inline void axpy(float coef, const gene_vector & X, gene_vector & Y, int N)
  {
    saxpy_(&N,&coef,X,Y);
  }

};


#endif



