Program Listing for File hydroboundary.hpp

Return to documentation for file (hydro/boundary/hydroboundary.hpp)

// ***********************************************************************************
// Idefix MHD astrophysical code
// Copyright(C) 2020-2022 Geoffroy R. J. Lesur <geoffroy.lesur@univ-grenoble-alpes.fr>
// and other code contributors
// Licensed under CeCILL 2.1 License, see COPYING for more information
// ***********************************************************************************

#ifndef HYDRO_BOUNDARY_HYDROBOUNDARY_HPP_
#define HYDRO_BOUNDARY_HYDROBOUNDARY_HPP_
#include <string>
#include <vector>
#include "idefix.hpp"
#include "hydro_defs.hpp"
#include "grid.hpp"

#ifdef WITH_MPI
#include "mpi.hpp"
#endif

// forward class declaration
class DataBlock;
class Hydro;

class HydroBoundary {
 public:
  void Init(Input &, Grid &, Hydro* );
  void SetBoundaries(real);
  void EnforceBoundaryDir(real, int);
  void ReconstructVcField(IdefixArray4D<real> &);
  void ReconstructNormalField(int dir);

  void EnforceFluxBoundaries(int dir);

  void EnrollUserDefBoundary(UserDefBoundaryFunc);
  void EnrollInternalBoundary(InternalBoundaryFunc);
  void EnrollFluxBoundary(UserDefBoundaryFunc);

  void EnforcePeriodic(int, BoundarySide );
  void EnforceReflective(int, BoundarySide );
  void EnforceOutflow(int, BoundarySide );
  void EnforceShearingBox(real, int, BoundarySide );

  #ifdef WITH_MPI
  Mpi mpi;
  #endif

    // User defined Boundary conditions
  UserDefBoundaryFunc userDefBoundaryFunc{NULL};
  bool haveUserDefBoundary{false};

  // Internal boundary function
  bool haveInternalBoundary{false};
  InternalBoundaryFunc internalBoundaryFunc{NULL};

  // Flux boundary function
  bool haveFluxBoundary{false};
  UserDefBoundaryFunc fluxBoundaryFunc{NULL};

  // specific for loops on ghost cells
  template <typename Function>
  void BoundaryFor(const std::string &,
                            const int &,
                            const BoundarySide &,
                            Function );

  template <typename Function>
  void BoundaryForAll(const std::string &,
                            const int &,
                            const BoundarySide &,
                            Function );

  template <typename Function>
  void BoundaryForX1s(const std::string &,
                            const int &,
                            const BoundarySide &,
                            Function );

  template <typename Function>
  void BoundaryForX2s(const std::string &,
                            const int &,
                            const BoundarySide &,
                            Function );

  template <typename Function>
  void BoundaryForX3s(const std::string &,
                            const int &,
                            const BoundarySide &,
                            Function );
  IdefixArray4D<real> sBArray;

 private:
  Hydro *hydro;    // pointer to parent hydro object
  DataBlock *data;  // pointer to parent datablock
};

#endif // HYDRO_BOUNDARY_HYDROBOUNDARY_HPP_