Esempio n. 1
0
        public Cut3d(SPARTA sparta)
        {
            this.sparta = sparta;
            cut2d       = new Cut2d(sparta, 0);
            for (int i = 0; i <= cut2d.npushmax; i++)
            {
                cut2d.npushcell[i] = 0;
            }
            path1 = new double[12, 3];
            path2 = new double[12, 3];
            //memory->create(path1, 12, 3, "cut3d:path1");
            //memory->create(path2, 12, 3, "cut3d:path2");

            npushmax = 2;    // if increase this, increase push vec size in cut3d.h

            pushlo_vec[0]    = -1.0;
            pushhi_vec[0]    = 1.0;
            pushvalue_vec[0] = 0.0;
            pushlo_vec[1]    = -1.0;
            pushhi_vec[1]    = 1.0;
            pushvalue_vec[1] = 1.0;

            /*
             * pushlo_vec[0] = -1.0;
             * pushhi_vec[0] = 1.0;
             * pushvalue_vec[0] = 1.0;
             * pushlo_vec[1] = -1.0;
             * pushhi_vec[1] = 1.0;
             * pushvalue_vec[1] = 0.0;
             */

            if (sparta.surf.pushflag == 0)
            {
                npushmax = 0;
            }
            if (sparta.surf.pushflag == 2)
            {
                npushmax = 3;
            }
            if (sparta.surf.pushflag == 2)
            {
                pushlo_vec[2]    = sparta.surf.pushlo;
                pushhi_vec[2]    = sparta.surf.pushhi;
                pushvalue_vec[2] = sparta.surf.pushvalue;
            }

            for (int i = 0; i <= npushmax; i++)
            {
                npushcell[i] = 0;
            }

            // DEBUG
            //totcell = totsurf = totvert = totedge = 0;
        }
