#include "utilf.h"#include "mymalloc.h"#include "markers.h"#include "surfaces.h"#include "extra.h"#include "make_bc.h"#include "momentum.h"#include "mg.h"#include "inout.h"Include dependency graph for vmg.c:

Go to the source code of this file.
Defines | |
| #define | COARSEST 3 | 
| #define | COARSERELAX 20 | 
Functions | |
| int | computeng (int n1, int n2) | 
| int | initpressure (int n1, int n2, int ng) | 
| int | mgsolve (real2D u, real2D p, real2D ap, real2D c0, real2D c1, real2D c2, real2D c3, real2D c4, interface in, real lredis, real maxdiv, int n1, int n2, int ng) | 
| void | mgvcycle (int n, int nx, int ny, int npre, int npost) | 
| void | resid (real2D res, real2D p, real2D rhs, real2D ap, real2D c0, real2D c1, real2D c2, real2D c3, real2D c4, int nx, int ny) | 
| void | relax (real2D p, real2D rhs, real2D ap, real2D c0, real2D c1, real2D c2, real2D c3, real2D c4, int nx, int ny) | 
      
  | 
  
| 
 
  | 
  
      
  | 
  
| 
 
 Definition at line 19 of file vmg.c. Referenced by mgsolve(), and mgvcycle().  | 
  
      
  | 
  ||||||||||||
| 
 
 Definition at line 42 of file vmg.c. References MIN. Referenced by initialize(). 
 00043 {
00044   int nmin, n, nn, j;
00045 
00046   nmin = MIN(n1, n2);
00047   
00048   j = nmin - 2;  n = 1;
00049   while (j > 2) 
00050   {  j /= 2;   n++;  }
00051   
00052   nn = 1;  
00053   for (j = 1; j <= n; j++) 
00054     nn *= 2;       
00055   if((nn + 2) != nmin)
00056      return NGERROR;
00057 
00058   if ((n1 - 2) % (nmin - 2) != 0)
00059      return NXERROR;
00060   if ((n2 - 2) % (nmin - 2) != 0)
00061      return NYERROR;
00062 
00063   Ngrid = n;
00064   return n;
00065 }
 | 
  
      
  | 
  ||||||||||||||||
