Actual source code: ff1.c

 2:  #include mp.h
  3: /*
  4:          Defines the u, v, omega physics for a given tempature
  5: */
  8: PetscErrorCode FormInitialGuessLocal1(DMDALocalInfo *info,Field1 **x)
  9: {
 10:   PetscInt       i,j;
 11: 
 12:   for (j=info->ys; j<info->ys+info->ym; j++) {
 13:     for (i=info->xs; i<info->xs+info->xm; i++) {
 14:       x[j][i].u     = 0.0;
 15:       x[j][i].v     = 0.0;
 16:       x[j][i].omega = 0.0;
 17:     }
 18:   }
 19:   return 0;
 20: }

 22: PetscLogEvent EVENT_FORMFUNCTIONLOCAL1;

 26: /* 
 27:       x2 contains given tempature field
 28: */
 29: PetscErrorCode FormFunctionLocal1(DMDALocalInfo *info,Field1 **x,Field2 **x2,Field1 **f,void *ptr)
 30:  {
 31:   AppCtx         *user = (AppCtx*)ptr;
 32:   PetscInt       xints,xinte,yints,yinte,i,j;
 33:   PetscReal      hx,hy,dhx,dhy,hxdhy,hydhx;
 34:   PetscReal      grashof,lid; /* ,prandtl */
 35:   PetscScalar    u,uxx,uyy,vx,vy,avx,avy,vxp,vxm,vyp,vym;

 39:   PetscLogEventBegin(EVENT_FORMFUNCTIONLOCAL1,0,0,0,0);
 40:   grashof = user->grashof;
 41:   /* prandtl = user->prandtl; */
 42:   lid     = user->lidvelocity;

 44:   dhx = (PetscReal)(info->mx-1);  dhy = (PetscReal)(info->my-1);
 45:   hx = 1.0/dhx;                   hy = 1.0/dhy;
 46:   hxdhy = hx*dhy;                 hydhx = hy*dhx;

 48:   xints = info->xs; xinte = info->xs+info->xm; yints = info->ys; yinte = info->ys+info->ym;

 50:   /* Test whether we are on the bottom edge of the global array */
 51:   if (yints == 0) {
 52:     j = 0;
 53:     yints = yints + 1;
 54:     /* bottom edge */
 55:     for (i=info->xs; i<info->xs+info->xm; i++) {
 56:       f[j][i].u     = x[j][i].u;
 57:       f[j][i].v     = x[j][i].v;
 58:       f[j][i].omega = x[j][i].omega + (x[j+1][i].u - x[j][i].u)*dhy;
 59:     }
 60:   }

 62:   /* Test whether we are on the top edge of the global array */
 63:   if (yinte == info->my) {
 64:     j = info->my - 1;
 65:     yinte = yinte - 1;
 66:     /* top edge */
 67:     for (i=info->xs; i<info->xs+info->xm; i++) {
 68:         f[j][i].u     = x[j][i].u - lid;
 69:         f[j][i].v     = x[j][i].v;
 70:         f[j][i].omega = x[j][i].omega + (x[j][i].u - x[j-1][i].u)*dhy;
 71:     }
 72:   }

 74:   /* Test whether we are on the left edge of the global array */
 75:   if (xints == 0) {
 76:     i = 0;
 77:     xints = xints + 1;
 78:     /* left edge */
 79:     for (j=info->ys; j<info->ys+info->ym; j++) {
 80:       f[j][i].u     = x[j][i].u;
 81:       f[j][i].v     = x[j][i].v;
 82:       f[j][i].omega = x[j][i].omega - (x[j][i+1].v - x[j][i].v)*dhx;
 83:     }
 84:   }

 86:   /* Test whether we are on the right edge of the global array */
 87:   if (xinte == info->mx) {
 88:     i = info->mx - 1;
 89:     xinte = xinte - 1;
 90:     /* right edge */
 91:     for (j=info->ys; j<info->ys+info->ym; j++) {
 92:       f[j][i].u     = x[j][i].u;
 93:       f[j][i].v     = x[j][i].v;
 94:       f[j][i].omega = x[j][i].omega - (x[j][i].v - x[j][i-1].v)*dhx;
 95:     }
 96:   }

 98:   /* Compute over the interior points */
 99:   for (j=yints; j<yinte; j++) {
100:     for (i=xints; i<xinte; i++) {
101:       /* convective coefficients for upwinding */
102:         vx = x[j][i].u; avx = PetscAbsScalar(vx);
103:         vxp = .5*(vx+avx); vxm = .5*(vx-avx);
104:         vy = x[j][i].v; avy = PetscAbsScalar(vy);
105:         vyp = .5*(vy+avy); vym = .5*(vy-avy);

107:         /* U velocity */
108:         u          = x[j][i].u;
109:         uxx        = (2.0*u - x[j][i-1].u - x[j][i+1].u)*hydhx;
110:         uyy        = (2.0*u - x[j-1][i].u - x[j+1][i].u)*hxdhy;
111:         f[j][i].u  = uxx + uyy - .5*(x[j+1][i].omega-x[j-1][i].omega)*hx;

113:         /* V velocity */
114:         u          = x[j][i].v;
115:         uxx        = (2.0*u - x[j][i-1].v - x[j][i+1].v)*hydhx;
116:         uyy        = (2.0*u - x[j-1][i].v - x[j+1][i].v)*hxdhy;
117:         f[j][i].v  = uxx + uyy + .5*(x[j][i+1].omega-x[j][i-1].omega)*hy;

119:         /* Omega */
120:         u          = x[j][i].omega;
121:         uxx        = (2.0*u - x[j][i-1].omega - x[j][i+1].omega)*hydhx;
122:         uyy        = (2.0*u - x[j-1][i].omega - x[j+1][i].omega)*hxdhy;
123:         f[j][i].omega = uxx + uyy + (vxp*(u - x[j][i-1].omega) + vxm*(x[j][i+1].omega - u))*hy + (vyp*(u - x[j-1][i].omega) + vym*(x[j+1][i].omega - u))*hx;
124:         if (x2) {
125:           f[j][i].omega += - .5 * grashof * (x2[j][i+1].temp - x2[j][i-1].temp) * hy;
126:         }
127:     }
128:   }
129:   PetscLogEventEnd(EVENT_FORMFUNCTIONLOCAL1,0,0,0,0);
130:   return(0);
131: }