예제 #1
0
        public override int go()
        {
            int    c, i, j, k, m, ii, jj, kk, ix, iy, iz;
            double xi, eta, zeta, Pxi, Peta, Pzeta;

            double[] Pface = new double[5 * 3 * 2];
            double[] temp  = new double[5];

            //---------------------------------------------------------------------
            //  Later (in compute_rhs) we compute 1/u for every element. A few of
            //  the corner elements are not used, but it convenient (and faster)
            //  to compute the whole thing with a simple loop. Make sure those
            //  values are nonzero by initializing the whole thing here.
            //---------------------------------------------------------------------
            for (c = 0; c < ncells; c++)
            {
                for (k = 1; k <= IMAX + 2; k++)
                {
                    for (j = 1; j <= IMAX + 2; j++)
                    {
                        for (i = 1; i <= IMAX + 2; i++)
                        {
                            u[c, k, j, i, 0] = 1.0d;
                            u[c, k, j, i, 1] = 0.0d;
                            u[c, k, j, i, 2] = 0.0d;
                            u[c, k, j, i, 3] = 0.0d;
                            u[c, k, j, i, 4] = 1.0d;
                        }
                    }
                }
            }


            //---------------------------------------------------------------------
            // first store the "interpolated" values everywhere on the grid
            //---------------------------------------------------------------------
            for (c = 0; c < maxcells; c++)
            {
                kk = 2;
                for (k = cell_low[c, 2]; k <= cell_high[c, 2]; k++)
                {
                    zeta = k * dnzm1;
                    jj   = 2;
                    for (j = cell_low[c, 1]; j <= cell_high[c, 1]; j++)
                    {
                        eta = j * dnym1;
                        ii  = 2;
                        for (i = cell_low[c, 0]; i <= cell_high[c, 0]; i++)
                        {
                            xi = i * dnxm1;

                            for (ix = 0; ix <= 1; ix++)
                            {
                                Exact_solution.setParameters(ix, eta, zeta, Pface, 0 + 0 * 5 + ix * 15);
                                Exact_solution.go();
                            }
                            for (iy = 0; iy <= 1; iy++)
                            {
                                Exact_solution.setParameters(xi, iy, zeta, Pface, 0 + 1 * 5 + iy * 15);
                                Exact_solution.go();
                            }

                            for (iz = 0; iz <= 1; iz++)
                            {
                                Exact_solution.setParameters(xi, eta, iz, Pface, 0 + 2 * 5 + iz * 15);
                                Exact_solution.go();
                            }

                            for (m = 0; m < 5; m++)
                            {
                                Pxi = xi * Pface[m + 0 * 5 + 1 * 15] +
                                      (1.0d - xi) * Pface[m + 0 * 5 + 0 * 15];
                                Peta = eta * Pface[m + 1 * 5 + 1 * 15] +
                                       (1.0d - eta) * Pface[m + 1 * 5 + 0 * 15];
                                Pzeta = zeta * Pface[m + 2 * 5 + 1 * 15] +
                                        (1.0d - zeta) * Pface[m + 2 * 5 + 0 * 15];

                                u[c, kk, jj, ii, m] =
                                    Pxi + Peta + Pzeta -
                                    Pxi * Peta - Pxi * Pzeta - Peta * Pzeta +
                                    Pxi * Peta * Pzeta;
                            }
                            ii++;
                        }
                        jj++;
                    }
                    kk++;
                }
            }


            //---------------------------------------------------------------------
            // now store the exact values on the boundaries
            //---------------------------------------------------------------------

            //---------------------------------------------------------------------
            // west face
            //---------------------------------------------------------------------

            c  = slice[0, 0];
            ii = 2;
            xi = 0.0d;
            kk = 2;
            for (k = cell_low[c, 2]; k <= cell_high[c, 2]; k++)
            {
                zeta = k * dnzm1;
                jj   = 2;
                for (j = cell_low[c, 1]; j <= cell_high[c, 1]; j++)
                {
                    eta = j * dnym1;
                    Exact_solution.setParameters(xi, eta, zeta, temp, 0);
                    Exact_solution.go();
                    for (m = 0; m < 5; m++)
                    {
                        u[c, kk, jj, ii, m] = temp[m];
                    }
                    jj++;
                }
                kk++;
            }

            //---------------------------------------------------------------------
            // east face
            //---------------------------------------------------------------------

            c  = slice[ncells - 1, 0];
            ii = 2 + cell_size[c, 0] - 1;
            xi = 1.0d;
            kk = 2;
            for (k = cell_low[c, 2]; k <= cell_high[c, 2]; k++)
            {
                zeta = k * dnzm1;
                jj   = 2;
                for (j = cell_low[c, 1]; j <= cell_high[c, 1]; j++)
                {
                    eta = j * dnym1;
                    Exact_solution.setParameters(xi, eta, zeta, temp, 0);
                    Exact_solution.go();
                    for (m = 0; m <= 4; m++)
                    {
                        u[c, kk, jj, ii, m] = temp[m];
                    }
                    jj++;
                }
                kk++;
            }

            //---------------------------------------------------------------------
            // south face
            //---------------------------------------------------------------------

            c   = slice[0, 1];
            jj  = 2;
            eta = 0.0d;
            kk  = 2;
            for (k = cell_low[c, 2]; k <= cell_high[c, 2]; k++)
            {
                zeta = k * dnzm1;
                ii   = 2;
                for (i = cell_low[c, 0]; i <= cell_high[c, 0]; i++)
                {
                    xi = i * dnxm1;
                    Exact_solution.setParameters(xi, eta, zeta, temp, 0);
                    Exact_solution.go();
                    for (m = 0; m <= 4; m++)
                    {
                        u[c, kk, jj, ii, m] = temp[m];
                    }
                    ii++;
                }
                kk++;
            }

            //---------------------------------------------------------------------
            // north face
            //---------------------------------------------------------------------

            c   = slice[ncells - 1, 1];
            jj  = 2 + cell_size[c, 1] - 1;
            eta = 1.0d;
            kk  = 2;
            for (k = cell_low[c, 2]; k <= cell_high[c, 2]; k++)
            {
                zeta = k * dnzm1;
                ii   = 2;
                for (i = cell_low[c, 0]; i <= cell_high[c, 0]; i++)
                {
                    xi = i * dnxm1;
                    Exact_solution.setParameters(xi, eta, zeta, temp, 0);
                    Exact_solution.go();
                    for (m = 0; m <= 4; m++)
                    {
                        u[c, kk, jj, ii, m] = temp[m];
                    }
                    ii++;
                }
                kk++;
            }

            //---------------------------------------------------------------------
            // bottom face
            //---------------------------------------------------------------------

            c    = slice[0, 2];
            kk   = 2;
            zeta = 0.0d;
            jj   = 2;
            for (j = cell_low[c, 1]; j <= cell_high[c, 1]; j++)
            {
                eta = j * dnym1;
                ii  = 2;
                for (i = cell_low[c, 0]; i <= cell_high[c, 0]; i++)
                {
                    xi = i * dnxm1;
                    Exact_solution.setParameters(xi, eta, zeta, temp, 0);
                    Exact_solution.go();
                    for (m = 0; m <= 4; m++)
                    {
                        u[c, kk, jj, ii, m] = temp[m];
                    }
                    ii++;
                }
                jj++;
            }

            //---------------------------------------------------------------------
            // top face
            //---------------------------------------------------------------------

            c    = slice[ncells - 1, 2];
            kk   = 2 + cell_size[c, 2] - 1;
            zeta = 1.0d;
            jj   = 2;
            for (j = cell_low[c, 1]; j <= cell_high[c, 1]; j++)
            {
                eta = j * dnym1;
                ii  = 2;
                for (i = cell_low[c, 0]; i <= cell_high[c, 0]; i++)
                {
                    xi = i * dnxm1;
                    Exact_solution.setParameters(xi, eta, zeta, temp, 0);
                    Exact_solution.go();
                    for (m = 0; m <= 4; m++)
                    {
                        u[c, kk, jj, ii, m] = temp[m];
                    }
                    ii++;
                }
                jj++;
            }

            return(0);
        }         // end activate method
        public override int go()
        {
            double[] dtemp = new double[5];
            double   xi, eta, zeta, dtpp;
            int      c, m, i, j, k, ip1, im1, jp1, jm1, km1, kp1, ksize, jsize, isize;

            // int ii, jj, kk;  /* +2 offset required by C# arrays for Fortran with -2 lower limit */


            for (c = 0; c < ncells; c++)
            {
                ksize = cell_size[c, 2] + 2;
                jsize = cell_size[c, 1] + 2;
                isize = cell_size[c, 0] + 2;

                //---------------------------------------------------------------------
                //      initialize
                //---------------------------------------------------------------------
                for (m = 0; m < 5; m++)
                {
                    for (k = 2; k < ksize; k++)
                    {
                        for (j = 2; j < jsize; j++)
                        {
                            for (i = 2; i < isize; i++)
                            {
                                forcing[c, k, j, i, m] = 0.0d;
                            }
                        }
                    }
                }

                //---------------------------------------------------------------------
                //      xi-direction flux differences
                //---------------------------------------------------------------------
                for (k = start[c, 2]; k < ksize - end[c, 2]; k++)
                {
                    zeta = (k - 2 + cell_low[c, 2]) * dnzm1;
                    for (j = start[c, 1]; j < jsize - end[c, 1]; j++)
                    {
                        eta = (j - 2 + cell_low[c, 1]) * dnym1;
                        for (i = 2 * start[c, 0] - 4; i <= isize + 1 - 2 * end[c, 0]; i++)
                        {
                            xi = (i - 2 + cell_low[c, 0]) * dnxm1;

                            Exact_solution.setParameters(xi, eta, zeta, dtemp, 0);
                            Exact_solution.go();
                            for (m = 0; m < 5; m++)
                            {
                                ue[i, m] = dtemp[m];         // OK ue[i,m]
                            }

                            dtpp = 1.0d / dtemp[0];

                            for (m = 1; m < 5; m++)
                            {
                                buf[i, m] = dtpp * dtemp[m];         // OK buf[i,m]
                            }

                            cuf[i]    = buf[i, 1] * buf[i, 1];
                            buf[i, 0] = cuf[i] + buf[i, 2] * buf[i, 2] +
                                        buf[i, 3] * buf[i, 3];
                            q[i] = 0.5d * (buf[i, 1] * ue[i, 1] + buf[i, 2] * ue[i, 2] +
                                           buf[i, 3] * ue[i, 3]);
                            // OK cuf[i], buf[i,0], q[i]
                        }

                        for (i = start[c, 0]; i < isize - end[c, 0]; i++)
                        {
                            im1 = i - 1;
                            ip1 = i + 1;

                            double b = forcing[c, k, j, i, 0];

                            forcing[c, k, j, i, 0] = forcing[c, k, j, i, 0] -
                                                     tx2 * (ue[ip1, 1] - ue[im1, 1]) +
                                                     dx1tx1 * (ue[ip1, 0] - 2.0d * ue[i, 0] + ue[im1, 0]);

                            forcing[c, k, j, i, 1] = forcing[c, k, j, i, 1] - tx2 * (
                                (ue[ip1, 1] * buf[ip1, 1] + c2 * (ue[ip1, 4] - q[ip1])) -
                                (ue[im1, 1] * buf[im1, 1] + c2 * (ue[im1, 4] - q[im1]))) +
                                                     xxcon1 * (buf[ip1, 1] - 2.0d * buf[i, 1] + buf[im1, 1]) +
                                                     dx2tx1 * (ue[ip1, 1] - 2.0d * ue[i, 1] + ue[im1, 1]);

                            forcing[c, k, j, i, 2] = forcing[c, k, j, i, 2] - tx2 * (
                                ue[ip1, 2] * buf[ip1, 1] - ue[im1, 2] * buf[im1, 1]) +
                                                     xxcon2 * (buf[ip1, 2] - 2.0d * buf[i, 2] + buf[im1, 2]) +
                                                     dx3tx1 * (ue[ip1, 2] - 2.0d * ue[i, 2] + ue[im1, 2]);


                            forcing[c, k, j, i, 3] = forcing[c, k, j, i, 3] - tx2 * (
                                ue[ip1, 3] * buf[ip1, 1] - ue[im1, 3] * buf[im1, 1]) +
                                                     xxcon2 * (buf[ip1, 3] - 2.0d * buf[i, 3] + buf[im1, 3]) +
                                                     dx4tx1 * (ue[ip1, 3] - 2.0d * ue[i, 3] + ue[im1, 3]);

                            forcing[c, k, j, i, 4] = forcing[c, k, j, i, 4] - tx2 * (
                                buf[ip1, 1] * (c1 * ue[ip1, 4] - c2 * q[ip1]) -
                                buf[im1, 1] * (c1 * ue[im1, 4] - c2 * q[im1])) +
                                                     0.5d * xxcon3 * (buf[ip1, 0] - 2.0d * buf[i, 0] +
                                                                      buf[im1, 0]) +
                                                     xxcon4 * (cuf[ip1] - 2.0d * cuf[i] + cuf[im1]) +
                                                     xxcon5 * (buf[ip1, 4] - 2.0d * buf[i, 4] + buf[im1, 4]) +
                                                     dx5tx1 * (ue[ip1, 4] - 2.0d * ue[i, 4] + ue[im1, 4]);
                        }

                        //---------------------------------------------------------------------
                        //            Fourth-order dissipation
                        //---------------------------------------------------------------------
                        if (start[c, 0] > 2)
                        {
                            for (m = 0; m < 5; m++)
                            {
                                i = 3;
                                forcing[c, k, j, i, m] = forcing[c, k, j, i, m] - dssp *
                                                         (5.0d * ue[i, m] - 4.0d * ue[i + 1, m] + ue[i + 2, m]);
                                i = 4;
                                forcing[c, k, j, i, m] = forcing[c, k, j, i, m] - dssp *
                                                         (-4.0d * ue[i - 1, m] + 6.0d * ue[i, m] -
                                                          4.0d * ue[i + 1, m] + ue[i + 2, m]);
                            }
                        }

                        for (m = 0; m < 5; m++)
                        {
                            for (i = 3 * start[c, 0] - 4; i < isize - 3 * end[c, 0]; i++)
                            {
                                forcing[c, k, j, i, m] = forcing[c, k, j, i, m] - dssp *
                                                         (ue[i - 2, m] - 4.0d * ue[i - 1, m] +
                                                          6.0d * ue[i, m] - 4.0d * ue[i + 1, m] + ue[i + 2, m]);
                            }
                        }

                        if (end[c, 0] > 0)
                        {
                            for (m = 0; m < 5; m++)
                            {
                                i = isize - 3;
                                forcing[c, k, j, i, m] = forcing[c, k, j, i, m] - dssp *
                                                         (ue[i - 2, m] - 4.0d * ue[i - 1, m] +
                                                          6.0d * ue[i, m] - 4.0d * ue[i + 1, m]);
                                i = isize - 2;
                                forcing[c, k, j, i, m] = forcing[c, k, j, i, m] - dssp *
                                                         (ue[i - 2, m] - 4.0d * ue[i - 1, m] + 5.0d * ue[i, m]);
                            }
                        }
                    }
                }         // end k

                //---------------------------------------------------------------------
                //  eta-direction flux differences
                //---------------------------------------------------------------------
                for (k = start[c, 2]; k < ksize - end[c, 2]; k++)
                {
                    zeta = (k - 2 + cell_low[c, 2]) * dnzm1;
                    for (i = start[c, 0]; i < isize - end[c, 0]; i++)
                    {
                        xi = (i - 2 + cell_low[c, 0]) * dnxm1;

                        for (j = 2 * start[c, 1] - 4; j <= jsize + 1 - 2 * end[c, 1]; j++)
                        {
                            eta = (j - 2 + cell_low[c, 1]) * dnym1;

                            Exact_solution.setParameters(xi, eta, zeta, dtemp, 0);
                            Exact_solution.go();
                            for (m = 0; m < 5; m++)
                            {
                                ue[j, m] = dtemp[m];
                            }
                            dtpp = 1.0d / dtemp[0];

                            for (m = 1; m < 5; m++)
                            {
                                buf[j, m] = dtpp * dtemp[m];
                            }

                            cuf[j]    = buf[j, 2] * buf[j, 2];
                            buf[j, 0] = cuf[j] + buf[j, 1] * buf[j, 1] +
                                        buf[j, 3] * buf[j, 3];
                            q[j] = 0.5d * (buf[j, 1] * ue[j, 1] +
                                           buf[j, 2] * ue[j, 2] +
                                           buf[j, 3] * ue[j, 3]);
                        }

                        for (j = start[c, 1]; j < jsize - end[c, 1]; j++)
                        {
                            jm1 = j - 1;
                            jp1 = j + 1;

                            forcing[c, k, j, i, 0] = forcing[c, k, j, i, 0] -
                                                     ty2 * (ue[jp1, 2] - ue[jm1, 2]) +
                                                     dy1ty1 * (ue[jp1, 0] - 2.0d * ue[j, 0] + ue[jm1, 0]);

                            forcing[c, k, j, i, 1] = forcing[c, k, j, i, 1] - ty2 * (
                                ue[jp1, 1] * buf[jp1, 2] - ue[jm1, 1] * buf[jm1, 2]) +
                                                     yycon2 * (buf[jp1, 1] - 2.0d * buf[j, 1] + buf[jm1, 1]) +
                                                     dy2ty1 * (ue[jp1, 1] - 2.0d * ue[j, 1] + ue[jm1, 1]);

                            forcing[c, k, j, i, 2] = forcing[c, k, j, i, 2] - ty2 * (
                                (ue[jp1, 2] * buf[jp1, 2] + c2 * (ue[jp1, 4] - q[jp1])) -
                                (ue[jm1, 2] * buf[jm1, 2] + c2 * (ue[jm1, 4] - q[jm1]))) +
                                                     yycon1 * (buf[jp1, 2] - 2.0d * buf[j, 2] + buf[jm1, 2]) +
                                                     dy3ty1 * (ue[jp1, 2] - 2.0d * ue[j, 2] + ue[jm1, 2]);

                            forcing[c, k, j, i, 3] = forcing[c, k, j, i, 3] - ty2 * (
                                ue[jp1, 3] * buf[jp1, 2] - ue[jm1, 3] * buf[jm1, 2]) +
                                                     yycon2 * (buf[jp1, 3] - 2.0d * buf[j, 3] + buf[jm1, 3]) +
                                                     dy4ty1 * (ue[jp1, 3] - 2.0d * ue[j, 3] + ue[jm1, 3]);

                            forcing[c, k, j, i, 4] = forcing[c, k, j, i, 4] - ty2 * (
                                buf[jp1, 2] * (c1 * ue[jp1, 4] - c2 * q[jp1]) -
                                buf[jm1, 2] * (c1 * ue[jm1, 4] - c2 * q[jm1])) +
                                                     0.5d * yycon3 * (buf[jp1, 0] - 2.0d * buf[j, 0] +
                                                                      buf[jm1, 0]) +
                                                     yycon4 * (cuf[jp1] - 2.0d * cuf[j] + cuf[jm1]) +
                                                     yycon5 * (buf[jp1, 4] - 2.0d * buf[j, 4] + buf[jm1, 4]) +
                                                     dy5ty1 * (ue[jp1, 4] - 2.0d * ue[j, 4] + ue[jm1, 4]);
                        }

                        //---------------------------------------------------------------------
                        //            Fourth-order dissipation
                        //---------------------------------------------------------------------
                        if (start[c, 1] > 2)
                        {
                            for (m = 0; m < 5; m++)
                            {
                                j = 3;
                                forcing[c, k, j, i, m] = forcing[c, k, j, i, m] - dssp *
                                                         (5.0d * ue[j, m] - 4.0d * ue[j + 1, m] + ue[j + 2, m]);
                                j = 4;
                                forcing[c, k, j, i, m] = forcing[c, k, j, i, m] - dssp *
                                                         (-4.0d * ue[j - 1, m] + 6.0d * ue[j, m] -
                                                          4.0d * ue[j + 1, m] + ue[j + 2, m]);
                            }
                        }

                        for (m = 0; m < 5; m++)
                        {
                            for (j = 3 * start[c, 1] - 4; j < jsize - 3 * end[c, 1]; j++)
                            {
                                forcing[c, k, j, i, m] = forcing[c, k, j, i, m] - dssp *
                                                         (ue[j - 2, m] - 4.0d * ue[j - 1, m] +
                                                          6.0d * ue[j, m] - 4.0d * ue[j + 1, m] + ue[j + 2, m]);
                            }
                        }

                        if (end[c, 1] > 0)
                        {
                            for (m = 0; m < 5; m++)
                            {
                                j = jsize - 3;
                                forcing[c, k, j, i, m] = forcing[c, k, j, i, m] - dssp *
                                                         (ue[j - 2, m] - 4.0d * ue[j - 1, m] +
                                                          6.0d * ue[j, m] - 4.0d * ue[j + 1, m]);
                                j = jsize - 2;
                                forcing[c, k, j, i, m] = forcing[c, k, j, i, m] - dssp *
                                                         (ue[j - 2, m] - 4.0d * ue[j - 1, m] + 5.0d * ue[j, m]);
                            }
                        }
                    }
                }

                //---------------------------------------------------------------------
                //      zeta-direction flux differences
                //---------------------------------------------------------------------
                for (j = start[c, 1]; j < jsize - end[c, 1]; j++)
                {
                    eta = (j - 2 + cell_low[c, 1]) * dnym1;
                    for (i = start[c, 0]; i < isize - end[c, 0]; i++)
                    {
                        xi = (i - 2 + cell_low[c, 0]) * dnxm1;

                        for (k = 2 * start[c, 2] - 4; k <= ksize + 1 - 2 * end[c, 2]; k++)
                        {
                            zeta = (k - 2 + cell_low[c, 2]) * dnzm1;

                            Exact_solution.setParameters(xi, eta, zeta, dtemp, 0);
                            Exact_solution.go();

                            for (m = 0; m <= 4; m++)
                            {
                                ue[k, m] = dtemp[m];
                            }

                            dtpp = 1.0d / dtemp[0];

                            for (m = 1; m < 5; m++)
                            {
                                buf[k, m] = dtpp * dtemp[m];
                            }

                            cuf[k]    = buf[k, 3] * buf[k, 3];
                            buf[k, 0] = cuf[k] + buf[k, 1] * buf[k, 1] +
                                        buf[k, 2] * buf[k, 2];
                            q[k] = 0.5d * (buf[k, 1] * ue[k, 1] + buf[k, 2] * ue[k, 2] +
                                           buf[k, 3] * ue[k, 3]);
                        }

                        for (k = start[c, 2]; k < ksize - end[c, 2]; k++)
                        {
                            km1 = k - 1;
                            kp1 = k + 1;

                            forcing[c, k, j, i, 0] = forcing[c, k, j, i, 0] -
                                                     tz2 * (ue[kp1, 3] - ue[km1, 3]) +
                                                     dz1tz1 * (ue[kp1, 0] - 2.0d * ue[k, 0] + ue[km1, 0]);

                            forcing[c, k, j, i, 1] = forcing[c, k, j, i, 1] - tz2 * (
                                ue[kp1, 1] * buf[kp1, 3] - ue[km1, 1] * buf[km1, 3]) +
                                                     zzcon2 * (buf[kp1, 1] - 2.0d * buf[k, 1] + buf[km1, 1]) +
                                                     dz2tz1 * (ue[kp1, 1] - 2.0d * ue[k, 1] + ue[km1, 1]);

                            forcing[c, k, j, i, 2] = forcing[c, k, j, i, 2] - tz2 * (
                                ue[kp1, 2] * buf[kp1, 3] - ue[km1, 2] * buf[km1, 3]) +
                                                     zzcon2 * (buf[kp1, 2] - 2.0d * buf[k, 2] + buf[km1, 2]) +
                                                     dz3tz1 * (ue[kp1, 2] - 2.0d * ue[k, 2] + ue[km1, 2]);

                            forcing[c, k, j, i, 3] = forcing[c, k, j, i, 3] - tz2 * (
                                (ue[kp1, 3] * buf[kp1, 3] + c2 * (ue[kp1, 4] - q[kp1])) -
                                (ue[km1, 3] * buf[km1, 3] + c2 * (ue[km1, 4] - q[km1]))) +
                                                     zzcon1 * (buf[kp1, 3] - 2.0d * buf[k, 3] + buf[km1, 3]) +
                                                     dz4tz1 * (ue[kp1, 3] - 2.0d * ue[k, 3] + ue[km1, 3]);

                            forcing[c, k, j, i, 4] = forcing[c, k, j, i, 4] - tz2 * (
                                buf[kp1, 3] * (c1 * ue[kp1, 4] - c2 * q[kp1]) -
                                buf[km1, 3] * (c1 * ue[km1, 4] - c2 * q[km1])) +
                                                     0.5d * zzcon3 * (buf[kp1, 0] - 2.0d * buf[k, 0]
                                                                      + buf[km1, 0]) +
                                                     zzcon4 * (cuf[kp1] - 2.0d * cuf[k] + cuf[km1]) +
                                                     zzcon5 * (buf[kp1, 4] - 2.0d * buf[k, 4] + buf[km1, 4]) +
                                                     dz5tz1 * (ue[kp1, 4] - 2.0d * ue[k, 4] + ue[km1, 4]);
                        }

                        //---------------------------------------------------------------------
                        //            Fourth-order dissipation
                        //---------------------------------------------------------------------
                        if (start[c, 2] > 2)
                        {
                            for (m = 0; m < 5; m++)
                            {
                                k = 3;
                                forcing[c, k, j, i, m] = forcing[c, k, j, i, m] - dssp *
                                                         (5.0d * ue[k, m] - 4.0d * ue[k + 1, m] + ue[k + 2, m]);
                                k = 4;
                                forcing[c, k, j, i, m] = forcing[c, k, j, i, m] - dssp *
                                                         (-4.0d * ue[k - 1, m] + 6.0d * ue[k, m] -
                                                          4.0d * ue[k + 1, m] + ue[k + 2, m]);
                            }
                        }

                        for (m = 0; m < 5; m++)
                        {
                            for (k = 3 * start[c, 2] - 4; k < ksize - 3 * end[c, 2]; k++)
                            {
                                forcing[c, k, j, i, m] = forcing[c, k, j, i, m] - dssp *
                                                         (ue[k - 2, m] - 4.0d * ue[k - 1, m] +
                                                          6.0d * ue[k, m] - 4.0d * ue[k + 1, m] + ue[k + 2, m]);
                            }
                        }

                        if (end[c, 2] > 0)
                        {
                            for (m = 0; m < 5; m++)
                            {
                                k = ksize - 3;
                                forcing[c, k, j, i, m] = forcing[c, k, j, i, m] - dssp *
                                                         (ue[k - 2, m] - 4.0d * ue[k - 1, m] +
                                                          6.0d * ue[k, m] - 4.0d * ue[k + 1, m]);
                                k = ksize - 2;
                                forcing[c, k, j, i, m] = forcing[c, k, j, i, m] - dssp *
                                                         (ue[k - 2, m] - 4.0d * ue[k - 1, m] + 5.0d * ue[k, m]);
                            }
                        }
                    }
                }

                //---------------------------------------------------------------------
                // now change the sign of the forcing function,
                //---------------------------------------------------------------------
                for (m = 0; m < 5; m++)
                {
                    for (k = start[c, 2]; k < ksize - end[c, 2]; k++)
                    {
                        for (j = start[c, 1]; j < jsize - end[c, 1]; j++)
                        {
                            for (i = start[c, 0]; i < isize - end[c, 0]; i++)
                            {
                                forcing[c, k, j, i, m] = -1.0d * forcing[c, k, j, i, m];
                            }
                        }
                    }
                }
            }         // cell loop

            return(0);
        }         // end activate method