| 
 
 Definition at line 69 of file vmg.c. References mymalloc(), real, and real2D. Referenced by initialize(). 
 00070 {
00071   int j;
00072   int err = 0;
00073 
00074   err |= ((irhs = (real2D *) malloc((ng + 1) * sizeof(real2D))) == NULL);
00075   err |= ((ip = (real2D *) malloc((ng + 1) * sizeof(real2D))) == NULL);
00076   err |= ((iap = (real2D *) malloc((ng + 1) * sizeof(real2D))) == NULL);
00077   err |= ((ic0 = (real2D *) malloc((ng + 1) * sizeof(real2D))) == NULL);
00078   err |= ((ic1 = (real2D *) malloc((ng + 1) * sizeof(real2D))) == NULL);
00079   err |= ((ic2 = (real2D *) malloc((ng + 1) * sizeof(real2D))) == NULL);
00080   err |= ((ic3 = (real2D *) malloc((ng + 1) * sizeof(real2D))) == NULL);
00081   err |= ((ic4 = (real2D *) malloc((ng + 1) * sizeof(real2D))) == NULL);
00082   err |= ((ierr = (real2D *) malloc((ng + 1) * sizeof(real2D))) == NULL);
00083 
00084   if ( err ) return MEMERROR;
00085 
00086   err |= ((sxp = (real2D)mymalloc(sizeof(real), n1, n2)) == NULL); 
00087   err |= ((syp = (real2D)mymalloc(sizeof(real), n1, n2)) == NULL); 
00088 
00089   err |= ((syu = (real2D)mymalloc(sizeof(real), n1 + 1, n2)) == NULL); 
00090   err |= ((au = (real2D)mymalloc(sizeof(real), n1, n2)) == NULL); 
00091   err |= ((cu = (real2D)mymalloc(sizeof(real), n1, n2)) == NULL); 
00092 
00093   err |= ((sxv = (real2D)mymalloc(sizeof(real), n1, n2 + 1)) == NULL);
00094   err |= ((av = (real2D)mymalloc(sizeof(real), n1, n2)) == NULL); 
00095   err |= ((cv = (real2D)mymalloc(sizeof(real), n1, n2)) == NULL); 
00096 
00097   err |= ((rz1dr = (real2D)mymalloc(sizeof(real), n1, n2)) == NULL); 
00098   err |= ((rz2dr = (real2D)mymalloc(sizeof(real), n1, n2)) == NULL); 
00099   err |= ((rr1dz = (real2D)mymalloc(sizeof(real), n1, n2)) == NULL); 
00100   err |= ((rr2dz = (real2D)mymalloc(sizeof(real), n1, n2)) == NULL); 
00101 
00102   err |= ((w1 = (real2D)mymalloc(sizeof(real), n1, n2)) == NULL); 
00103   err |= ((w2 = (real2D)mymalloc(sizeof(real), n1, n2)) == NULL);
00104   err |= ((dummy = (real2D)mymalloc(sizeof(real), n1, n2)) == NULL); 
00105 
00106   err |= ((ierr[ng] = (real2D)mymalloc(sizeof(real), n1, n2)) == NULL); 
00107   err |= ((irhs[ng] = (real2D)mymalloc(sizeof(real), n1, n2)) == NULL);
00108 
00109   n1 = n1 / 2 + 1;
00110   n2 = n2 / 2 + 1;
00111 
00112   for (j = ng - 1; j >= 1; j--) {
00113     err |= ((irhs[j] = (real2D)mymalloc(sizeof(real), n1, n2)) == NULL);
00114     err |= ((ip[j] = (real2D)mymalloc(sizeof(real), n1, n2)) == NULL);
00115     err |= ((iap[j] = (real2D)mymalloc(sizeof(real), n1, n2)) == NULL);
00116     err |= ((ic0[j] = (real2D)mymalloc(sizeof(real), n1, n2)) == NULL);
00117     err |= ((ic1[j] = (real2D)mymalloc(sizeof(real), n1, n2)) == NULL);
00118     err |= ((ic2[j] = (real2D)mymalloc(sizeof(real), n1, n2)) == NULL);
00119     err |= ((ic3[j] = (real2D)mymalloc(sizeof(real), n1, n2)) == NULL);
00120     err |= ((ic4[j] = (real2D)mymalloc(sizeof(real), n1, n2)) == NULL);
00121     err |= ((ierr[j] = (real2D)mymalloc(sizeof(real), n1, n2)) == NULL);
00122     
00123     if ( err ) return MEMERROR;
00124     
00125     n1 = n1 / 2 + 1;
00126     n2 = n2 / 2 + 1;
00127   }
00128 
00129   return 0;
00130 } /* end initpressure() */
 | 
  
      
  | 
  ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| 
 
 Definition at line 134 of file vmg.c. References add(), interface::bc, bc_scalar(), COARSEST, coli(), copy(), cut_interface(), fill0(), interface_free(), interface_init(), interface_redis_scale(), interface_rrdz(), interface_rzdr(), interface_splines(), interface_surfaces(), interface_cut::list, mgvcycle(), NCYCLEMAX, NUL, rdivmax(), real, real2D, resid(), sx_fill(), and sy_fill(). Referenced by pressure(). 
 00138 {
00139   int ngrid, nn1, nn2, i, j;
00140   interface intemp;
00141   interface_cut cutp, cutu, cutv;
00142   real scale = 1.0;
00143   int ncycle = 0;
00144 
00145   resid(irhs[ng], p, u, ap, c0, c1, c2, c3, c4, n1, n2);
00146   bc_scalar(irhs[ng], n1, n2, NUL);
00147   if (rdivmax(irhs[ng], n1, n2, &i, &j) <= maxdiv)
00148     return 0;
00149 
00150   ip[ng] = p;
00151   iap[ng] = ap;
00152   ic0[ng] = c0; ic1[ng] = c1; ic2[ng] = c2; ic3[ng] = c3; ic4[ng] = c4;
00153   interface_init(&intemp);
00154   intemp.bc = in.bc;
00155   cutp.list = cutu.list = cutv.list = NULL;
00156 
00157   nn1 = n1;
00158   nn2 = n2;
00159   ngrid = ng;
00160   while (ngrid > COARSEST) {
00161     nn1 = nn1 / 2 + 1;
00162     nn2 = nn2 / 2 + 1;
00163     ngrid--;
00164     scale *= 2.0;
00165     lredis *= 2.0;
00166     /* rescale the interface */
00167     interface_redis_scale(&intemp, in, lredis, 1./scale);
00168     interface_splines(intemp, nn1, nn2);
00169     /* compute volume fraction */
00170     rstrct(iap[ngrid], iap[ngrid+1], nn1, nn2, 1.0);
00171 
00172     cut_interface(intemp, &cutp, 0.0, 0.0);
00173     cut_interface(intemp, &cutu, -0.5, 0.0);
00174     cut_interface(intemp, &cutv, 0.0, -0.5);
00175 
00176     interface_surfaces(intemp, cutp, sxp, syp, iap[ngrid], dummy,
00177                        w1, w2, nn1, nn2);
00178     for (i = 2; i <= nn1; i++)
00179       for (j = 2; j <= nn2; j++) {
00180         au[i][j] = 0.5*(iap[ngrid][i][j] + iap[ngrid][i-1][j]);
00181         av[i][j] = 0.5*(iap[ngrid][i][j] + iap[ngrid][i][j-1]);
00182       } 
00183     interface_surfaces(intemp, cutu, dummy, syu, au, cu,
00184                        w1, w2, nn1, nn2);
00185     interface_surfaces(intemp, cutv, sxv, dummy, av, cv,
00186                        w1, w2, nn1, nn2);
00187     sx_fill(sxp, iap[ngrid], 0.0, 0.0, intemp, nn1, nn2);
00188     sy_fill(syp, iap[ngrid], 0.0, 0.0, intemp, nn1, nn2);
00189     sy_fill(syu, au, -0.5, 0.0, intemp, nn1, nn2);
00190     for (j = 2; j <= nn2; j++)
00191       syu[nn1+1][j] = (real)j - 1.5;
00192     sx_fill(sxv, av, 0.0, -0.5, intemp, nn1, nn2);
00193     for (i = 2; i <= nn1; i++)
00194       sxv[i][nn2+1] = (real)nn2 - 1.5;
00195 
00196     interface_rzdr(intemp, cutp, -0.5, rz1dr, nn1, nn2);
00197     interface_rzdr(intemp, cutp, 0.5, rz2dr, nn1, nn2);
00198     interface_rrdz(intemp, cutp, -0.5, rr1dz, nn1, nn2);
00199     interface_rrdz(intemp, cutp, 0.5, rr2dz, nn1, nn2);
00200     
00201     coli(sxp, syp, syu, sxv, cu, cv, iap[ngrid], av, 
00202          rz1dr, rz2dr, rr1dz, rr2dz,
00203          ic0[ngrid], ic1[ngrid], ic2[ngrid], ic3[ngrid], ic4[ngrid], 
00204          nn1, nn2, scale);
00205   }
00206   interface_free(intemp);
00207   if (cutp.list) free(cutp.list);
00208   if (cutu.list) free(cutu.list);
00209   if (cutv.list) free(cutv.list);
00210 
00211   copy(w1, p, n1, n2);
00212   while (rdivmax(irhs[ng], n1, n2, &i, &j) > maxdiv && ncycle < NCYCLEMAX) {
00213     fill0(ip[ng], n1, n2);
00214     mgvcycle(ng, n1, n2, 1, 1);
00215     printf("ncycle: %d rdivmax: %g\n", 
00216            ncycle + 1, rdivmax(irhs[ng], n1, n2, &i, &j));
00217     add(w1, p, n1, n2);
00218     ncycle++;
00219   }
00220   copy(p, w1, n1, n2);  
00221 
00222   return ncycle;
00223 } /* end mginit() */
 | 
  
      
  | 
  ||||||||||||||||||||||||
