18#include "fasp_functs.h"
55 const REAL atol = 1.0E-15;
56 const INT max_itr_num = 100;
59 REAL norm_r, norm_r0, norm_r1, factor, error =
BIGREAL;
60 INT i, *level, count = 0;
61 REAL AMG_start = 0, AMG_end;
64 printf(
"### DEBUG: [-Begin-] %s ...\n", __FUNCTION__);
65 printf(
"### DEBUG: nx=%d, maxlevel=%d\n", nx, maxlevel);
70 printf(
"Num of DOF's: %d\n", nx+1);
74 level = (
INT *)malloc((maxlevel+2)*
sizeof(
INT));
75 level[0] = 0; level[1] = nx+1;
76 for (i = 1; i < maxlevel; i++) {
77 level[i+1] = level[i]+(level[i]-level[i-1]+1)/2;
79 level[maxlevel+1] = level[maxlevel]+1;
82 u0 = (
REAL *)malloc(level[maxlevel]*
sizeof(
REAL));
83 b0 = (
REAL *)malloc(level[maxlevel]*
sizeof(
REAL));
84 r0 = (
REAL *)malloc(level[maxlevel]*
sizeof(
REAL));
95 residual1d(u0, b0, r0, 0, level);
96 norm_r0 = l2norm(r0, level, 0);
98 if (norm_r0 < atol)
goto FINISHED;
101 printf(
"-----------------------------------------------------------\n");
102 printf(
"It Num | ||r||/||b|| | ||r|| | Conv. Factor\n");
103 printf(
"-----------------------------------------------------------\n");
107 while (count < max_itr_num) {
109 mg1d(u0, b0, level, 0, maxlevel);
110 residual1d(u0, b0, r0, 0, level);
111 norm_r = l2norm(r0, level, 0);
112 factor = norm_r/norm_r1;
113 error = norm_r / norm_r0;
116 printf(
"%6d | %13.6e | %13.6e | %10.4f\n",count,error,norm_r,factor);
118 if (error < rtol || norm_r < atol)
break;
122 if (count >= max_itr_num) {
123 printf(
"### WARNING: V-cycle failed to converge.\n");
126 printf(
"Num of V-cycle's: %d, Relative Residual = %e.\n", count, error);
140 printf(
"### DEBUG: [--End--] %s ...\n", __FUNCTION__);
180 const REAL atol = 1.0E-15;
181 const INT max_itr_num = 100;
184 REAL norm_r, norm_r0, norm_r1, factor, error =
BIGREAL;
185 INT i, k, count = 0, *nxk, *nyk, *level;
186 REAL AMG_start = 0, AMG_end;
189 printf(
"### DEBUG: [-Begin-] %s ...\n", __FUNCTION__);
190 printf(
"### DEBUG: nx=%d, ny=%d, maxlevel=%d\n", nx, ny, maxlevel);
195 printf(
"Num of DOF's: %d\n", (nx+1)*(ny+1));
199 nxk = (
INT *)malloc(maxlevel*
sizeof(
INT));
200 nyk = (
INT *)malloc(maxlevel*
sizeof(
INT));
201 nxk[0] = nx+1; nyk[0] = ny+1;
202 for (k=1;k<maxlevel;k++) {
203 nxk[k] = (int) (nxk[k-1]+1)/2;
204 nyk[k] = (int) (nyk[k-1]+1)/2;
208 level = (
INT *)malloc((maxlevel+2)*
sizeof(
INT));
209 level[0] = 0; level[1] = (nx+1)*(ny+1);
210 for (i = 1; i < maxlevel; i++) {
211 level[i+1] = level[i]+(nx/pow(2.0,i)+1)*(ny/pow(2.0,i)+1);
213 level[maxlevel+1] = level[maxlevel]+1;
216 u0 = (
REAL *)malloc(level[maxlevel+1]*
sizeof(
REAL));
217 b0 = (
REAL *)malloc(level[maxlevel+1]*
sizeof(
REAL));
218 r0 = (
REAL *)malloc(level[maxlevel+1]*
sizeof(
REAL));
228 residual2d(u0, b0, r0, 0, level, nxk, nyk);
229 norm_r0 = l2norm(r0, level, 0);
231 if (norm_r0 < atol)
goto FINISHED;
234 printf(
"-----------------------------------------------------------\n");
235 printf(
"It Num | ||r||/||b|| | ||r|| | Conv. Factor\n");
236 printf(
"-----------------------------------------------------------\n");
240 while ( count < max_itr_num ) {
242 mg2d(u0, b0, level, 0, maxlevel, nxk, nyk);
243 residual2d(u0, b0, r0, 0, level, nxk, nyk);
244 norm_r = l2norm(r0, level, 0);
245 error = norm_r / norm_r0;
246 factor = norm_r/norm_r1;
249 printf(
"%6d | %13.6e | %13.6e | %10.4f\n",count,error,norm_r,factor);
251 if ( error < rtol || norm_r < atol )
break;
255 if (count >= max_itr_num) {
256 printf(
"### WARNING: V-cycle failed to converge.\n");
259 printf(
"Num of V-cycle's: %d, Relative Residual = %e.\n", count, error);
273 printf(
"### DEBUG: [--End--] %s ...\n", __FUNCTION__);
317 const REAL atol = 1.0E-15;
318 const INT max_itr_num = 100;
321 REAL norm_r,norm_r0,norm_r1, factor, error =
BIGREAL;
322 INT i, k, count = 0, *nxk, *nyk, *nzk, *level;
323 REAL AMG_start = 0, AMG_end;
326 printf(
"### DEBUG: [-Begin-] %s ...\n", __FUNCTION__);
327 printf(
"### DEBUG: nx=%d, ny=%d, nz=%d, maxlevel=%d\n",
328 nx, ny, nz, maxlevel);
333 printf(
"Num of DOF's: %d\n", (nx+1)*(ny+1)*(nz+1));
337 nxk = (
INT *)malloc(maxlevel*
sizeof(
INT));
338 nyk = (
INT *)malloc(maxlevel*
sizeof(
INT));
339 nzk = (
INT *)malloc(maxlevel*
sizeof(
INT));
340 nxk[0] = nx+1; nyk[0] = ny+1; nzk[0] = nz+1;
341 for(k=1;k<maxlevel;k++){
342 nxk[k] = (int) (nxk[k-1]+1)/2;
343 nyk[k] = (int) (nyk[k-1]+1)/2;
344 nzk[k] = (int) (nyk[k-1]+1)/2;
348 level = (
INT *)malloc((maxlevel+2)*
sizeof(
INT));
349 level[0] = 0; level[1] = (nx+1)*(ny+1)*(nz+1);
350 for (i = 1; i < maxlevel; i++) {
351 level[i+1] = level[i]+(nx/pow(2.0,i)+1)*(ny/pow(2.0,i)+1)*(nz/pow(2.0,i)+1);
353 level[maxlevel+1] = level[maxlevel]+1;
356 u0 = (
REAL *)malloc(level[maxlevel]*
sizeof(
REAL));
357 b0 = (
REAL *)malloc(level[maxlevel]*
sizeof(
REAL));
358 r0 = (
REAL *)malloc(level[maxlevel]*
sizeof(
REAL));
366 residual3d(u0, b0, r0, 0, level, nxk, nyk, nzk);
367 norm_r0 = l2norm(r0, level, 0);
369 if (norm_r0 < atol)
goto FINISHED;
372 printf(
"-----------------------------------------------------------\n");
373 printf(
"It Num | ||r||/||b|| | ||r|| | Conv. Factor\n");
374 printf(
"-----------------------------------------------------------\n");
378 while (count < max_itr_num) {
380 mg3d(u0, b0, level, 0, maxlevel, nxk, nyk, nzk);
381 residual3d(u0, b0, r0, 0, level, nxk, nyk, nzk);
382 norm_r = l2norm(r0, level, 0);
383 factor = norm_r/norm_r1;
384 error = norm_r / norm_r0;
387 printf(
"%6d | %13.6e | %13.6e | %10.4f\n",count,error,norm_r,factor);
389 if (error < rtol || norm_r < atol)
break;
393 if (count >= max_itr_num) {
394 printf(
"### WARNING: V-cycle failed to converge.\n");
397 printf(
"Num of V-cycle's: %d, Relative Residual = %e.\n", count, error);
420 printf(
"### DEBUG: [--End--] %s ...\n", __FUNCTION__);
449 const REAL atol = 1.0E-15;
451 REAL norm_r0, norm_r;
453 REAL AMG_start = 0, AMG_end;
457 printf(
"### DEBUG: [-Begin-] %s ...\n", __FUNCTION__);
458 printf(
"### DEBUG: nx=%d, maxlevel=%d\n", nx, maxlevel);
463 printf(
"Num of DOF's: %d\n", (nx+1));
467 level = (
INT *)malloc((maxlevel+2)*
sizeof(
INT));
468 level[0] = 0; level[1] = nx+1;
469 for (i = 1; i < maxlevel; i++) {
470 level[i+1] = level[i]+(level[i]-level[i-1]+1)/2;
472 level[maxlevel+1] = level[maxlevel]+1;
475 u0 = (
REAL *)malloc(level[maxlevel]*
sizeof(
REAL));
476 b0 = (
REAL *)malloc(level[maxlevel]*
sizeof(
REAL));
477 r0 = (
REAL *)malloc(level[maxlevel]*
sizeof(
REAL));
486 residual1d(u0, b0, r0, 0, level);
487 norm_r0 = l2norm(r0, level, 0);
488 if (norm_r0 < atol)
goto FINISHED;
491 fmg1d(u0, b0, level, maxlevel, nx);
500 residual1d(u0, b0, r0, 0, level);
501 norm_r = l2norm(r0, level, 0);
502 printf(
"Relative Residual = %e.\n", norm_r/norm_r0);
512 printf(
"### DEBUG: [--End--] %s ...\n", __FUNCTION__);
544 const REAL atol = 1.0E-15;
546 REAL norm_r0, norm_r;
547 INT *nxk, *nyk, *level;
549 REAL AMG_start = 0, AMG_end;
552 printf(
"### DEBUG: [-Begin-] %s ...\n", __FUNCTION__);
553 printf(
"### DEBUG: nx=%d, ny=%d, maxlevel=%d\n", nx, ny, maxlevel);
558 printf(
"Num of DOF's: %d\n", (nx+1)*(ny+1));
562 nxk = (
INT *)malloc(maxlevel*
sizeof(
INT));
563 nyk = (
INT *)malloc(maxlevel*
sizeof(
INT));
565 nxk[0] = nx+1; nyk[0] = ny+1;
566 for(k=1;k<maxlevel;k++) {
567 nxk[k] = (int) (nxk[k-1]+1)/2;
568 nyk[k] = (int) (nyk[k-1]+1)/2;
572 level = (
INT *)malloc((maxlevel+2)*
sizeof(
INT));
573 level[0] = 0; level[1] = (nx+1)*(ny+1);
574 for (i = 1; i < maxlevel; i++) {
575 level[i+1] = level[i]+(nx/pow(2.0,i)+1)*(ny/pow(2.0,i)+1);
577 level[maxlevel+1] = level[maxlevel] + 1;
580 u0 = (
REAL *)malloc(level[maxlevel]*
sizeof(
REAL));
581 b0 = (
REAL *)malloc(level[maxlevel]*
sizeof(
REAL));
582 r0 = (
REAL *)malloc(level[maxlevel]*
sizeof(
REAL));
591 residual2d(u0, b0, r0, 0, level, nxk, nyk);
592 norm_r0 = l2norm(r0, level, 0);
593 if (norm_r0 < atol)
goto FINISHED;
596 fmg2d(u0, b0, level, maxlevel, nxk, nyk);
605 residual2d(u0, b0, r0, 0, level, nxk, nyk);
606 norm_r = l2norm(r0, level, 0);
607 printf(
"Relative Residual = %e.\n", norm_r/norm_r0);
619 printf(
"### DEBUG: [--End--] %s ...\n", __FUNCTION__);
653 const REAL atol = 1.0E-15;
655 REAL norm_r0, norm_r;
656 INT *nxk, *nyk, *nzk, *level;
658 REAL AMG_start = 0, AMG_end;
661 printf(
"### DEBUG: [-Begin-] %s ...\n", __FUNCTION__);
662 printf(
"### DEBUG: nx=%d, ny=%d, nz=%d, maxlevel=%d\n",
663 nx, ny, nz, maxlevel);
668 printf(
"Num of DOF's: %d\n", (nx+1)*(ny+1)*(nz+1));
671 nxk = (
INT *)malloc(maxlevel*
sizeof(
INT));
672 nyk = (
INT *)malloc(maxlevel*
sizeof(
INT));
673 nzk = (
INT *)malloc(maxlevel*
sizeof(
INT));
675 nxk[0] = nx+1; nyk[0] = ny+1; nzk[0] = nz+1;
676 for(k=1;k<maxlevel;k++){
677 nxk[k] = (int) (nxk[k-1]+1)/2;
678 nyk[k] = (int) (nyk[k-1]+1)/2;
679 nzk[k] = (int) (nyk[k-1]+1)/2;
683 level = (
INT *)malloc((maxlevel+2)*
sizeof(
INT));
684 level[0] = 0; level[1] = (nx+1)*(ny+1)*(nz+1);
685 for (i = 1; i < maxlevel; i++) {
686 level[i+1] = level[i]+(nx/pow(2.0,i)+1)*(ny/pow(2.0,i)+1)*(nz/pow(2.0,i)+1);
688 level[maxlevel+1] = level[maxlevel]+1;
691 u0 = (
REAL *)malloc(level[maxlevel]*
sizeof(
REAL));
692 b0 = (
REAL *)malloc(level[maxlevel]*
sizeof(
REAL));
693 r0 = (
REAL *)malloc(level[maxlevel]*
sizeof(
REAL));
701 residual3d(u0, b0, r0, 0, level, nxk, nyk, nzk);
702 norm_r0 = l2norm(r0, level, 0);
703 if (norm_r0 < atol)
goto FINISHED;
706 fmg3d(u0, b0, level, maxlevel, nxk, nyk, nzk);
714 residual3d(u0, b0, r0, 0, level, nxk, nyk, nzk);
715 norm_r = l2norm(r0, level, 0);
716 printf(
"Relative Residual = %e.\n", norm_r/norm_r0);
729 printf(
"### DEBUG: [--End--] %s ...\n", __FUNCTION__);
761 const REAL atol = 1.0E-15;
762 const INT max_itr_num = 100;
768 REAL AMG_start = 0, AMG_end;
771 printf(
"### DEBUG: [-Begin-] %s ...\n", __FUNCTION__);
772 printf(
"### DEBUG: nx=%d, maxlevel=%d\n", nx, maxlevel);
777 printf(
"Num of DOF's: %d\n", (nx+1));
780 level = (
INT *)malloc((maxlevel+2)*
sizeof(
INT));
781 level[0] = 0; level[1] = nx+1;
782 for (i = 1; i < maxlevel; i++) {
783 level[i+1] = level[i]+(level[i]-level[i-1]+1)/2;
785 level[maxlevel+1] = level[maxlevel]+1;
788 u0 = (
REAL *)malloc(level[maxlevel]*
sizeof(
REAL));
789 b0 = (
REAL *)malloc(level[maxlevel]*
sizeof(
REAL));
790 r0 = (
REAL *)malloc(level[maxlevel]*
sizeof(
REAL));
799 residual1d(u, b, r0, 0, level);
800 norm_r0 = l2norm(r0, level, 0);
801 if (norm_r0 < atol)
goto FINISHED;
804 iter = pcg1d(u0, b0, level, maxlevel, nx, rtol, max_itr_num, prtlvl);
822 printf(
"### DEBUG: [--End--] %s ...\n", __FUNCTION__);
857 const REAL atol = 1.0E-15;
858 const INT max_itr_num = 100;
862 INT *nxk, *nyk, *level;
864 REAL AMG_start = 0, AMG_end;
867 printf(
"### DEBUG: [-Begin-] %s ...\n", __FUNCTION__);
868 printf(
"### DEBUG: nx=%d, ny=%d, maxlevel=%d\n", nx, ny, maxlevel);
873 printf(
"Num of DOF's: %d\n", (nx+1)*(ny+1));
876 nxk = (
INT *)malloc(maxlevel*
sizeof(
INT));
877 nyk = (
INT *)malloc(maxlevel*
sizeof(
INT));
879 nxk[0] = nx+1; nyk[0] = ny+1;
880 for (k=1;k<maxlevel;k++) {
881 nxk[k] = (int) (nxk[k-1]+1)/2;
882 nyk[k] = (int) (nyk[k-1]+1)/2;
886 level = (
INT *)malloc((maxlevel+2)*
sizeof(
INT));
887 level[0] = 0; level[1] = (nx+1)*(ny+1);
888 for (i = 1; i < maxlevel; i++) {
889 level[i+1] = level[i]+(nx/pow(2.0,i)+1)*(ny/pow(2.0,i)+1);
891 level[maxlevel+1] = level[maxlevel]+1;
894 u0 = (
REAL *)malloc(level[maxlevel]*
sizeof(
REAL));
895 b0 = (
REAL *)malloc(level[maxlevel]*
sizeof(
REAL));
896 r0 = (
REAL *)malloc(level[maxlevel]*
sizeof(
REAL));
905 residual2d(u0, b0, r0, 0, level, nxk, nyk);
906 norm_r0 = l2norm(r0, level, 0);
907 if (norm_r0 < atol)
goto FINISHED;
910 iter = pcg2d(u0, b0, level, maxlevel, nxk,
911 nyk, rtol, max_itr_num, prtlvl);
931 printf(
"### DEBUG: [--End--] %s ...\n", __FUNCTION__);
968 const REAL atol = 1.0E-15;
969 const INT max_itr_num = 100;
973 INT *nxk, *nyk, *nzk, *level;
975 REAL AMG_start = 0, AMG_end;
978 printf(
"### DEBUG: [-Begin-] %s ...\n", __FUNCTION__);
979 printf(
"### DEBUG: nx=%d, ny=%d, nz=%d, maxlevel=%d\n",
980 nx, ny, nz, maxlevel);
985 printf(
"Num of DOF's: %d\n", (nx+1)*(ny+1)*(nz+1));
989 nxk = (
INT *)malloc(maxlevel*
sizeof(
INT));
990 nyk = (
INT *)malloc(maxlevel*
sizeof(
INT));
991 nzk = (
INT *)malloc(maxlevel*
sizeof(
INT));
993 nxk[0] = nx+1; nyk[0] = ny+1; nzk[0] = nz+1;
994 for (k = 1; k < maxlevel; k++ ) {
995 nxk[k] = (int) (nxk[k-1]+1)/2;
996 nyk[k] = (int) (nyk[k-1]+1)/2;
997 nzk[k] = (int) (nyk[k-1]+1)/2;
1001 level = (
INT *)malloc((maxlevel+2)*
sizeof(
INT));
1002 level[0] = 0; level[1] = (nx+1)*(ny+1)*(nz+1);
1003 for (i = 1; i < maxlevel; i++) {
1004 level[i+1] = level[i]+(nx/pow(2.0,i)+1)*(ny/pow(2.0,i)+1)*(nz/pow(2.0,i)+1);
1006 level[maxlevel+1] = level[maxlevel]+1;
1009 u0 = (
REAL *)malloc(level[maxlevel]*
sizeof(
REAL));
1010 b0 = (
REAL *)malloc(level[maxlevel]*
sizeof(
REAL));
1011 r0 = (
REAL *)malloc(level[maxlevel]*
sizeof(
REAL));
1019 residual3d(u0, b0, r0, 0, level, nxk, nyk, nzk);
1020 norm_r0 = l2norm(r0, level, 0);
1021 if (norm_r0 < atol)
goto FINISHED;
1024 iter = pcg3d(u0, b0, level, maxlevel, nxk,
1025 nyk, nzk, rtol, max_itr_num, prtlvl);
1046 printf(
"### DEBUG: [--End--] %s ...\n", __FUNCTION__);
void fasp_darray_set(const INT n, REAL *x, const REAL val)
Set initial value for an array to be x=val.
void fasp_darray_cp(const INT n, const REAL *x, REAL *y)
Copy an array to the other y=x.
void fasp_cputime(const char *message, const REAL cputime)
Print CPU walltime.
void fasp_gettime(REAL *time)
Get system time.
INT fasp_poisson_gmg2d(REAL *u, REAL *b, const INT nx, const INT ny, const INT maxlevel, const REAL rtol, const SHORT prtlvl)
Solve Ax=b of Poisson 2D equation by Geometric Multigrid Method.
INT fasp_poisson_gmgcg3d(REAL *u, REAL *b, const INT nx, const INT ny, const INT nz, const INT maxlevel, const REAL rtol, const SHORT prtlvl)
Solve Ax=b of Poisson 3D equation by Geometric Multigrid Method (GMG preconditioned Conjugate Gradien...
void fasp_poisson_fgmg1d(REAL *u, REAL *b, const INT nx, const INT maxlevel, const REAL rtol, const SHORT prtlvl)
Solve Ax=b of Poisson 1D equation by Geometric Multigrid Method (FMG)
void fasp_poisson_fgmg2d(REAL *u, REAL *b, const INT nx, const INT ny, const INT maxlevel, const REAL rtol, const SHORT prtlvl)
Solve Ax=b of Poisson 2D equation by Geometric Multigrid Method (FMG)
INT fasp_poisson_gmg1d(REAL *u, REAL *b, const INT nx, const INT maxlevel, const REAL rtol, const SHORT prtlvl)
Solve Ax=b of Poisson 1D equation by Geometric Multigrid Method.
void fasp_poisson_fgmg3d(REAL *u, REAL *b, const INT nx, const INT ny, const INT nz, const INT maxlevel, const REAL rtol, const SHORT prtlvl)
Solve Ax=b of Poisson 3D equation by Geometric Multigrid Method (FMG)
INT fasp_poisson_gmgcg1d(REAL *u, REAL *b, const INT nx, const INT maxlevel, const REAL rtol, const SHORT prtlvl)
Solve Ax=b of Poisson 1D equation by Geometric Multigrid Method (GMG preconditioned Conjugate Gradien...
INT fasp_poisson_gmg3d(REAL *u, REAL *b, const INT nx, const INT ny, const INT nz, const INT maxlevel, const REAL rtol, const SHORT prtlvl)
Solve Ax=b of Poisson 3D equation by Geometric Multigrid Method.
INT fasp_poisson_gmgcg2d(REAL *u, REAL *b, const INT nx, const INT ny, const INT maxlevel, const REAL rtol, const SHORT prtlvl)
Solve Ax=b of Poisson 2D equation by Geometric Multigrid Method (GMG preconditioned Conjugate Gradien...
Main header file for the FASP project.
#define SHORT
FASP integer and floating point numbers.
#define BIGREAL
Some global constants.
#define PRINT_NONE
Print level for all subroutines – not including DEBUG output.