#include "utilf.h"#include "mymalloc.h"#include "make_bc.h"#include "fas.h"Include dependency graph for fas.c:

Go to the source code of this file.
Defines | |
| #define | COARSEST 1 |
| #define | COARSERELAX 4 |
Functions | |
| void | lop (real2D out, real2D u, real2D a, real2D b, int n1, int n2) |
| int | computeng (int n1, int n2) |
| int | initpressure (int n1, int n2, int ng) |
| void | mginit (real2D u, real2D p, real2D a, real2D b, real2D ei, real2D cc, int n1, int n2, int ng) |
| void | mgfas (real2D u, real2D p, real2D a, real2D b, real2D ei, int n1, int n2, int ng, int npre, int npost, int ncycle) |
| void | relax (real2D u, real2D rhs, real2D a, real2D b, real2D ei, real2D cc, int n1, int n2) |
| void | lop (real2D out, real2D u, real2D a, real2D b, real2D cc, int n1, int n2) |
|
|
|
|
|
|
|
||||||||||||
|
Definition at line 35 of file fas.c.
00036 {
00037 int nmin, n, nn, j;
00038
00039 nmin = min(n1, n2);
00040
00041 j = nmin - 2; n = 1;
00042 while (j > 2)
00043 { j /= 2; n++; }
00044
00045 nn = 1;
00046 for (j = 1; j <= n; j++)
00047 nn *= 2;
00048 if((nn + 2) != nmin)
00049 return NGERROR;
00050
00051 if ((n1 - 2) % (nmin - 2) != 0)
00052 return NXERROR;
00053 if ((n2 - 2) % (nmin - 2) != 0)
00054 return NYERROR;
00055
00056 return n;
00057 }
|
|
||||||||||||||||
|
Definition at line 61 of file fas.c.
00062 {
00063 int j;
00064
00065 irhs = (real2D *) malloc((ng + 1) * sizeof(real2D));
00066 irho = (real2D *) malloc((ng + 1) * sizeof(real2D));
00067 itau = (real2D *) malloc((ng + 1) * sizeof(real2D));
00068 ip = (real2D *) malloc((ng + 1) * sizeof(real2D));
00069 ia = (real2D *) malloc((ng + 1) * sizeof(real2D));
00070 ib = (real2D *) malloc((ng + 1) * sizeof(real2D));
00071 iei = (real2D *) malloc((ng + 1) * sizeof(real2D));
00072 itemp = (real2D *) malloc((ng + 1) * sizeof(real2D));
00073 icc = (real2D *) malloc((ng + 1) * sizeof(real2D));
00074
00075 if (icc EQUALS NULL)
00076 return MEMERROR;
00077
00078 irhs[ng] = (real2D)mymalloc(sizeof(real), n1, n2);
00079 itau[ng] = (real2D)mymalloc(sizeof(real), n1, n2);
00080 itemp[ng] = (real2D)mymalloc(sizeof(real), n1, n2);
00081
00082 n1 = n1 / 2 + 1;
00083 n2 = n2 / 2 + 1;
00084
00085 for (j = ng - 1; j >= 1; j--)
00086 {
00087 irhs[j] = (real2D)mymalloc(sizeof(real), n1, n2);
00088 irho[j] = (real2D)mymalloc(sizeof(real), n1, n2);
00089 itau[j] = (real2D)mymalloc(sizeof(real), n1, n2);
00090 ip[j] = (real2D)mymalloc(sizeof(real), n1, n2);
00091 ia[j] = (real2D)mymalloc(sizeof(real), n1, n2);
00092 ib[j] = (real2D)mymalloc(sizeof(real), n1, n2);
00093 iei[j] = (real2D)mymalloc(sizeof(real), n1, n2);
00094 icc[j] = (real2D)mymalloc(sizeof(real), n1, n2);
00095 itemp[j] = (real2D)mymalloc(sizeof(real), n1, n2);
00096
00097 if (itemp[j] EQUALS NULL)
00098 return MEMERROR;
00099
00100 n1 = n1 / 2 + 1;
00101 n2 = n2 / 2 + 1;
00102 }
00103
00104 return 0;
00105 } /* end initpressure() */
|
|
||||||||||||||||||||||||||||||||
|
Definition at line 445 of file fas.c. Referenced by mgfas().
00447 {
00448 int i, j;
00449 real hi2;
00450
00451 hi2 = (real) (n2 - 2) * (n2 - 2);
00452 for (i = 2; i <= n1 - 1; i++)
00453 for (j = 2; j <= n2 - 1; j++)
00454 if (cc[i][j] == 1.0)
00455 out[i][j] = hi2 * (a[i][j] * (u[i+1][j] - u[i][j]) +
00456 a[i-1][j] * (u[i-1][j] - u[i][j]) +
00457 b[i][j] * (u[i][j+1] - u[i][j]) +
00458 b[i][j-1] * (u[i][j-1] - u[i][j]));
00459 }
|
|
||||||||||||||||||||||||||||
|
|
|
||||||||||||||||||||||||||||||||||||||||||||||||
|
Definition at line 143 of file fas.c. References bc_scalar(), copy(), lop(), NULGRAD, real2D, and relax().
00145 {
00146 int i, j, jj, jcycle, jpre, jpost, ngrid, nfx, nfy, nn1, nn2;
00147
00148 ip[ng] = p;
00149 irho[ng] = u;
00150 ia[ng] = a;
00151 ib[ng] = b;
00152 iei[ng] = ei;
00153 icc[ng] = cc;
00154
00155 nn1 = n1 / 2 + 1;
00156 nn2 = n2 / 2 + 1;
00157 ngrid = ng - 1;
00158
00159 bc_scalar(u, n1, n2, NULGRAD);
00160
00161 rstrct(irho[ngrid], u, nn1, nn2);
00162 rstrct(icc[ngrid], cc, nn1, nn2);
00163 abfromab(ia[ngrid], ib[ngrid], iei[ngrid],
00164 ia[ngrid+1], ib[ngrid+1], nn1, nn2);
00165 while ((nn1 > 4) && (nn2 > 4))
00166 {
00167 nn1 = nn1 / 2 + 1;
00168 nn2 = nn2 / 2 + 1;
00169 ngrid = ngrid - 1;
00170 rstrct(irho[ngrid], irho[ngrid+1], nn1, nn2);
00171 rstrct(icc[ngrid], icc[ngrid+1], nn1, nn2);
00172 abfromab(ia[ngrid], ib[ngrid], iei[ngrid], ia[ngrid+1], ib[ngrid+1],
00173 nn1, nn2);
00174 }
00175
00176 ngrid = ng;
00177 for (j = 2; j <= ngrid; j++)
00178 {
00179 nn1 = 2 * nn1 - 2;
00180 nn2 = 2 * nn2 - 2;
00181 interp(ip[j], ip[j-1], nn1, nn2);
00182 copy(irhs[j], irho[j], nn1, nn2);
00183 for (jcycle = 1; jcycle <= ncycle; jcycle++)
00184 {
00185 nfx = nn1;
00186 nfy = nn2;
00187 for (jj = j; jj >= 2; jj--)
00188 {
00189 for (jpre = 1; jpre <= npre; jpre++)
00190 {
00191 relax(ip[jj], irhs[jj], ia[jj], ib[jj], iei[jj], icc[jj],
00192 nfx, nfy);
00193 bc_scalar(ip[jj], nfx, nfy, NULGRAD);
00194 }
00195 lop(itemp[jj], ip[jj], ia[jj], ib[jj], icc[jj], nfx, nfy);
00196 bc_scalar(itemp[jj], nfx, nfy, NULGRAD);
00197 nfx = nfx / 2 + 1;
00198 nfy = nfy / 2 + 1;
00199 rstrct(itemp[jj-1], itemp[jj], nfx, nfy);
00200 rstrct(ip[jj-1], ip[jj], nfx, nfy);
00201 lop(itau[jj-1], ip[jj-1], ia[jj-1], ib[jj-1], icc[jj-1], nfx, nfy);
00202 bc_scalar(itau[jj-1], nfx, nfy, NULGRAD);
00203 matsub(itau[jj-1], itemp[jj-1], itau[jj-1], nfx, nfy);
00204 rstrct(irhs[jj-1], irhs[jj], nfx, nfy);
00205 matadd(irhs[jj-1], itau[jj-1], irhs[jj-1], nfx, nfy);
00206 }
00207
00208 slvsml(ip[1], irhs[1],
00209 ia[1], ib[1], iei[1], icc[1], nfx, nfy);
00210
00211 for (jj = 2; jj <= j; jj++)
00212 {
00213 rstrct(itemp[jj-1], ip[jj], nfx, nfy);
00214 matsub(ip[jj-1], itemp[jj-1], itemp[jj-1], nfx, nfy);
00215 nfx = 2 * nfx - 2;
00216 nfy = 2 * nfy - 2;
00217 interp(itau[jj], itemp[jj-1], nfx, nfy);
00218 matadd(ip[jj], itau[jj], ip[jj], nfx, nfy);
00219 for (jpost = 1; jpost <= npost; jpost++)
00220 {
00221 relax(ip[jj], irhs[jj], ia[jj], ib[jj], iei[jj], icc[jj],
00222 nfx, nfy);
00223 bc_scalar(ip[jj], nfx, nfy, NULGRAD);
00224 }
00225 }
00226 }
00227 }
00228 }
|
|
||||||||||||||||||||||||||||||||||||||||
|
Definition at line 109 of file fas.c. References bc_scalar(), NULGRAD, and real2D.
00111 {
00112 int ngrid, nn1, nn2;
00113
00114 ip[ng] = p;
00115 irho[ng] = u;
00116 ia[ng] = a;
00117 ib[ng] = b;
00118 iei[ng] = ei;
00119 icc[ng] = cc;
00120
00121 nn1 = n1 / 2 + 1;
00122 nn2 = n2 / 2 + 1;
00123 ngrid = ng - 1;
00124
00125 bc_scalar(u, n1, n2, NULGRAD);
00126
00127 rstrct(irho[ngrid], u, nn1, nn2);
00128 rstrct(icc[ngrid], p, nn1, nn2);
00129 abfromab(ia[ngrid], ib[ngrid], iei[ngrid],
00130 ia[ngrid+1], ib[ngrid+1], nn1, nn2);
00131 while ((nn1 > 4) && (nn2 > 4))
00132 {
00133 nn1 = nn1 / 2 + 1;
00134 nn2 = nn2 / 2 + 1;
00135 ngrid = ngrid - 1;
00136 rstrct(irho[ngrid], irho[ngrid+1], nn1, nn2);
00137 rstrct(icc[ngrid], icc[ngrid+1], nn1, nn2);
00138 abfromab(ia[ngrid], ib[ngrid], iei[ngrid], ia[ngrid+1], ib[ngrid+1],
00139 nn1, nn2);
00140 }
00141 }
|
|
||||||||||||||||||||||||||||||||||||
|
Definition at line 418 of file fas.c.
00421 {
00422 real h2, h, res;
00423 int i, j, isw, jsw;
00424
00425 h = 1.0 / (n2 - 2);
00426 h2 = h * h;
00427 for (jsw = 1; jsw <= 2; jsw++)
00428 {
00429 isw = jsw;
00430 for (i = 2; i <= n1 - 1; i++, isw = 3 - isw)
00431 for (j = isw + 1; j <= n2 - 1; j += 2)
00432 if (cc[i][j] == 1.0)
00433 u[i][j] = (a[i][j] * u[i+1][j] +
00434 a[i-1][j] * u[i-1][j] +
00435 b[i][j] * u[i][j+1] +
00436 b[i][j-1] * u[i][j-1]
00437 - h2 * rhs[i][j])
00438 * ei[i][j];
00439 }
00440 }
|
1.2.18