| 
 
 Definition at line 227 of file vmg.c. References add(), bc_scalar(), COARSEST, fill0(), NUL, NULGRAD, NULGRAD2, relax(), and resid(). Referenced by mgsolve(), and mgvcycle(). 
 00228 {
00229   int count;
00230   int ncx = nx/2 + 1, ncy = ny/2 + 1;
00231 char s[256];
00232 
00233   /* solve exactly on the coarsest grid */
00234   if (n == COARSEST) {
00235     slvsml(ip[COARSEST], irhs[COARSEST], iap[COARSEST], 
00236            ic0[COARSEST], ic1[COARSEST], ic2[COARSEST], ic3[COARSEST], 
00237            ic4[COARSEST],
00238            nx, ny);
00239     return;
00240   }
00241   
00242   /* do prerelaxation */
00243   for (count = 0; count < npre; count++) {
00244     relax(ip[n], irhs[n], iap[n], 
00245           ic0[n], ic1[n], ic2[n], ic3[n], ic4[n], nx, ny);
00246     bc_scalar(ip[n], nx, ny, NULGRAD2);
00247   }
00248 
00249   /* compute defect */
00250   resid(irhs[n], ip[n], irhs[n], iap[n],
00251         ic0[n], ic1[n], ic2[n], ic3[n], ic4[n], 
00252         nx, ny);
00253   bc_scalar(irhs[n], nx, ny, NUL);
00254 
00255   /* compute r.h.s. on the coarser grid using defect */
00256   rstrct(irhs[n-1], irhs[n], ncx, ncy, - 4.0);
00257 
00258   /* use zero as initial guess on the coarser grid */
00259   fill0(ip[n-1], ncx, ncy);
00260 
00261   /* solve on the coarser grid */
00262   mgvcycle(n - 1, ncx, ncy, npre + 1, npost + 1);
00263 
00264   /* interpolate the error from coarse to fine grid */
00265   interp(ierr[n], ip[n-1], nx, ny);
00266 
00267   /* new residual res(new) = res(old)-A*error */
00268   resid(irhs[n], ierr[n], irhs[n], iap[n], 
00269         ic0[n], ic1[n], ic2[n], ic3[n], ic4[n],
00270         nx, ny);
00271   bc_scalar(irhs[n], nx, ny, NUL);
00272 
00273   /* correct e(ngrid) with error = interp(e(ngrid-1)) */
00274   add(ip[n], ierr[n], nx, ny);
00275 
00276   /* do post relaxation with initial guess = 0 */
00277   fill0(ierr[n], nx, ny);
00278   for (count = 0; count < npost; count++) {
00279     relax(ierr[n], irhs[n], iap[n], 
00280           ic0[n], ic1[n], ic2[n], ic3[n], ic4[n], nx, ny);
00281     bc_scalar(ierr[n], nx, ny, NULGRAD);
00282   }
00283 
00284   /* add correction to correction to solution */
00285   add(ip[n], ierr[n], nx, ny);
00286 
00287   /* compute residual */
00288   resid(irhs[n], ierr[n], irhs[n], iap[n],
00289         ic0[n], ic1[n], ic2[n], ic3[n], ic4[n],
00290         nx, ny);
00291   bc_scalar(irhs[n], nx, ny, NUL);
00292 /*
00293   sprintf(s, "ip%d", n);
00294   datbarray(ip[n], nx, ny, s);
00295   sprintf(s, "ipc%d", n);
00296   sprintf(s, "iap%d", n);
00297   datbarray(iap[n], nx, ny, s);
00298 */
00299 }
 | 
  
      
  | 
  ||||||||||||||||||||||||||||||||||||||||||||