Esempio n. 2
0
        public void surf2grid(int subflag, int outflag)
        {
            int i, isub, nsurf = 0, nsplitone = 0, xsub = 0;

            int[]     surfmap, ptr;
            double[]  lo, hi, vols;
            double[]  xsplit = new double[3];
            ChildCell c;
            SplitInfo s;
            Cut2d     cut2d;
            Cut3d     cut3d;

            int dim = sparta.domain.dimension;

            double[] slo = sparta.surf.bblo;
            double[] shi = sparta.surf.bbhi;

            cut3d = new Cut3d(sparta);
            cut2d = new Cut2d(sparta, sparta.domain.axisymmetric);

            // compute overlap of surfs with each cell I own
            // info stored in nsurf,csurfs

            //double t1 = MPI_Wtime();

            for (int icell = 0; icell < nlocal; icell++)
            {
                if (cells[icell].nsplit <= 0)
                {
                    continue;
                }

                lo = cells[icell].lo;
                hi = cells[icell].hi;
                if (box_overlap(lo, hi, slo, shi) == 0)
                {
                    continue;
                }

                ptr = csurfs.vget();

                if (dim == 3)
                {
                    Console.WriteLine("gridsurf 3d");
                    //nsurf = cut3d.surf2grid(cells[icell].id, cells[icell].lo, cells[icell].hi,
                    //                         ptr, maxsurfpercell);
                }

                else
                {
                    nsurf = cut2d.surf2grid(cells[icell].id, cells[icell].lo, cells[icell].hi,
                                            ptr, maxsurfpercell);
                }

                if (nsurf < 0)
                {
                    sparta.error.one("Too many surfs in one cell");
                }
                if (nsurf != 0)
                {
                    cinfo[icell].type   = (int)Enum4.OVERLAP;
                    cells[icell].nsurf  = nsurf;
                    cells[icell].csurfs = ptr;
                    csurfs.vgot(nsurf);
                }
            }

            //double t2 = MPI_Wtime();
            //printf("TIME %g\n",t2-t1);

            if (outflag != 0)
            {
                surf2grid_stats();
            }

            // compute cut volume and possible split of each grid cell by surfs
            // decrement nunsplitlocal if convert an unsplit cell to split cell
            // if nsplitone > 1, create new split cell sinfo and sub-cells

            int ncurrent = nlocal;

            for (int icell = 0; icell < ncurrent; icell++)
            {
                if (cells[icell].nsplit <= 0)
                {
                    continue;
                }
                if (cinfo[icell].type != (int)Enum4.OVERLAP)
                {
                    continue;
                }

                surfmap = csplits.vget();
                c       = cells[icell];

                if (dim == 3)
                {
                    Console.WriteLine("gridsurf 3d");
                    vols = new double[3];
                    //nsplitone = cut3d.split(c.id, c.lo, c.hi, c.nsurf, c.csurfs,
                    //                         vols, surfmap, cinfo[icell].corner, xsub, xsplit);
                }
                else
                {
                    vols      = new double[3];
                    nsplitone = cut2d.split(c.id, c.lo, c.hi, c.nsurf, c.csurfs,
                                            ref vols, surfmap, cinfo[icell].corner, ref xsub, xsplit);
                }

                cells[icell] = c;

                if (nsplitone == 1)
                {
                    cinfo[icell].volume = vols[0];
                }
                else if (subflag != 0)
                {
                    cells[icell].nsplit = nsplitone;
                    nunsplitlocal--;

                    cells[icell].isplit = nsplitlocal;
                    add_split_cell(1);
                    s           = sinfo[nsplitlocal - 1];
                    s.icell     = icell;
                    s.csplits   = surfmap;
                    s.xsub      = xsub;
                    s.xsplit[0] = xsplit[0];
                    s.xsplit[1] = xsplit[1];
                    if (dim == 3)
                    {
                        s.xsplit[2] = xsplit[2];
                    }
                    else
                    {
                        s.xsplit[2] = 0.0;
                    }

                    sinfo[nsplitlocal - 1] = s;
                    ptr = s.csubs = csubs.vget();

                    for (i = 0; i < nsplitone; i++)
                    {
                        isub = nlocal;
                        add_sub_cell(icell, 1);
                        cells[isub].nsplit = -i;
                        cinfo[isub].volume = vols[i];
                        ptr[i]             = isub;
                    }

                    csplits.vgot(cells[icell].nsurf);
                    csubs.vgot(nsplitone);
                }
                else
                {
                    if (cells[icell].nsplit != nsplitone)
                    {
                        Console.WriteLine("BAD {0} {1}: {2} {3}\n", icell, cells[icell].id,
                                          nsplitone, cells[icell].nsplit);
                        sparta.error.one("Inconsistent surface to grid mapping in read_restart");
                    }

                    s           = sinfo[cells[icell].isplit];
                    s.csplits   = surfmap;
                    s.xsub      = xsub;
                    s.xsplit[0] = xsplit[0];
                    s.xsplit[1] = xsplit[1];
                    if (dim == 3)
                    {
                        s.xsplit[2] = xsplit[2];
                    }
                    else
                    {
                        s.xsplit[2] = 0.0;
                    }
                    sinfo[cells[icell].isplit] = s;

                    ptr = s.csubs;
                    for (i = 0; i < nsplitone; i++)
                    {
                        isub = ptr[i];
                        cells[isub].nsurf  = cells[icell].nsurf;
                        cells[isub].csurfs = cells[icell].csurfs;
                        cinfo[isub].volume = vols[i];
                    }

                    csplits.vgot(cells[icell].nsurf);
                }
            }

            //double t3 = MPI_Wtime();
            //printf("TIME %g\n",t3-t2);

            // stats on pushed cells and unmarked corner points in OVERLAP cells

            if (outflag != 0)
            {
                int   npushmax;
                int[] npushcell;
                if (dim == 3)
                {
                    npushmax  = cut3d.npushmax;
                    npushcell = cut3d.npushcell;
                }
                else
                {
                    npushmax  = cut2d.npushmax;
                    npushcell = cut2d.npushcell;
                }
                int[] npushall = new int[npushmax + 1];
                //sparta.mpi.MPI_Allreduce(ref npushcell, ref npushall, npushmax + 1, MPI.MPI_INT, MPI.MPI_SUM, sparta.world);
                if (sparta.comm.me == 0)
                {
                    if (sparta.screen != null)
                    {
                        StreamWriter sw = new StreamWriter(sparta.screen);

                        sw.Write("  ");
                        Console.Write("  ");
                        for (int ii = 1; ii <= npushmax; ii++)
                        {
                            sw.Write("{0} ", npushall[ii]);
                            Console.Write("{0} ", npushall[ii]);
                        }

                        sw.WriteLine("= number of pushed cells\n");
                        Console.WriteLine("= number of pushed cells\n");
                    }
                    if (sparta.logfile != null)
                    {
                        StreamWriter sw = new StreamWriter(sparta.logfile);
                        sw.Write("  ");
                        for (int ii = 1; ii <= npushmax; ii++)
                        {
                            sw.Write("{0} ", npushall[ii]);
                        }
                        sw.WriteLine("= number of pushed cells\n");
                    }
                }
                //delete[] npushall;

                int noverlap = 0;
                int ncorner  = 0;
                for (int icell = 0; icell < nlocal; icell++)
                {
                    if (cells[icell].nsplit <= 0)
                    {
                        continue;
                    }
                    if (cinfo[icell].type == (int)Enum4.OVERLAP)
                    {
                        noverlap++;
                        if (cinfo[icell].corner[0] == (int)Enum4.UNKNOWN)
                        {
                            ncorner++;
                        }
                    }
                }
                int ncornerall = 0, noverlapall = 0;
                sparta.mpi.MPI_Allreduce(ref ncorner, ref ncornerall, 1, MPI.MPI_INT, MPI.MPI_SUM, sparta.world);
                sparta.mpi.MPI_Allreduce(ref noverlap, ref noverlapall, 1, MPI.MPI_INT, MPI.MPI_SUM, sparta.world);
                if (sparta.comm.me == 0)
                {
                    string str = string.Format("  {0} {1} = cells overlapping surfs,overlap cells with unmarked corner pts\n",
                                               noverlapall, ncornerall);
                    Console.WriteLine(str);
                    if (sparta.screen != null)
                    {
                        new StreamWriter(sparta.screen).WriteLine(str);
                    }

                    if (sparta.logfile != null)
                    {
                        new StreamWriter(sparta.logfile).WriteLine(str);
                    }
                }
            }

            // clean up
        }