#ifndef INCLUDE_NASTNAVIERSTOKESPARAMETER_H
#define INCLUDE_NASTNAVIERSTOKESPARAMETER_H

//-----------------------------------------------------------------------------
//  NastNavierStokesParameter.h
//-----------------------------------------------------------------------------
//
//  Copyright (C) 1998 Technische Universitaet Muenchen, Germany
//  written by Bernhard Brueck
//
//  This file is part of Nast++
//
//-----------------------------------------------------------------------------
// CNastNavierStokesParameter enthaelt alle Daten ueber das Fluid, die 
// fuer eine Simulation notwenidg sind. Es werden dabei nur diejenigen
// Paramter betrachtet, die fuer alle von CNastNavierStokes2d/CNastNavierStokes3d
// abgeleiten Klassen wichtig sind.
// Die Groessen sind alle dimensionslos. Die Klasse ist auch fuer die 
// Umrechnung von dimensionslosen Groessen in dimensionsbehafte Groessen
// verantwortlich
//-----------------------------------------------------------------------------
//  Aenderungen:
//

#include "NastConfig.h"
#include "NastObject.h"
#include "NastVector2d.h"

class CNastNavierStokesParameter : public CNastObject
{
public:
    //-------------------------------------------------------------------------
    //                         Konstruktor + Destruktor
    //-------------------------------------------------------------------------
    
    //  gx      Volumenkraefte X-Richtung
    //  gy      Volumenkraefte Y-Richtung
    //  mu      dynamische Viskositaet
    //  L       Vergroesserungsfaktor der Geometrie
    //  refU    Referenzgeschwindigkeit
    //  refP    Referenzdruck
    //  refRho  Referenzdichte

    CNastNavierStokesParameter(double gx,
        		       double gy,
        		       double Reynolds );

    CNastNavierStokesParameter(double gx,
        		       double gy,
        		       double mu,
        		       double L,
        		       double refU,
        		       double refP,
        		       double refRho );

    virtual ~CNastNavierStokesParameter();			            

    //-------------------------------------------------------------------------
    //  Zugriffsfunktionen (dimensionslose Groessen)
    //-------------------------------------------------------------------------
    //  prandtl()  Prandtlzahl
    //  reynolds() Reynoldszahl
    //  gx()       Volumenkraefte X-Richtung
    //  gy()       Volumenkraefte Y-Richtung

    double prandtl() const;
    double reynolds() const;
    double gx() const;
    double gy() const; 

    //-------------------------------------------------------------------------    
    //                             Umrechung  
    //-------------------------------------------------------------------------
    // Umrechnungen zwischen den dimensionslosen und den dimensionsbehafteten
    // Groessen.
    //
    // convertSimToRealTime    (t)   dimensionslos t   -> dimensionbehaftet t
    // convertSimToRealGeometry(x)   dimensionslos x   -> dimensionbehaftet x
    // convertSimToRealPressure(p)   dimensionslos P   -> dimensionbehaftet P
    // convertSimToRealVelocity(v)   dimensionslos u,v -> dimensionbehaftet u,v
    // convertSimToRealVelocity(vec) dimensionslos u,v -> dimensionbehaftet u,v
    // convertSimToRealVolForce(g)   dimensionslos g   -> dimensionbehaftet g
    //
    // convertRealToSimTime    (t)   dimensionbehaftet t   -> dimensionslos t
    // convertRealToSimGeometry(x)   dimensionbehaftet x   -> dimensionslos x
    // convertRealToSimPressure(p)   dimensionbehaftet P   -> dimensionslos P
    // convertRealToSimVelocity(v)   dimensionbehaftet u,v -> dimensionslos u,v
    // convertRealToSimVelocity(vec) dimensionbehaftet u,v -> dimensionslos u,v
    // convertRealToSumVolForce(g)   dimensionbehaftet g   -> dimensionslos g
    //

    double        convertSimToRealTime    ( double t ) const;
    double        convertSimToRealGeometry( double x ) const;
    double        convertSimToRealPressure( double p ) const;
    double        convertSimToRealVelocity( double v ) const;
    CNastVector2d convertSimToRealVelocity( CNastVector2d &vec) const;
    double        convertSimToRealVolForce( double g ) const;
    
    double        convertRealToSimTime    ( double t ) const;
    double        convertRealToSimGeometry( double x ) const;
    double        convertRealToSimPressure( double p ) const;
    double        convertRealToSimVelocity( double v ) const;
    CNastVector2d convertRealToSimVelocity( CNastVector2d &vec) const;
    double        convertRealToSimVolForce( double g ) 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
    //-------------------------------------------------------------------------
    double m_L;			// Vergroesserungsfaktor der Geometrie
    double m_refU;		// Referenzgroesse Geschwindigkeit
    double m_refP;		// Referenzgroesse Druck
    double m_refRho;		// Referenzgroesse Dichte

    double m_reynolds;		// Reynoldszahl
    double m_gx;		// Volumenkraefte X-Richtung
    double m_gy;		// Volumenkraefte Y-Richtung

    double m_prandtl;		// Prandtlzahl
};


//-------------------------------------------------------------------------
//  inline Zugriffsfunktionen
//-------------------------------------------------------------------------
//  re()       Reynoldszahl
//  gx()       Volumenkraefte X-Richtung
//  gy()       Volumenkraefte Y-Richtung

inline double CNastNavierStokesParameter::reynolds() const
{
    NAST_ASSERT_VALID(this);
    
    return m_reynolds;
}

inline double CNastNavierStokesParameter::gx() const
{
    NAST_ASSERT_VALID(this);
    return m_gx;
}

inline double CNastNavierStokesParameter::gy() const
{
    NAST_ASSERT_VALID(this);
    return m_gy;
}

    
#endif // INCLUDE_NASTNAVIERSTOKESPARAMETER_H

