SundanceRivaraEdge.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 "SundanceRivaraEdge.hpp"
00044 #include "SundanceRivaraElement.hpp"
00045 #include "SundanceRivaraNode.hpp"
00046 #include "SundanceRivaraMesh.hpp"
00047 
00048 using namespace Sundance::Rivara;
00049 using namespace Teuchos;
00050 
00051 
00052 
00053 Edge::Edge(const RCP<Node>& a,
00054            const RCP<Node>& b)
00055   : label_(-1),nodes_(tuple(a,b)), elements_(), midpoint_(),
00056     ownerProc_()
00057 {
00058   if (a->ownerProc() > b->ownerProc())
00059     {
00060       ownerProc_ = a->ownerProc();
00061     }
00062   else
00063     {
00064       ownerProc_ = b->ownerProc();
00065     }
00066 }
00067 
00068 void Edge::addConnectingElement(Element* tri)
00069 {
00070   elements_.append(tri);
00071 }
00072 
00073 double Edge::length() const 
00074 {
00075   const Point& x1 = nodes_[0]->pt();
00076   const Point& x2 = nodes_[1]->pt();
00077 
00078   return sqrt((x1-x2)*(x1-x2));
00079 }
00080 
00081 void Edge::getUnrefinedCofacets(Array<Element*>& c) const 
00082 {
00083   for (int i=0; i<elements_.length(); i++)
00084     {
00085       if (!elements_[i]->hasChildren()) c.append(elements_[i]);
00086     }
00087 }
00088 
00089 RCP<Node> Edge::bisect(RivaraMesh* mesh)
00090 {
00091   /* if we've already been bisected, return the existing midpoint node */
00092   if (!(midpoint_.get() == 0))
00093     {
00094       return midpoint_;
00095     }
00096 
00097   const Point& x1 = nodes_[0]->pt();
00098   const Point& x2 = nodes_[1]->pt();
00099 
00100   int nextGID = mesh->nextGID();
00101   midpoint_ = rcp(new Node(nextGID, 0.5*(x1 + x2), ownerProc_));
00102   mesh->addNode(midpoint_);
00103 
00104   int s;
00105   RCP<Edge> sub1 = mesh->tryEdge(nodes_[0], midpoint_, s);
00106   RCP<Edge> sub2 = mesh->tryEdge(midpoint_, nodes_[1], s);
00107   sub1->setParent(this);
00108   sub2->setParent(this);
00109 
00110   sub1->setLabel(label_);
00111   sub2->setLabel(label_);
00112 
00113   setChildren(sub1.get(), sub2.get());
00114 
00115   return midpoint_;
00116 }
00117 

Site Contact