28#include "fasp_functs.h"
73 for ( index = i = 0; i < vertices->
row; ++i ) {
75 CoarseIndex[i] = index;
81#pragma omp parallel for private(i,j) if(P->nnz>OPENMP_HOLDS)
83 for ( i = 0; i < P->
nnz; ++i ) {
85 P->
JA[i] = CoarseIndex[j];
124 INT myid, mybegin, myend;
125 INT nthreads = fasp_get_num_threads();
135#pragma omp parallel for private(myid,mybegin,myend,i,j) if(nn>OPENMP_HOLDS)
136 for (myid=0; myid<nthreads; ++myid) {
138 for (i=mybegin; i<myend; ++i) {
142 for (j=0;j<nn;++j) rhs[j]=0.;
145 for (j=0;j<nn;++j) invmat[i*nn+j]=sol[j];
193 INT myid, mybegin, myend;
194 INT nthreads = fasp_get_num_threads();
197 memset(Aloc, 0x0,
sizeof(
REAL)*m*n);
200#pragma omp parallel for if(n>OPENMP_HOLDS) private(j)
202 for ( j=0; j<n; ++j ) {
207#pragma omp parallel for private(myid,mybegin,myend,i,j,k,iloc) if(m>OPENMP_HOLDS)
208 for ( myid=0; myid<nthreads; ++myid ) {
210 for ( i=mybegin; i<myend; ++i ) {
212 for ( i=0; i<m; ++i ) {
215 for ( k=A->
IA[iloc]; k<A->IA[iloc+1]; ++k ) {
217 if (mask[j]>=0) Aloc[i*n+mask[j]]=A->
val[k];
227#pragma omp parallel for if(n>OPENMP_HOLDS) private(j)
229 for ( j=0; j<n; ++j ) mask[cols[j]] = -1;
260 get_block(A,mm,mm,Ii,Ii,ms,mask);
262 status = invden(mm,ms,ima);
288static SHORT getinonefull (
INT **mat,
299 INT myid, mybegin, myend;
300 INT nthreads = fasp_get_num_threads();
306#pragma omp parallel for private(myid,mybegin,myend,i,j) if(mm>OPENMP_HOLDS)
307 for (myid=0; myid<nthreads; ++myid) {
309 for (i=mybegin; i<myend; ++i) {
314 mat[0][tniz+i*mm+j]=Ii[i];
315 mat[1][tniz+i*mm+j]=Ii[j];
316 matval[0][tniz+i*mm+j]=ima[i*mm+j];
324 lengths[1]=tniz+mm*mm;
352 INT *rows[2],*cols[2],nns[2],tnizs[2];
367#pragma omp parallel for if(tniz>OPENMP_HOLDS) private(i)
369 for (i=0;i<tniz;++i) {
370 rows[0][i]=mat[0][i];
371 cols[0][i]=mat[1][i];
372 vals[0][i]=matval[0][i];
384#pragma omp parallel for if(tniz>OPENMP_HOLDS) private(i)
386 for (i=0;i<tniz;++i) {
387 rows[0][i]=rows[1][i];
388 cols[0][i]=cols[1][i];
389 vals[0][i]=vals[1][i];
399#pragma omp parallel for if(tniz>OPENMP_HOLDS) private(i)
401 for (i=0;i<tniz;++i) {
402 rows[0][i]=rows[1][i];
403 cols[0][i]=cols[1][i];
404 vals[0][i]=vals[1][i];
412 for (i=0;i<tniz-1;++i) {
413 if (rows[0][i]==rows[0][i+1]&&cols[0][i]==cols[0][i+1]) {
414 vals[0][i+1]+=vals[0][i];
425#pragma omp parallel for if(tniz>OPENMP_HOLDS) private(i)
427 for (i=0;i<tniz;++i) {
428 rows[0][i]=rows[1][i];
429 cols[0][i]=cols[1][i];
430 vals[0][i]=vals[1][i];
440#pragma omp parallel for if(tniz>OPENMP_HOLDS) private(i)
442 for (i=0;i<tniz;++i) {
443 rows[0][i]=rows[1][i];
444 cols[0][i]=cols[1][i];
445 vals[0][i]=vals[1][i];
453 for (i=0;i<tnizs[0];++i)
454 if (rows[0][i]<nns[0]-1) tniz++;
457#pragma omp parallel for if(tniz>OPENMP_HOLDS) private(i)
459 for (i=0;i<tniz;++i) {
460 mat[0][i]=rows[0][i];
461 mat[1][i]=cols[0][i];
462 matval[0][i]=vals[0][i];
520 INT *Ii=NULL, *mask=NULL;
521 REAL *ima=NULL, *pex=NULL, **imas=NULL;
530 INT *iz,*izs,*izt,*izts;
541 memset(iz, 0,
sizeof(
INT)*nc);
544#pragma omp parallel for if(ittniz>OPENMP_HOLDS) private(i)
546 for (i=0;i<ittniz;++i) iz[itmat[0][i]]++;
549 for (i=1;i<nc;++i) izs[i]=izs[i-1]+iz[i-1];
553#pragma omp parallel for reduction(+:sum) if(nc>OPENMP_HOLDS) private(i)
555 for (i=0;i<nc;++i) sum+=iz[i]*iz[i];
577#pragma omp parallel for if(mm>OPENMP_HOLDS) private(j)
579 for (j=0;j<mm;++j) Ii[j]=itmat[1][izs[i]+j];
583 gentisquare_nomass(A,mm,Ii,ima,mask);
585 getinonefull(mat,matval,lengths,mm,Ii,ima);
588#pragma omp parallel for if(mm*mm>OPENMP_HOLDS) private(j)
590 for (j=0;j<mm*mm;++j) imas[i][j]=ima[j];
594#pragma omp parallel for if(numiso>OPENMP_HOLDS) private(i)
596 for (i=0;i<numiso;++i) {
597 mat[0][sum+i]=isol[i];
598 mat[1][sum+i]=isol[i];
599 matval[0][sum+i]=1.0;
603 lengths[2]=lengths[1]+numiso;
605 orderone(mat,matval,lengths);
611 memset(izt, 0,
sizeof(
INT)*nf);
614#pragma omp parallel for if(tniz>OPENMP_HOLDS) private(i)
616 for (i=0;i<tniz;++i) izt[mat[0][i]]++;
624 for (i=1;i<nf+1;++i) T.
IA[i]=T.
IA[i-1]+izt[i-1];
629#pragma omp parallel for if(tniz>OPENMP_HOLDS) private(j)
631 for (j=0;j<tniz;++j) T.
JA[j]=mat[1][j];
636#pragma omp parallel for if(tniz>OPENMP_HOLDS) private(j)
638 for (j=0;j<tniz;++j) T.
val[j]=matval[0][j];
643#pragma omp parallel for if(nf>OPENMP_HOLDS) private(i)
645 for (i=0;i<nf;++i) rhs.
val[i]=1.0;
667#pragma omp parallel for if(mm>OPENMP_HOLDS) private(j)
669 for (j=0;j<mm;++j) Ii[j]=itmat[1][izs[i]+j];
672#pragma omp parallel for if(mm*mm>OPENMP_HOLDS) private(j)
674 for (j=0;j<mm*mm;++j) ima[j]=imas[i][j];
677#pragma omp parallel for if(mm>OPENMP_HOLDS) private(k,j)
680 for (pex[k]=j=0;j<mm;++j) pex[k]+=ima[k*mm+j]*sol.
val[Ii[j]];
683#pragma omp parallel for if(mm>OPENMP_HOLDS) private(j)
685 for (j=0;j<mm;++j) itmatval[0][izs[i]+j]=pex[j];
702 for ( i=0; i<nc; ++i ) {
fasp_mem_free(imas[i]); imas[i] = NULL;}
733 INT *rows[2],*cols[2];
752 if (it->
IA[i]==it->
IA[i+1]) {
759#pragma omp parallel for if(nf>OPENMP_HOLDS) private(i,j)
762 for (j=it->
IA[i];j<it->IA[i+1];++j) itmat[0][j]=i;
766#pragma omp parallel for if(ittniz>OPENMP_HOLDS) private(j)
768 for (j=0;j<ittniz;++j) {
769 itmat[1][j]=it->
JA[j];
770 itmatval[0][j]=it->
val[j];
778#pragma omp parallel for if(ittniz>OPENMP_HOLDS) private(i)
780 for (i=0;i<ittniz;++i) {
781 rows[0][i]=itmat[0][i];
782 cols[0][i]=itmat[1][i];
783 vals[0][i]=itmat[0][i];
797#pragma omp parallel for if(ittniz>OPENMP_HOLDS) private(i)
799 for (i=0;i<ittniz;++i) {
800 itmat[0][i]=rows[1][i];
801 itmat[1][i]=cols[1][i];
802 itmatval[0][i]=vals[1][i];
804 genintval(A,itmat,itmatval,ittniz,isol,numiso,nf,nc);
807#pragma omp parallel for if(ittniz>OPENMP_HOLDS) private(i)
809 for (i=0;i<ittniz;++i) {
810 rows[0][i]=itmat[0][i];
811 cols[0][i]=itmat[1][i];
812 vals[0][i]=itmatval[0][i];
821#pragma omp parallel for if(ittniz>OPENMP_HOLDS) private(i)
823 for (i=0;i<ittniz;++i) it->
val[i]=vals[1][i];
void fasp_iarray_set(const INT n, INT *x, const INT val)
Set initial value for an array to be x=val.
void fasp_mem_free(void *mem)
Free up previous allocated memory body and set pointer to NULL.
void * fasp_mem_realloc(void *oldmem, const LONGLONG tsize)
Reallocate, initiate, and check memory.
void * fasp_mem_calloc(const unsigned int size, const unsigned int type)
Allocate, initiate, and check memory.
void fasp_get_start_end(const INT procid, const INT nprocs, const INT n, INT *start, INT *end)
Assign Load to each thread.
void fasp_dvec_free(dvector *u)
Free vector data space of REAL type.
SHORT fasp_smat_lu_decomp(REAL *A, INT pivot[], const INT n)
LU decomposition of A using Doolittle's method.
SHORT fasp_smat_lu_solve(const REAL *A, REAL b[], const INT pivot[], REAL x[], const INT n)
Solving Ax=b using LU decomposition.
void fasp_dcsr_free(dCSRmat *A)
Free CSR sparse matrix data memory space.
void fasp_dcsr_transpose(INT *row[2], INT *col[2], REAL *val[2], INT *nn, INT *tniz)
Transpose of a dCSRmat matrix.
void fasp_dcsr_getdiag(INT n, const dCSRmat *A, dvector *diag)
Get first n diagonal entries of a CSR matrix A.
INT fasp_solver_dcsr_pcg(dCSRmat *A, dvector *b, dvector *u, precond *pc, const REAL tol, const REAL abstol, const INT MaxIt, const SHORT StopType, const SHORT PrtLvl)
Preconditioned conjugate gradient method for solving Au=b.
void fasp_amg_interp_em(dCSRmat *A, ivector *vertices, dCSRmat *P, AMG_param *param)
Energy-min interpolation.
void fasp_precond_diag(REAL *r, REAL *z, void *data)
Diagonal preconditioner z=inv(D)*r.
Main header file for the FASP project.
#define SHORT
FASP integer and floating point numbers.
#define FASP_SUCCESS
Definition of return status and error messages.
#define STOP_REL_RES
Definition of iterative solver stopping criteria types.
#define PRINT_NONE
Print level for all subroutines – not including DEBUG output.
Parameters for AMG methods.
Sparse matrix of REAL type in CSR format.
INT col
column of matrix A, n
REAL * val
nonzero entries of A
INT row
row number of matrix A, m
INT * IA
integer array of row pointers, the size is m+1
INT nnz
number of nonzero entries
INT * JA
integer array of column indexes, the size is nnz
Vector with n entries of REAL type.
REAL * val
actual vector entries
Vector with n entries of INT type.
INT * val
actual vector entries
Preconditioner data and action.
void * data
data for preconditioner, void pointer
void(* fct)(REAL *, REAL *, void *)
action for preconditioner, void function pointer