Actual source code: bvec1.c

  1: /*$Id: bvec1.c,v 1.39 2001/03/23 23:21:25 balay Exp $*/

  3: /*
  4:    Defines the BLAS based vector operations. Code shared by parallel
  5:   and sequential vectors.
  6: */

  8: #include "src/vec/vecimpl.h" 
  9: #include "src/vec/impls/dvecimpl.h" 
 10: #include "petscblaslapack.h"

 12: int VecDot_Seq(Vec xin,Vec yin,Scalar *z)
 13: {
 14:   Vec_Seq *x = (Vec_Seq *)xin->data,*y = (Vec_Seq *)yin->data;
 15: #if !defined(PETSC_USE_COMPLEX)
 16:   int     one = 1;
 17: #endif

 20: #if defined(PETSC_USE_COMPLEX)
 21:   /* cannot use BLAS dot for complex because compiler/linker is 
 22:      not happy about returning a double complex */
 23:   {
 24:     int    i;
 25:     Scalar sum = 0.0,*xa = x->array,*ya = y->array;
 26:     for (i=0; i<xin->n; i++) {
 27:       sum += xa[i]*PetscConj(ya[i]);
 28:     }
 29:     *z = sum;
 30:   }
 31: #else
 32:   *z = BLdot_(&xin->n,x->array,&one,y->array,&one);
 33: #endif
 34:   PetscLogFlops(2*xin->n-1);
 35:   return(0);
 36: }

 38: int VecTDot_Seq(Vec xin,Vec yin,Scalar *z)
 39: {
 40:   Vec_Seq *x = (Vec_Seq *)xin->data,*y = (Vec_Seq *)yin->data;
 41: #if !defined(PETSC_USE_COMPLEX)
 42:  int     one = 1;
 43: #endif

 46: #if defined(PETSC_USE_COMPLEX)
 47:   /* cannot use BLAS dot for complex because compiler/linker is 
 48:      not happy about returning a double complex */
 49:   int    i;
 50:   Scalar sum = 0.0,*xa = x->array,*ya = y->array;
 51:   for (i=0; i<xin->n; i++) {
 52:     sum += xa[i]*ya[i];
 53:   }
 54:   *z = sum;
 55: #else
 56:   *z = BLdot_(&xin->n,x->array,&one,y->array,&one);
 57: #endif
 58:   PetscLogFlops(2*xin->n-1);
 59:   return(0);
 60: }

 62: int VecScale_Seq(const Scalar *alpha,Vec xin)
 63: {
 64:   Vec_Seq *x = (Vec_Seq*)xin->data;
 65:   int     one = 1;

 68:   BLscal_(&xin->n,(Scalar *)alpha,x->array,&one);
 69:   PetscLogFlops(xin->n);
 70:   return(0);
 71: }

 73: int VecCopy_Seq(Vec xin,Vec yin)
 74: {
 75:   Vec_Seq *x = (Vec_Seq *)xin->data,*y = (Vec_Seq *)yin->data;
 76:   int     ierr;

 79:   if (x->array != y->array) {
 80:     PetscMemcpy(y->array,x->array,xin->n*sizeof(Scalar));
 81:   }
 82:   return(0);
 83: }

 85: int VecSwap_Seq(Vec xin,Vec yin)
 86: {
 87:   Vec_Seq *x = (Vec_Seq *)xin->data,*y = (Vec_Seq *)yin->data;
 88:   int     one = 1;

 91:   BLswap_(&xin->n,x->array,&one,y->array,&one);
 92:   return(0);
 93: }

 95: int VecAXPY_Seq(const Scalar *alpha,Vec xin,Vec yin)
 96: {
 97:   Vec_Seq  *x = (Vec_Seq *)xin->data;
 98:   int      one = 1,ierr;
 99:   Scalar   *yarray;

102:   VecGetArray(yin,&yarray);
103:   BLaxpy_(&xin->n,(Scalar *)alpha,x->array,&one,yarray,&one);
104:   VecRestoreArray(yin,&yarray);
105:   PetscLogFlops(2*xin->n);
106:   return(0);
107: }

109: int VecAXPBY_Seq(const Scalar *alpha,const Scalar *beta,Vec xin,Vec yin)
110: {
111:   Vec_Seq  *x = (Vec_Seq *)xin->data,*y = (Vec_Seq *)yin->data;
112:   int      n = xin->n,i;
113:   Scalar   *xx = x->array,*yy = y->array,a = *alpha,b = *beta;

116:   for (i=0; i<n; i++) {
117:     yy[i] = a*xx[i] + b*yy[i];
118:   }

120:   PetscLogFlops(3*xin->n);
121:   return(0);
122: }