예제 #3
0
        public override int go()
        {
            dnxm1 = Constants.dnxm1;
            dnym1 = Constants.dnym1;
            dnzm1 = Constants.dnzm1;

            int    c, i, j, k, ii, jj, kk, m, d;
            double xi, eta, zeta;

            double[] u_exact = new double[5];
            double   add;

            double[] rms_work = new double[5];

            for (m = 0; m < 5; m++)
            {
                rms_work[m] = 0.0d;
            }

            for (c = 0; c < ncells; c++)
            {
                kk = 2;
                for (k = cell_low[c, 2]; k <= cell_high[c, 2]; k++)
                {
                    zeta = k * dnzm1;
                    jj   = 2;
                    for (j = cell_low[c, 1]; j <= cell_high[c, 1]; j++)
                    {
                        eta = j * dnym1;
                        ii  = 2;
                        for (i = cell_low[c, 0]; i <= cell_high[c, 0]; i++)
                        {
                            xi = i * dnxm1;

                            Exact_solution.setParameters(xi, eta, zeta, u_exact, 0);
                            Exact_solution.go();

                            for (m = 0; m < 5; m++)
                            {
                                add          = u[c, kk, jj, ii, m] - u_exact[m];
                                rms_work[m] += add * add;
                            }
                            ii++;
                        }
                        jj++;
                    }
                    kk++;
                }
            }

            comm_setup.Allreduce <double>(rms_work, Operation <double> .Add, ref rms);

            for (m = 0; m < 5; m++)
            {
                for (d = 0; d < 3; d++)
                {
                    rms[m] /= (grid_points[d] - 2);
                }
                rms[m] = Math.Sqrt(rms[m]);
            }

            return(0);
        } // end activate method