#ifndef INCLUDE_NASTBOUNDARYPOINT2D_H
#define INCLUDE_NASTBOUNDARYPOINT2D_H
//-----------------------------------------------------------------------------
// NastBoundaryPoint2d.h
//-----------------------------------------------------------------------------
//
//  Copyright (C) 1998 Technische Universitaet Muenchen, Germany
//                   written by Bernhard Brueck
//
//  This file is part of Nast++
//
//-----------------------------------------------------------------------------
//  CNastBoundaryPoint beschreibt eine Punkt auf dem Rand einer Geometrie.
//  Folgende Groessen werden beruecksichtigt:
//  - Position des Punktes
//  - Geschwindigkeit des Randes an diesem Punkt
//  - Normalenvektor auf den Rand
//  - Randbedingung an dieser Stelle
//-----------------------------------------------------------------------------
//  Aenderungen:
//     

#include "NastConfig.h"
#include "NastPoint2d.h"

class CNastBoundaryPoint2d : public CNastPoint2d
{
public:
    //-------------------------------------------------------------------------
    //                         Randbedingungen
    //-------------------------------------------------------------------------
    //  Achtung die Randbedingungen sind innerhalb von CNastBoundaryPoint2d 
    //  definiert ! Um sie zu verwenden muss der Namensraum angegeben werden.
    //  z.B.
    //  if( pPnt->boundaryCondition() == CNastBoundaryPoint2d::INFLOW )
    //
    enum Condition
    {
        INFLOW,	        // Einstroembedingung
        OUTFLOW,	// Ausstroembedingung
        SLIP,		// Rutschbedingung
        NOSLIP	        // Haftbedingung
    };

    //-------------------------------------------------------------------------
    //                         Konstruktor + Destruktor
    //-------------------------------------------------------------------------
    //  pntPos   Position des Punktes 
    //  vecNorm  Normalenvektor auf den Rand
    //  vecVel   Geschwindigkeitsvektor an der Stelle
    //  cond     die Randbedingung
    //

    CNastBoundaryPoint2d( const CNastPoint2d  &pntPos, 
        		  const CNastVector2d &vecNorm,
        		  const CNastVector2d &vecVel,
        		  const Condition cond );

    virtual ~CNastBoundaryPoint2d();		
                    
    CNastBoundaryPoint2d( const CNastBoundaryPoint2d &other);	            
    const CNastBoundaryPoint2d& operator=( const CNastBoundaryPoint2d &other );

    //-------------------------------------------------------------------------
    //                            Memberfunktionen
    //-------------------------------------------------------------------------
    //  normal()             Normalenvektor auf dem Rand
    //  boundaryCondition()  Randbedingung
    //  velocity()           Geschwindigkeit des Rands bzw. der Stroemung
    //                       bei der Einstroembedingung
    //
    const CNastVector2d& velocity() const;
    const CNastVector2d& normal() const;
    CNastBoundaryPoint2d::Condition boundaryCondition() const;

    //-------------------------------------------------------------------------
    //                                  Debug
    //-------------------------------------------------------------------------
    //  debugInfo    gibt Information ueber den Zustand des Objekts aus
    //  assertValid  testet das Objekt auf Integritaet
    //
    virtual void debugDump( CNastDumpContext &dumpContext ) const;
    virtual void assertValid() const;

private:
    //-------------------------------------------------------------------------
    //                            Membervariablen
    //-------------------------------------------------------------------------

    CNastVector2d m_vecNorm;     // Normalenvektor auf dem Rand
    CNastVector2d m_vecVel;   // Geschwindigkeit des Randes
    Condition m_cond; // Randbedingung
};

//-------------------------------------------------------------------------
//                            inline
//-------------------------------------------------------------------------
inline const CNastVector2d& 
CNastBoundaryPoint2d::velocity() const
{
    return m_vecVel;
}

inline const CNastVector2d& 
CNastBoundaryPoint2d::normal() const
{
    return m_vecNorm;
}

inline CNastBoundaryPoint2d::Condition 
CNastBoundaryPoint2d::boundaryCondition() const
{
    return m_cond;
}


#endif // INCLUDE_NASTBOUNDARYPOINT2D_H

