SundancePartitionedLineMesher.cpp
Go to the documentation of this file.
00001 /* @HEADER@ */
00002 // ************************************************************************
00003 // 
00004 //                             Sundance
00005 //                 Copyright 2011 Sandia Corporation
00006 // 
00007 // Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation,
00008 // the U.S. Government retains certain rights in this software.
00009 //
00010 // Redistribution and use in source and binary forms, with or without
00011 // modification, are permitted provided that the following conditions are
00012 // met:
00013 //
00014 // 1. Redistributions of source code must retain the above copyright
00015 // notice, this list of conditions and the following disclaimer.
00016 //
00017 // 2. Redistributions in binary form must reproduce the above copyright
00018 // notice, this list of conditions and the following disclaimer in the
00019 // documentation and/or other materials provided with the distribution.
00020 //
00021 // 3. Neither the name of the Corporation nor the names of the
00022 // contributors may be used to endorse or promote products derived from
00023 // this software without specific prior written permission.
00024 //
00025 // THIS SOFTWARE IS PROVIDED BY SANDIA CORPORATION "AS IS" AND ANY
00026 // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
00027 // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
00028 // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SANDIA CORPORATION OR THE
00029 // CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
00030 // EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
00031 // PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
00032 // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
00033 // LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
00034 // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
00035 // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
00036 //
00037 // Questions? Contact Kevin Long (kevin.long@ttu.edu)
00038 // 
00039 
00040 /* @HEADER@ */
00041 
00042 
00043 #include "SundancePartitionedLineMesher.hpp"
00044 #include "SundanceOut.hpp"
00045 #include "SundanceCollectiveExceptionCheck.hpp"
00046 
00047 using namespace Sundance;
00048 using namespace Sundance;
00049 
00050 using namespace Teuchos;
00051 using namespace Sundance;
00052 
00053 
00054 PartitionedLineMesher::PartitionedLineMesher(const ParameterList& params)
00055   : MeshSourceBase(params),
00056     ax_(params.get<double>("ax")),
00057     bx_(params.get<double>("bx")),
00058     nx_(params.get<int>("nx"))
00059 {;}
00060 
00061 Mesh PartitionedLineMesher::fillMesh() const
00062 {
00063   Mesh mesh;
00064 
00065   try
00066     {
00067       SUNDANCE_OUT(this->verb() > 0,
00068                    "PartitionedLineMesher::fillLocalMesh() is meshing "
00069                    "interval [" << ax_ << ", " << bx_ << "]");
00070 
00071       mesh = createMesh(1);
00072 
00073 
00074       /* compute number of points per proc */
00075 
00076       int np = nProc();
00077       int nppx = nx_/np;
00078 
00079       SUNDANCE_OUT(this->verb() > 0,
00080                    "PartitionedLineMesher::fillLocalMesh() has " << nppx
00081                    << " points per proc");
00082 
00083       int px = myRank();
00084 
00085       int lowestVisiblePtX = px*nppx-1;
00086       if (lowestVisiblePtX < 0) lowestVisiblePtX = 0;
00087   
00088       int highestVisiblePtX = lowestVisiblePtX + nppx + 1;
00089       if (highestVisiblePtX > nx_) highestVisiblePtX = nx_;
00090 
00091       SUNDANCE_OUT(this->verb() > 0,
00092                    "index range is [" << lowestVisiblePtX << ", " << 
00093                    highestVisiblePtX << "]");
00094 
00095       Array<int> pts(highestVisiblePtX-lowestVisiblePtX+1); 
00096       int globalIndex = 0;
00097 
00098       /* add the visible points into the mesh */
00099       for (int i=0; i<=nx_; i++, globalIndex++)
00100         {
00101           if (i < lowestVisiblePtX || i > highestVisiblePtX) continue;
00102           int pointOwner = i/nppx;
00103           if (i==nx_) pointOwner--;
00104           Point x( ax_ + ((double) i)*(bx_-ax_)/((double) nx_)); 
00105 
00106           SUNDANCE_OUT(this->verb() > 1, "adding point GID=" 
00107                        << globalIndex << " x=" << x << " owner=" << pointOwner); 
00108           int lid = mesh.addVertex(globalIndex, x, pointOwner, 0);
00109           pts[i-lowestVisiblePtX] = globalIndex;
00110           SUNDANCE_OUT(this->verb() >  3,
00111                        "point " << x << " registered with LID=" << lid);
00112         }
00113 
00114       /* add the visible cells to the mesh */
00115       globalIndex = 0 ;
00116 
00117       for (int i=0; i<nx_; i++, globalIndex++)
00118         {
00119           if (i < lowestVisiblePtX || i >= highestVisiblePtX) continue;
00120           int a = pts[i-lowestVisiblePtX];
00121           int b = pts[i-lowestVisiblePtX+1];
00122           int cellOwner = i/nppx;
00123           SUNDANCE_OUT(this->verb() > 1, "adding elem GID=" 
00124                        << globalIndex << " nodes=" << tuple(a,b) 
00125                        << " owner=" << cellOwner); 
00126 
00127           int lid = mesh.addElement(globalIndex, tuple(a,b), cellOwner, 0);
00128           SUNDANCE_OUT(this->verb() >  3,
00129                        "elem " << tuple(a,b) << " registered with LID=" << lid);
00130         }
00131 
00132       mesh.freezeTopology();
00133 
00134       if (px==0) mesh.setLabel(0, 0, 1); 
00135       if (px==np-1) mesh.setLabel(0, mesh.mapGIDToLID(0, nx_), 2);
00136     
00137   
00138 
00139     }
00140   catch(std::exception& e0)
00141     {
00142       reportFailure(comm());
00143       SUNDANCE_TRACE_MSG(e0, "while meshing a line");
00144     }
00145   TEUCHOS_TEST_FOR_EXCEPTION(checkForFailures(comm()), std::runtime_error, 
00146                      "off-proc error detected on proc=" << myRank()
00147                      << " while meshing line");
00148   return mesh;
00149   
00150 }

Site Contact