#ifndef INCLUDE_NASTNAVIERSTOKES2DMAC_H
#define INCLUDE_NASTNAVIERSTOKES2DMAC_H

//-----------------------------------------------------------------------------
//  NastNavierStokes2dMAC.h
//-----------------------------------------------------------------------------
//
//  Copyright (C) 1998 Technische Universitaet Muenchen, Germany
//  written by Bernhard Brueck
//
//  This file is part of Nast++
//
//-----------------------------------------------------------------------------
// CNastNavierStokes2dMAC implementiert den Loeser fuer die 
// Navier-Stokes-Gleichungen mit dem Marker-Cell-Verfahren.
// (nicht verwechseln mit MAC fuer die Geometrie)
// Dazu wird ein vorlaeufiges Geschwindigkeitsfeld berechnet und danach
// Druck angepasst.
//-----------------------------------------------------------------------------
//  Aenderungen:
//

#include "NastConfig.h"
#include "NastNavierStokes2d.h"
#include "NastNavierStokesParameter.h"

class CNastStaggeredGrid2d;
class CNastGrid2d;
class CNastGeometrie2d;
class CNastSolver2d;
class CNastDiffQuot2d;
class CNastSolverPoisson2d;

class CNastNavierStokes2dMAC : public CNastNavierStokes2d
{
public:
    //-------------------------------------------------------------------------
    //                         Konstruktor + Destruktor
    //-------------------------------------------------------------------------
    // para      Parameter fue die Sim (z.B. Reynoldszahl)
    // geometry  Geometriebeschreibung
    // solver    Loeser fue die Druckgleichungen
    // diffQuot  die Differenzenquotienten 
    // nSizeI    Anzahl der Zellen in X-Richtung
    // nSizeJ    Anzahl der Zellen in Y-Richtung
    //
    CNastNavierStokes2dMAC( CNastSolverPoisson2d  &solver,
        		    CNastDiffQuot2d &diffQuot,
        		    const CNastGeometry2d &geometry,
        		    const CNastNavierStokesParameter para,
        		    int nSizeI,
        		    int nSizeJ);
    virtual ~CNastNavierStokes2dMAC();			            

    //-------------------------------------------------------------------------
    //                             Memberfunktionen
    //-------------------------------------------------------------------------

     double maxTimeStep() const;
     void solve( double t );
     const CNastStaggeredGrid2d& grid() 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:
    // nicht impl.
    CNastNavierStokes2dMAC( const CNastNavierStokes2dMAC &other);	            
    const CNastNavierStokes2dMAC& operator=( const CNastNavierStokes2dMAC &other );

    //-------------------------------------------------------------------------
    //                            Hilfsfunktionen
    //-------------------------------------------------------------------------
    //

    void compFG ( double dt );	// F und G berechnen
    void compRhs( double dt );	// rechte Seite fuer die Druckgleichung berechnen
    void adapUV ( double dt );	// neue Geschwindigkeit berechnen
    
    //-------------------------------------------------------------------------
    //                            Membervariablen
    //-------------------------------------------------------------------------

    // Achtung des versetzte Gitter muss vor (!) m_gridF, m_gridG stehen
    CNastStaggeredGrid2d m_grid;	     // das eigentliche Gitter
    CNastGrid2d m_gridF;		     // vorlaeufige Geschw. X-Richtung
    CNastGrid2d m_gridG;		     // vorlaeufige Geschw. X-Richtung
    CNastGrid2d m_gridRhs;		     // rechte Seite fuer die Druckkorrektur

    CNastNavierStokesParameter m_para; // Paramter (z.B. Reynoldszahl)

    
    CNastSolverPoisson2d  &m_solver;   // der Loeser fuer die Druckgleichung
    const CNastGeometry2d &m_geom;     // die Geometriebeschreibung
    CNastDiffQuot2d       &m_diffQuot; // die Differenzenquotienten
};

#endif // INCLUDE_NASTNAVIERSTOKES2DMAC_H