| 
 
 Definition at line 409 of file vmg.c. Referenced by mgfas(), mgvcycle(), and pressure(). 
 00412 {
00413   int i, j, isw, jsw;
00414 
00415   for (jsw = 1; jsw <= 2; jsw++) {
00416     isw = jsw;
00417     for (i = 2; i < nx; i++, isw = 3 - isw)
00418       for (j = isw + 1; j < ny; j += 2)
00419         if (INP(i,j))
00420           p[i][j] = (c1[i][j]*p[i+1][j] + c2[i][j]*p[i][j+1] +
00421                      c3[i][j]*p[i-1][j] + c4[i][j]*p[i][j-1] 
00422                      - rhs[i][j])/c0[i][j];
00423   }
00424 }
 | 
  
      
  | 
  ||||||||||||||||||||||||||||||||||||||||||||||||
| 
 
 Definition at line 391 of file vmg.c. Referenced by mgsolve(), and mgvcycle(). 
 00394 {
00395   int i, j;
00396   
00397   for (i = 2; i < nx; i++)
00398     for (j = 2; j < ny; j++)
00399       if (INP(i,j))
00400         res[i][j] = c1[i][j]*p[i+1][j] + c2[i][j]*p[i][j+1] 
00401           + c3[i][j]*p[i-1][j] + c4[i][j]*p[i][j-1] - c0[i][j]*p[i][j]
00402           - rhs[i][j];
00403       else
00404         res[i][j] = 0.0;
00405 }
 | 
  
1.2.18