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: }