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: }