Fast Auxiliary Space Preconditioning 2.7.7 Aug/28/2022
Loading...
Searching...
No Matches
BlaVector.c
Go to the documentation of this file.
1
14#include <math.h>
15
16#ifdef _OPENMP
17#include <omp.h>
18#endif
19
20#include "fasp.h"
21#include "fasp_functs.h"
22
23/*---------------------------------*/
24/*-- Public Functions --*/
25/*---------------------------------*/
26
42 const dvector *x,
43 dvector *y)
44{
45 const INT m = x->row;
46 const REAL *xpt = x->val;
47 REAL *ypt = y->val;
48
49 SHORT use_openmp = FALSE;
50 INT i;
51
52#ifdef _OPENMP
53 INT myid, mybegin, myend, nthreads;
54 if ( m > OPENMP_HOLDS ) {
55 use_openmp = TRUE;
56 nthreads = fasp_get_num_threads();
57 }
58#endif
59
60 if ( y->row != m ) {
61 printf("### ERROR: Vectors have different dimensions!\n");
62 fasp_chkerr(ERROR_DATA_STRUCTURE, __FUNCTION__);
63 }
64
65 if (use_openmp) {
66#ifdef _OPENMP
67#pragma omp parallel private(myid,mybegin,myend,i) num_threads(nthreads)
68 {
69 myid = omp_get_thread_num();
70 fasp_get_start_end (myid, nthreads, m, &mybegin, &myend);
71 for ( i = mybegin; i < myend; ++i ) ypt[i] += a*xpt[i];
72 }
73#endif
74 }
75 else {
76 for ( i = 0; i < m; ++i ) ypt[i] += a*xpt[i];
77 }
78}
79
97 const dvector *x,
98 const dvector *y,
99 dvector *z)
100{
101 const INT m = x->row;
102 const REAL *xpt = x->val, *ypt = y->val;
103 REAL *zpt = z->val;
104
105 if ( y->row != m ) {
106 printf("### ERROR: Vectors have different dimensions!\n");
107 fasp_chkerr(ERROR_DATA_STRUCTURE, __FUNCTION__);
108 }
109
110 z->row = m;
111
112 memcpy (zpt, ypt, m*sizeof(REAL));
113 fasp_blas_darray_axpy (m, a, xpt, zpt);
114}
115
131{
132 const INT length = x->row;
133 const REAL *xpt = x->val;
134
135 register REAL onenorm = 0.0;
136 SHORT use_openmp = FALSE;
137 INT i;
138
139#ifdef _OPENMP
140 if ( length > OPENMP_HOLDS ) {
141 use_openmp = TRUE;
142 }
143#endif
144
145 if ( use_openmp ) {
146#ifdef _OPENMP
147#pragma omp parallel for reduction(+:onenorm) private(i)
148#endif
149 for ( i = 0; i < length; ++i ) onenorm += ABS(xpt[i]);
150 }
151 else {
152 for ( i = 0; i < length; ++i ) onenorm += ABS(xpt[i]);
153 }
154
155 return onenorm;
156}
157
171{
172 const INT length = x->row;
173 const REAL *xpt = x->val;
174
175 register REAL twonorm = 0.0;
176 SHORT use_openmp = FALSE;
177 INT i;
178
179#ifdef _OPENMP
180 if ( length > OPENMP_HOLDS ) use_openmp = TRUE;
181#endif
182
183 if ( use_openmp ) {
184#ifdef _OPENMP
185#pragma omp parallel for reduction(+:twonorm) private(i)
186#endif
187 for ( i = 0; i < length; ++i ) twonorm += xpt[i]*xpt[i];
188 }
189 else {
190 for ( i = 0; i < length; ++i ) twonorm += xpt[i]*xpt[i];
191 }
192
193 return sqrt(twonorm);
194}
195
209{
210 const INT length=x->row;
211 const REAL *xpt=x->val;
212
213 register REAL infnorm = 0.0;
214 register INT i;
215
216 for ( i = 0; i < length; ++i ) infnorm = MAX(infnorm, ABS(xpt[i]));
217
218 return infnorm;
219}
220
237 const dvector *y)
238{
239 const INT length = x->row;
240 const REAL *xpt = x->val, *ypt = y->val;
241
242 register REAL value = 0.0;
243 SHORT use_openmp = FALSE;
244 INT i;
245
246#ifdef _OPENMP
247 if ( length > OPENMP_HOLDS ) use_openmp = TRUE;
248#endif
249
250 if (use_openmp) {
251#ifdef _OPENMP
252#pragma omp parallel for reduction(+:value) private(i)
253#endif
254 for ( i = 0; i < length; ++i ) value += xpt[i] * ypt[i];
255 }
256 else {
257 for ( i = 0; i < length; ++i ) value += xpt[i] * ypt[i];
258 }
259
260 return value;
261}
262
279 const dvector *y)
280{
281 const INT length = x->row;
282 const REAL *xpt = x->val, *ypt = y->val;
283
284 SHORT use_openmp = FALSE;
285 REAL diff = 0.0, temp = 0.0;
286 INT i;
287
288 if ( length != y->row ) {
289 printf("### ERROR: Vectors have different dimensions!\n");
290 fasp_chkerr(ERROR_DATA_STRUCTURE, __FUNCTION__);
291 }
292
293#ifdef _OPENMP
294 if ( length > OPENMP_HOLDS ) use_openmp = TRUE;
295#endif
296
297 if ( use_openmp ) {
298#ifdef _OPENMP
299#pragma omp parallel for reduction(+:temp,diff) private(i)
300#endif
301 for ( i = 0; i < length; ++i ) {
302 temp += xpt[i]*xpt[i];
303 diff += pow(xpt[i]-ypt[i],2);
304 }
305 }
306 else {
307 for ( i = 0; i < length; ++i ) {
308 temp += xpt[i]*xpt[i];
309 diff += pow(xpt[i]-ypt[i],2);
310 }
311 }
312
313 return sqrt(diff/temp);
314}
315
316/*---------------------------------*/
317/*-- End of File --*/
318/*---------------------------------*/
void fasp_chkerr(const SHORT status, const char *fctname)
Check error status and print out error messages before quit.
Definition: AuxMessage.c:213
void fasp_get_start_end(const INT procid, const INT nprocs, const INT n, INT *start, INT *end)
Assign Load to each thread.
Definition: AuxThreads.c:93
void fasp_blas_darray_axpy(const INT n, const REAL a, const REAL *x, REAL *y)
y = a*x + y
Definition: BlaArray.c:90
void fasp_blas_dvec_axpy(const REAL a, const dvector *x, dvector *y)
y = a*x + y
Definition: BlaVector.c:41
void fasp_blas_dvec_axpyz(const REAL a, const dvector *x, const dvector *y, dvector *z)
z = a*x + y, z is a third vector (z is cleared)
Definition: BlaVector.c:96
REAL fasp_blas_dvec_norminf(const dvector *x)
Linf norm of dvector x.
Definition: BlaVector.c:208
REAL fasp_blas_dvec_norm1(const dvector *x)
L1 norm of dvector x.
Definition: BlaVector.c:130
REAL fasp_blas_dvec_relerr(const dvector *x, const dvector *y)
Relative difference between two dvector x and y.
Definition: BlaVector.c:278
REAL fasp_blas_dvec_dotprod(const dvector *x, const dvector *y)
Inner product of two vectors (x,y)
Definition: BlaVector.c:236
REAL fasp_blas_dvec_norm2(const dvector *x)
L2 norm of dvector x.
Definition: BlaVector.c:170
Main header file for the FASP project.
#define REAL
Definition: fasp.h:75
#define SHORT
FASP integer and floating point numbers.
Definition: fasp.h:71
#define ABS(a)
Definition: fasp.h:84
#define MAX(a, b)
Definition of max, min, abs.
Definition: fasp.h:82
#define INT
Definition: fasp.h:72
#define ERROR_DATA_STRUCTURE
Definition: fasp_const.h:31
#define OPENMP_HOLDS
Definition: fasp_const.h:269
#define TRUE
Definition of logic type.
Definition: fasp_const.h:61
#define FALSE
Definition: fasp_const.h:62
Vector with n entries of REAL type.
Definition: fasp.h:354
REAL * val
actual vector entries
Definition: fasp.h:360
INT row
number of rows
Definition: fasp.h:357