Fast Auxiliary Space Preconditioning 2.7.7 Aug/28/2022
Loading...
Searching...
No Matches
AuxVector.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
40{
41 INT i;
42
43 for ( i = 0; i < u->row; i++ ) {
44 if ( isnan(u->val[i]) ) return TRUE;
45 }
46
47 return FALSE;
48}
49
63{
64 dvector u;
65
66 u.row = m;
67 u.val = (REAL *)fasp_mem_calloc(m,sizeof(REAL));
68
69 return u;
70}
71
85{
86 ivector u;
87
88 u.row = m;
89 u.val = (INT *)fasp_mem_calloc(m,sizeof(INT));
90
91 return u;
92}
93
105void fasp_dvec_alloc (const INT m,
106 dvector *u)
107{
108 u->row = m;
109 u->val = (REAL*)fasp_mem_calloc(m,sizeof(REAL));
110
111 return;
112}
113
125void fasp_ivec_alloc (const INT m,
126 ivector *u)
127{
128
129 u->row = m;
130 u->val = (INT*)fasp_mem_calloc(m,sizeof(INT));
131
132 return;
133}
134
146{
147 if ( u == NULL ) return;
148
149 fasp_mem_free(u->val); u->val = NULL; u->row = 0;
150}
151
165{
166 if ( u == NULL ) return;
167
168 fasp_mem_free(u->val); u->val = NULL; u->row = 0;
169}
170
192void fasp_dvec_rand (const INT n,
193 dvector *x)
194{
195 const INT va = 0;
196 const INT vb = n;
197
198 INT s=1, i,j;
199
200 srand(s);
201 for ( i = 0; i < n; ++i ) {
202 j = 1 + (INT) (((REAL)n)*rand()/(RAND_MAX+1.0));
203 x->val[i] = (((REAL)j)-va)/(vb-va);
204 }
205 x->row = n;
206}
207
223 dvector *x,
224 const REAL val)
225{
226 INT i;
227 REAL *xpt = x->val;
228
229 if ( n > 0 ) x->row = n;
230 else n = x->row;
231
232#ifdef _OPENMP
233 // variables for OpenMP
234 INT myid, mybegin, myend;
235 INT nthreads = fasp_get_num_threads();
236#endif
237
238 if (val == 0.0) {
239
240#ifdef _OPENMP
241 if (n > OPENMP_HOLDS) {
242#pragma omp parallel for private(myid, mybegin, myend)
243 for (myid = 0; myid < nthreads; myid++ ) {
244 fasp_get_start_end(myid, nthreads, n, &mybegin, &myend);
245 memset(&xpt[mybegin], 0x0, sizeof(REAL)*(myend-mybegin));
246 }
247 }
248 else {
249#endif
250 memset(xpt, 0x0, sizeof(REAL)*n);
251#ifdef _OPENMP
252 }
253#endif
254
255 }
256
257 else {
258
259#ifdef _OPENMP
260 if (n > OPENMP_HOLDS) {
261#pragma omp parallel for private(myid, mybegin, myend)
262 for (myid = 0; myid < nthreads; myid++ ) {
263 fasp_get_start_end(myid, nthreads, n, &mybegin, &myend);
264 for (i=mybegin; i<myend; ++i) xpt[i]=val;
265 }
266 }
267 else {
268#endif
269 for (i=0; i<n; ++i) xpt[i]=val;
270#ifdef _OPENMP
271 }
272#endif
273
274 }
275}
276
292 ivector *u,
293 const INT m)
294{
295 SHORT nthreads = 1, use_openmp = FALSE;
296 INT i;
297
298 if ( n > 0 ) u->row = n;
299 else n = u->row;
300
301#ifdef _OPENMP
302 if ( n > OPENMP_HOLDS ) {
303 use_openmp = TRUE;
304 nthreads = fasp_get_num_threads();
305 }
306#endif
307
308 if (use_openmp) {
309 INT mybegin, myend, myid;
310#ifdef _OPENMP
311#pragma omp parallel for private(myid, mybegin, myend, i)
312#endif
313 for (myid = 0; myid < nthreads; myid++ ) {
314 fasp_get_start_end(myid, nthreads, n, &mybegin, &myend);
315 for (i=mybegin; i<myend; ++i) u->val[i] = m;
316 }
317 }
318 else {
319 for (i=0; i<n; ++i) u->val[i] = m;
320 }
321}
322
334void fasp_dvec_cp (const dvector *x,
335 dvector *y)
336{
337 y->row = x->row;
338 memcpy(y->val,x->val,x->row*sizeof(REAL));
339}
340
358 const dvector *y)
359{
360 const INT length = x->row;
361 const REAL *xpt = x->val, *ypt = y->val;
362
363 SHORT use_openmp = FALSE;
364 INT i;
365 REAL Linf = 0.0, diffi = 0.0;
366
367#ifdef _OPENMP
368 INT myid, mybegin, myend, nthreads;
369 if ( length > OPENMP_HOLDS ) {
370 use_openmp = TRUE;
371 nthreads = fasp_get_num_threads();
372 }
373#endif
374
375 if(use_openmp) {
376#ifdef _OPENMP
377 REAL temp = 0.;
378#pragma omp parallel firstprivate(temp) private(myid, mybegin, myend, i, diffi)
379 {
380 myid = omp_get_thread_num();
381 fasp_get_start_end(myid, nthreads, length, &mybegin, &myend);
382 for(i=mybegin; i<myend; i++) {
383 if ((diffi = ABS(xpt[i]-ypt[i])) > temp) temp = diffi;
384 }
385#pragma omp critical
386 if(temp > Linf) Linf = temp;
387 }
388#endif
389 }
390 else {
391 for (i=0; i<length; ++i) {
392 if ((diffi = ABS(xpt[i]-ypt[i])) > Linf) Linf = diffi;
393 }
394 }
395
396 return Linf;
397}
398
411 const dvector *diag)
412{
413 // information about dvector
414 const INT n = b->row;
415 REAL *val = b->val;
416
417 // local variables
418 SHORT use_openmp = FALSE;
419 INT i;
420
421 if ( diag->row != n ) {
422 printf("### ERROR: Sizes of diag = %d != dvector = %d!", diag->row, n);
423 fasp_chkerr(ERROR_MISC, __FUNCTION__);
424 }
425
426#ifdef _OPENMP
427 INT mybegin, myend, myid, nthreads;
428 if ( n > OPENMP_HOLDS ){
429 use_openmp = TRUE;
430 nthreads = fasp_get_num_threads();
431 }
432#endif
433
434 if (use_openmp) {
435#ifdef _OPENMP
436#pragma omp parallel for private(myid, mybegin,myend)
437 for (myid = 0; myid < nthreads; myid++ ) {
438 fasp_get_start_end(myid, nthreads, n, &mybegin, &myend);
439 for (i=mybegin; i<myend; ++i) val[i] = val[i]/sqrt(diag->val[i]);
440 }
441#endif
442 }
443 else {
444 for (i=0; i<n; ++i) val[i] = val[i]/sqrt(diag->val[i]);
445 }
446
447 return;
448}
449
450/*---------------------------------*/
451/*-- End of File --*/
452/*---------------------------------*/
void fasp_mem_free(void *mem)
Free up previous allocated memory body and set pointer to NULL.
Definition: AuxMemory.c:152
void * fasp_mem_calloc(const unsigned int size, const unsigned int type)
Allocate, initiate, and check memory.
Definition: AuxMemory.c:65
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_dvec_free(dvector *u)
Free vector data space of REAL type.
Definition: AuxVector.c:145
void fasp_ivec_free(ivector *u)
Free vector data space of INT type.
Definition: AuxVector.c:164
void fasp_ivec_alloc(const INT m, ivector *u)
Create vector data space of INT type.
Definition: AuxVector.c:125
dvector fasp_dvec_create(const INT m)
Create dvector data space of REAL type.
Definition: AuxVector.c:62
ivector fasp_ivec_create(const INT m)
Create vector data space of INT type.
Definition: AuxVector.c:84
void fasp_dvec_rand(const INT n, dvector *x)
Generate fake random REAL vector in the range from 0 to 1.
Definition: AuxVector.c:192
void fasp_ivec_set(INT n, ivector *u, const INT m)
Set ivector value to be m.
Definition: AuxVector.c:291
void fasp_dvec_set(INT n, dvector *x, const REAL val)
Initialize dvector x[i]=val for i=0:n-1.
Definition: AuxVector.c:222
REAL fasp_dvec_maxdiff(const dvector *x, const dvector *y)
Maximal difference of two dvector x and y.
Definition: AuxVector.c:357
void fasp_dvec_alloc(const INT m, dvector *u)
Create dvector data space of REAL type.
Definition: AuxVector.c:105
void fasp_dvec_cp(const dvector *x, dvector *y)
Copy dvector x to dvector y.
Definition: AuxVector.c:334
void fasp_dvec_symdiagscale(dvector *b, const dvector *diag)
Symmetric diagonal scaling D^{-1/2}b.
Definition: AuxVector.c:410
SHORT fasp_dvec_isnan(const dvector *u)
Check a dvector whether there is NAN.
Definition: AuxVector.c:39
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 INT
Definition: fasp.h:72
#define ERROR_MISC
Definition: fasp_const.h:28
#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
Vector with n entries of INT type.
Definition: fasp.h:368
INT row
number of rows
Definition: fasp.h:371
INT * val
actual vector entries
Definition: fasp.h:374