23#include "fasp_functs.h"
31#include "PreAMGUtil.inl"
71 INT cand=0,cpt=-1,fpt=1;
73 INT i,j,in1,nu=3,num1 = nu-1;
74 INT *cf=NULL,*ia=NULL,*ja=NULL;
76 REAL temp0=0.0e0,temp1=0.0e0,rho=0.0e0,tg=8.0e-01;
80 REAL *b=NULL,*u=NULL,*ma=NULL;
99#pragma omp parallel for if(i_n>OPENMP_HOLDS)
101 for(i=i_0;i<=i_n;++i) {
111#pragma omp parallel for if(i_n>OPENMP_HOLDS)
113 for(i=i_0; i<=i_n; ++i) {
122 for (i=i_0;i<=nu;++i) {
125 for (j = i_0; j<= i_n; ++j) {
134#pragma omp parallel for reduction(+:temp1) if(i_n>OPENMP_HOLDS)
136 for (i = i_0; i<= i_n; ++i) {
141 rho = sqrt(temp1)/sqrt(temp0);
143 if ( prtlvl >
PRINT_MIN ) printf(
"rho=%2.13lf\n",rho);
149 for (i = i_0; i<= i_n; ++i) {
151 if (cf[i] == cpt && temp1 > 0.0e0) {
156 temp1 = pow(0.3, nu);
162#pragma omp parallel for if(i_n>OPENMP_HOLDS)
164 for (i = i_0; i <= i_n; ++i) {
165 if (cf[i] == fpt && fabs(u[i])/temp0 > temp1 && ia[i+1]-ia[i] > 1)
169 indset(cand,cpt,fpt,ia,ja,i_n,cf,ma);
176#pragma omp parallel for if(i_n>OPENMP_HOLDS)
178 for (i = i_0; i<= i_n; ++i) {
187 if ( prtlvl >=
PRINT_MORE ) printf(
"vertices = %i\n",vertices->
row);
189 if ( prtlvl >=
PRINT_MORE ) printf(
"nc=%i\n",nc);
209static INT GraphAdd (Link *list,
215 INT prev = tail[-istack];
217 list[index].prev = prev;
219 head[-istack] = index;
221 list[prev].next = index;
222 list[index].next = -istack;
223 tail[-istack] = index;
232static INT GraphRemove (Link *list,
237 INT prev = list[index].prev;
238 INT next = list[index].next;
243 list[prev].next = next;
247 list[next].prev = prev;
272static INT indset (
INT cand,
285 INT *head, *head_mem;
286 INT *tail, *tail_mem;
288 INT i, ji, jj, jl, index, istack, stack_size;
290 for (istack = i = 0; i < n; ++i) {
294 for (ji = ia[i]+1; ji < ia[i+1]; ++ji) {
301 if (ma[i] > istack) {
302 istack = (
INT) ma[i];
305 else if (cf[i] == cpt) {
313 stack_size = 2*istack;
319 head = head_mem + stack_size;
320 tail = tail_mem + stack_size;
323#pragma omp parallel for if(stack_size>OPENMP_HOLDS)
325 for (i = -1; i >= -stack_size; i--) {
331#pragma omp parallel for if(stack_size>OPENMP_HOLDS)
333 for (i = 0; i < n; ++i) {
335 GraphAdd(list, head, tail, i, (
INT) ma[i]);
346 GraphRemove(list, head, tail, i);
349 for (ji = ia[i]+1; ji < ia[i+1]; ++ji) {
355 GraphRemove(list, head, tail, jj);
361 for (jl = ia[jj]+1; jl < ia[jj+1]; jl++) {
367 GraphRemove(list, head, tail, index);
368 GraphAdd(list, head, tail, index, (
INT) ma[index]);
369 if (ma[index] > istack) {
370 istack = (
INT) ma[index];
378 for ( ; istack > 0; istack-- ) {
380 if (head[-istack] > -1) {
void fasp_mem_free(void *mem)
Free up previous allocated memory body and set pointer to NULL.
void * fasp_mem_calloc(const unsigned int size, const unsigned int type)
Allocate, initiate, and check memory.
void fasp_smoother_dcsr_gscr(INT pt, INT n, REAL *u, INT *ia, INT *ja, REAL *a, REAL *b, INT L, INT *CF)
Gauss Seidel method restriced to a block.
INT fasp_amg_coarsening_cr(const INT i_0, const INT i_n, dCSRmat *A, ivector *vertices, AMG_param *param)
CR coarsening.
Main header file for the FASP project.
#define SHORT
FASP integer and floating point numbers.
#define TRUE
Definition of logic type.
Parameters for AMG methods.
SHORT print_level
print level for AMG
Sparse matrix of REAL type in CSR format.
REAL * val
nonzero entries of A
INT * IA
integer array of row pointers, the size is m+1
INT * JA
integer array of column indexes, the size is nnz
Vector with n entries of INT type.
INT * val
actual vector entries