[Dune] [Dune-Commit] dune-grid r6138 - in trunk/dune/grid: . common

Martin Nolte nolte at mathematik.uni-freiburg.de
Fri Jan 15 13:54:07 CET 2010


Hi Christian,

I have some question on this:
- does the default implementation of Geometry< 0, ... > really use the 
deprecated operator[] on the Geometry?
- do the grid implementations really use the default implementations? I 
thought we decided this was not necessary.

Martin

christi at dune-project.org wrote:
> Author: christi
> Date: 2010-01-15 12:50:34 +0100 (Fri, 15 Jan 2010)
> New Revision: 6138
> 
> Modified:
>    trunk/dune/grid/common/geometry.hh
>    trunk/dune/grid/common/intersection.hh
>    trunk/dune/grid/sgrid.hh
>    trunk/dune/grid/yaspgrid.hh
> Log:
> * apply first implementaation of center and centerUnitOuterNormal
> * credits go to Atgeirr
> * sgrid and yaspgrid implement their own centerUnitOuterNormal
>    all other grids should we working through the Default-Implementation
> 
> 
> Modified: trunk/dune/grid/common/geometry.hh
> ===================================================================
> --- trunk/dune/grid/common/geometry.hh	2010-01-14 18:17:20 UTC (rev 6137)
> +++ trunk/dune/grid/common/geometry.hh	2010-01-15 11:50:34 UTC (rev 6138)
> @@ -216,6 +216,20 @@
>      return realGeometry.volume();
>    }
>  
> +  /** \brief return center of geometry 
> +   *  Note that this method is still subject to a change of name and semantics.
> +   *  At the moment, the center is not required to be the centroid of the
> +   *  geometry, or even the centroid of its corners. This makes the current
> +   *  default implementation acceptable, which maps the centroid of the
> +   *  reference element to the geometry.
> +   *  We may change the name (and semantic) of the method to centroid() if we
> +   *  find reasonably efficient ways to implement it properly.
> +   */
> +  GlobalCoordinate center () const
> +  {
> +    return realGeometry.center();
> +  }
> +
>    /** \brief Return the transposed of the Jacobian
>     *
>     *  The Jacobian is defined in the documentation of
> @@ -315,6 +329,20 @@
>      return refElement.volume() * asImp().integrationElement(localBaryCenter);
>    }
>    
> +  //! return center of the geometry 
> +  FieldVector<ctype, cdim> center () const 
> +  {
> +    GeometryType type = asImp().type();
> +
> +    // get corresponding reference element
> +    const GenericReferenceElement< ctype , mydim > & refElement =
> +      GenericReferenceElements< ctype, mydim >::general(type);
> +
> +    // center is (for now) the centroid of the reference element mapped to
> +    // this geometry.
> +    return asImp().global(refElement.position(0,0));
> +  }
> +  
>  private:
>    //!  Barton-Nackman trick 
>    GeometryImp<mydim,cdim,GridImp>& asImp () {return static_cast<GeometryImp<mydim,cdim,GridImp>&>(*this);}
> @@ -349,7 +377,16 @@
>    }
>   
>    //! return volume of the geometry 
> -  ctype volume () const { return 1.0; }
> +  ctype volume () const
> +  {
> +    return 1.0;
> +  }
> +
> +  //! return center of the geometry 
> +  FieldVector<ctype, cdim> center () const 
> +  {
> +      return asImp()[0];
> +  }
>    
>  private:
>    //!  Barton-Nackman trick 
> 
> Modified: trunk/dune/grid/common/intersection.hh
> ===================================================================
> --- trunk/dune/grid/common/intersection.hh	2010-01-14 18:17:20 UTC (rev 6137)
> +++ trunk/dune/grid/common/intersection.hh	2010-01-15 11:50:34 UTC (rev 6138)
> @@ -436,6 +436,17 @@
>        return this->real.unitOuterNormal(local);
>      }
>  
> +  /*! @brief Return unit outer normal (length == 1)
> +
> +  The returned vector is the normal at the center() of the
> +  intersection's geometry.
> +  It is scaled to have unit length.
> +  */
> +  GlobalCoordinate centerUnitOuterNormal () const
> +    {
> +      return this->real.centerUnitOuterNormal();
> +    }
> +
>    //===========================================================
>    /** @name Implementor interface
>     */
> @@ -483,15 +494,17 @@
>    enum { dimworld=GridImp::dimensionworld };
>    typedef typename GridImp::ctype ct;
>  public:
> +    
>    //! return unit outer normal, this should be dependent on
>    //! local coordinates for higher order boundary
>    //! the normal is scaled with the integration element of the intersection.
>    FieldVector<ct, dimworld> integrationOuterNormal (const FieldVector<ct, dim-1>& local) const
>      {
> -        FieldVector<ct, dimworld> n = unitOuterNormal(local);
> +        FieldVector<ct, dimworld> n = asImp().unitOuterNormal(local);
>          n *= asImp().intersectionGlobal().integrationElement(local);
>          return n;
>      }
> +    
>    //! return unit outer normal
>    FieldVector<ct, dimworld> unitOuterNormal (const FieldVector<ct, dim-1>& local) const
>      {
> @@ -499,6 +512,19 @@
>        n /= n.two_norm();
>        return n;
>      }
> +    
> +  //! return unit outer normal at center of intersection geometry
> +  FieldVector<ct, dimworld> centerUnitOuterNormal () const
> +    {
> +        // For now, we do this...
> +        GeometryType type = asImp().geometry().type();
> +        const GenericReferenceElement<ct, dim-1> & refElement =
> +            GenericReferenceElements<ct, dim-1>::general(type);
> +        return asImp().unitOuterNormal(refElement.position(0,0));
> +        // But later, if we change the meaning of center(),
> +        // we may have to change to this...
> +        // return asImp().unitOuterNormal(asImp().local(asImp().center()));
> +    }
>  
>  private:
>    //!  Barton-Nackman trick
> 
> Modified: trunk/dune/grid/sgrid.hh
> ===================================================================
> --- trunk/dune/grid/sgrid.hh	2010-01-14 18:17:20 UTC (rev 6137)
> +++ trunk/dune/grid/sgrid.hh	2010-01-15 11:50:34 UTC (rev 6138)
> @@ -734,6 +734,11 @@
>    //! return unit outer normal
>    FieldVector<ctype, GridImp::dimensionworld> unitOuterNormal (const FieldVector<ctype, GridImp::dimension-1>& local) const
>      {
> +      return centerUnitOuterNormal();
> +    }
> +  //! return unit outer normal at center of intersection geometry
> +  FieldVector<ctype, GridImp::dimensionworld> centerUnitOuterNormal () const
> +    {
>        // while we are at it, compute normal direction
>        FieldVector<ctype, dimworld> normal(0.0);
>        if (count%2)
> 
> Modified: trunk/dune/grid/yaspgrid.hh
> ===================================================================
> --- trunk/dune/grid/yaspgrid.hh	2010-01-14 18:17:20 UTC (rev 6137)
> +++ trunk/dune/grid/yaspgrid.hh	2010-01-15 11:50:34 UTC (rev 6138)
> @@ -1691,6 +1691,12 @@
>          return _normal;
>      }
>  
> +    //! return unit outer normal at center of intersection geometry
> +    FieldVector<ctype, dimworld> centerUnitOuterNormal () const
> +    {
> +        return _normal;
> +    }
> +
>      //! return unit outer normal, this should be dependent on
>      //! local coordinates for higher order boundary
>      //! the normal is scaled with the integration element of the intersection.
> 
> 
> _______________________________________________
> Dune-Commit mailing list
> Dune-Commit at dune-project.org
> http://lists.dune-project.org/mailman/listinfo/dune-commit

-- 
Martin Nolte <nolte at mathematik.uni-freiburg.de>

Universität Freiburg                                   phone: +49-761-203-5642
Abteilung für angewandte Mathematik                    fax:   +49-761-203-5632
Hermann-Herder-Straße 10
79104 Freiburg, Germany




More information about the Dune mailing list