Advertisement
bolverk

off centre supernova 0.5 radius

Apr 24th, 2015
441
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 9.46 KB | None | 0 0
  1. #include <iostream>
  2. #include "source/tessellation/VoronoiMesh.hpp"
  3. #include "source/newtonian/two_dimensional/hdsim2d.hpp"
  4. #include "source/newtonian/two_dimensional/interpolations/pcm2d.hpp"
  5. #include "source/newtonian/two_dimensional/spatial_distributions/uniform2d.hpp"
  6. #include "source/newtonian/common/ideal_gas.hpp"
  7. #include "source/newtonian/two_dimensional/geometric_outer_boundaries/SquareBox.hpp"
  8. #include "source/newtonian/two_dimensional/hydro_boundary_conditions/RigidWallHydro.hpp"
  9. #include "source/newtonian/common/hllc.hpp"
  10. #include "source/newtonian/two_dimensional/source_terms/zero_force.hpp"
  11. #include "source/newtonian/two_dimensional/point_motions/eulerian.hpp"
  12. #include "source/newtonian/two_dimensional/point_motions/lagrangian.hpp"
  13. #include "source/newtonian/two_dimensional/point_motions/round_cells.hpp"
  14. #include "source/newtonian/two_dimensional/diagnostics.hpp"
  15. #include "source/newtonian/two_dimensional/source_terms/cylindrical_complementary.hpp"
  16. #include "source/misc/simple_io.hpp"
  17. #include "source/newtonian/test_2d/main_loop_2d.hpp"
  18. #include "source/newtonian/two_dimensional/hdf5_diagnostics.hpp"
  19. #include "source/misc/mesh_generator.hpp"
  20. #include "source/tessellation/shape_2d.hpp"
  21. #include "source/newtonian/test_2d/piecewise.hpp"
  22. #include "source/newtonian/two_dimensional/simple_flux_calculator.hpp"
  23. #include "source/newtonian/two_dimensional/simple_cell_updater.hpp"
  24. #include "source/newtonian/two_dimensional/simple_extensive_updater.hpp"
  25. #include "source/newtonian/test_2d/consecutive_snapshots.hpp"
  26. #include "source/newtonian/test_2d/multiple_diagnostics.hpp"
  27.  
  28. using namespace std;
  29. using namespace simulation2d;
  30.  
  31. namespace {
  32.  
  33.   class PhysicalConstants
  34.   {
  35.   public:
  36.  
  37.     // Metric prefixes
  38.     const double kilo;
  39.     const double centi;
  40.  
  41.     // Length
  42.     const double solar_radius;
  43.     const double meter;
  44.  
  45.     // Mass
  46.     const double solar_mass;
  47.     const double gram;
  48.  
  49.     // Time
  50.     const double second;
  51.  
  52.     // Energy
  53.     const double erg;
  54.  
  55.     PhysicalConstants(void):
  56.       kilo(1e3),
  57.       centi(1e-2),
  58.       solar_radius(1),
  59.       meter(1.438e-9),
  60.       solar_mass(1),
  61.       gram(5.029e-34),
  62.       second(1),
  63.       erg(gram*pow(centi*meter/second,2)) {}
  64.   };
  65.  
  66.   vector<ComputationalCell> calc_init_cond(const Tessellation& tess,
  67.                        const PhysicalConstants& c)
  68.   {
  69.     vector<ComputationalCell> res(static_cast<size_t>(tess.GetPointNo()));
  70.     const double star_mass = 10*c.solar_mass;
  71.     const double star_radius = 50*c.solar_radius;
  72.     const double average_density = star_mass/pow(star_radius,3);
  73.     const double hot_spot_radius = 1*c.solar_radius;
  74.     const double hot_spot_volume = (4.*M_PI/3.)*pow(hot_spot_radius,3);
  75.     const double hot_spot_energy = 1e51*c.erg;
  76.     const double hot_spot_pressure = hot_spot_energy/hot_spot_volume;
  77.     const Circle hot_spot(Vector2D(0,0.5*star_radius), hot_spot_radius);
  78.     for(size_t i=0;i<res.size();++i){
  79.       res[i].density = 1e-9*average_density;
  80.       res[i].pressure = 1e-9*hot_spot_pressure;
  81.       res[i].velocity = Vector2D(0,0);
  82.       const Vector2D r = tess.GetMeshPoint(static_cast<int>(i));
  83.       if(abs(r)<star_radius)
  84.     res[i].density = average_density*pow(1-abs(r)/star_radius,1.5);
  85.       if(hot_spot(r))
  86.     res[i].pressure = hot_spot_pressure;
  87.     }
  88.     return res;
  89.   }
  90.  
  91.   double calc_tracer_flux(const Edge& edge,
  92.               const Tessellation& tess,
  93.               const vector<ComputationalCell>& cells,
  94.               const string& name,
  95.               const Conserved& hf)
  96.   {
  97.     if(hf.Mass>0 &&
  98.        edge.neighbors.first>0 &&
  99.        edge.neighbors.first<tess.GetPointNo())
  100.       return hf.Mass*
  101.     cells[static_cast<size_t>(edge.neighbors.first)].tracers.find(name)->second;
  102.     if(hf.Mass<0 &&
  103.        edge.neighbors.second>0 &&
  104.        edge.neighbors.second<tess.GetPointNo())
  105.       return hf.Mass*
  106.     cells[static_cast<size_t>(edge.neighbors.second)].tracers.find(name)->second;
  107.     return 0;
  108.   }
  109.  
  110.   class CustomFluxCalculator: public FluxCalculator
  111.   {
  112.   public:
  113.  
  114.     CustomFluxCalculator(const RiemannSolver& rs):
  115.       rs_(rs) {}
  116.  
  117.     vector<Extensive> operator()
  118.     (const Tessellation& tess,
  119.      const vector<Vector2D>& point_velocities,
  120.      const vector<ComputationalCell>& cells,
  121.      const EquationOfState& eos,
  122.      const double /*time*/,
  123.      const double /*dt*/) const
  124.     {
  125.       vector<Extensive> res(tess.getAllEdges().size());
  126.       for(size_t i=0;i<tess.getAllEdges().size();++i){
  127.     const Conserved hydro_flux =
  128.       calcHydroFlux(tess, point_velocities,
  129.             cells, eos, i);
  130.     res[i].mass = hydro_flux.Mass;
  131.     res[i].momentum = hydro_flux.Momentum;
  132.     res[i].energy = hydro_flux.Energy;
  133.     for(std::map<std::string,double>::const_iterator it =
  134.           cells.front().tracers.begin();
  135.         it!=cells.front().tracers.end();++it)
  136.       res[i].tracers[it->first] =
  137.         calc_tracer_flux(tess.getAllEdges()[i],
  138.                  tess,cells,it->first,hydro_flux);
  139.          
  140.       }
  141.       return res;
  142.     }
  143.  
  144.   private:
  145.     const RiemannSolver& rs_;
  146.  
  147.     const Conserved calcHydroFlux
  148.     (const Tessellation& tess,
  149.      const vector<Vector2D>& point_velocities,
  150.      const vector<ComputationalCell>& cells,
  151.      const EquationOfState& eos,
  152.      const size_t i) const
  153.     {
  154.       const Edge& edge = tess.GetEdge(static_cast<int>(i));
  155.       const std::pair<bool,bool> flags
  156.     (edge.neighbors.first>=0 && edge.neighbors.first<tess.GetPointNo(),
  157.      edge.neighbors.second>=0 && edge.neighbors.second<tess.GetPointNo());
  158.       assert(flags.first || flags.second);
  159.       if(!flags.first){
  160.     const size_t right_index =
  161.       static_cast<size_t>(edge.neighbors.second);
  162.     const ComputationalCell& right_cell = cells[right_index];
  163.     const Vector2D p = Parallel(edge);
  164.     const Primitive right = convert_to_primitive(right_cell,eos);
  165.     const Primitive left = right;
  166.     const Vector2D n = remove_parallel_component
  167.       (tess.GetMeshPoint(edge.neighbors.second) -
  168.        edge.vertices.first, p);
  169.     return rotate_solve_rotate_back
  170.       (rs_, left, right, 0, n, p);
  171.       }
  172.       if(!flags.second){
  173.     const size_t left_index =
  174.       static_cast<size_t>(edge.neighbors.first);
  175.     const ComputationalCell& left_cell = cells[left_index];
  176.     const Primitive left = convert_to_primitive(left_cell, eos);
  177.     const Vector2D p = Parallel(edge);
  178.     const Primitive right = left;
  179.     const Vector2D n = remove_parallel_component
  180.       (edge.vertices.second -
  181.        tess.GetMeshPoint(edge.neighbors.first), p);
  182.     return rotate_solve_rotate_back
  183.       (rs_, left, right, 0, n, p);
  184.       }
  185.       const size_t left_index =
  186.     static_cast<size_t>(edge.neighbors.first);
  187.       const size_t right_index =
  188.     static_cast<size_t>(edge.neighbors.second);
  189.       const ComputationalCell& left_cell = cells[left_index];
  190.       const ComputationalCell& right_cell = cells[right_index];
  191.       const Vector2D p = Parallel(edge);
  192.       const Vector2D n =
  193.     tess.GetMeshPoint(edge.neighbors.second) -
  194.     tess.GetMeshPoint(edge.neighbors.first);
  195.       const double velocity = Projection
  196.     (tess.CalcFaceVelocity
  197.      (point_velocities[left_index],
  198.       point_velocities[right_index],
  199.       tess.GetCellCM(edge.neighbors.first),
  200.       tess.GetCellCM(edge.neighbors.second),
  201.       calc_centroid(edge)),n);
  202.       const Primitive left =
  203.     convert_to_primitive(left_cell, eos);
  204.       const Primitive right =
  205.     convert_to_primitive(right_cell, eos);
  206.       return rotate_solve_rotate_back
  207.     (rs_,left,right,velocity,n,p);
  208.     }
  209.   };
  210.  
  211.   class SimData
  212.   {
  213.   public:
  214.     SimData(const PhysicalConstants& c):
  215.       pg_(Vector2D(0,0), Vector2D(0,1)),
  216.       outer_(Vector2D(0,-100*c.solar_radius),
  217.          Vector2D(200*c.solar_radius,
  218.               300*c.solar_radius)),
  219.       mesh_(cartesian_mesh(2*200,2*300,
  220.                outer_.getBoundary().first,
  221.                outer_.getBoundary().second)),
  222.       tess_(mesh_,outer_),
  223.       interpm_(),
  224.       eos_(5./3.),
  225.       rs_(),
  226.       raw_point_motion_(),
  227.       point_motion_(raw_point_motion_,eos_),
  228.       alt_point_motion_(),
  229.       force_(pg_.getAxis()),
  230.       tsf_(0.3),
  231.       fc_(rs_),
  232.       eu_(),
  233.       cu_(),
  234.       sim_(tess_,
  235.        outer_,
  236.        pg_,
  237.        calc_init_cond(tess_,c),
  238.        eos_,
  239.        alt_point_motion_,
  240.        force_,
  241.        tsf_,
  242.        fc_,
  243.        eu_,
  244.        cu_) {}
  245.  
  246.     hdsim& getSim(void)
  247.     {
  248.       return sim_;
  249.     }
  250.  
  251.   private:
  252.     const CylindricalSymmetry pg_;
  253.     const SquareBox outer_;
  254.     const vector<Vector2D> mesh_;
  255.     VoronoiMesh tess_;
  256.     PCM2D interpm_;
  257.     const IdealGas eos_;
  258.     const Hllc rs_;
  259.     //    const RigidWallHydro hbc_;
  260.     Lagrangian raw_point_motion_;
  261.     RoundCells point_motion_;
  262.     Eulerian alt_point_motion_;
  263.     CylindricalComplementary force_;
  264.     const SimpleCFL tsf_;
  265.     //    const SimpleFluxCalculator fc_;
  266.     const CustomFluxCalculator fc_;
  267.     const SimpleExtensiveUpdater eu_;
  268.     const SimpleCellUpdater cu_;
  269.     hdsim sim_;
  270.   };
  271.  
  272.   void my_main_loop(hdsim& sim,
  273.             const PhysicalConstants& c)
  274.   {
  275.     const double tf = 20000*c.second;
  276.     SafeTimeTermination term_cond(tf,1e6);
  277.     WriteTime diag1("time.txt");
  278.     ConsecutiveSnapshots diag2(new ConstantTimeInterval(tf/1000),
  279.                    new Rubric("snapshot_",".h5"));
  280.     MultipleDiagnostics diag;
  281.     diag.diag_list.push_back(&diag1);
  282.     diag.diag_list.push_back(&diag2);
  283.     main_loop(sim,
  284.           term_cond,
  285.           &hdsim::TimeAdvance,
  286.           &diag);
  287.   }
  288. }
  289.  
  290. int main(void)
  291. {
  292.   const PhysicalConstants c;
  293.   SimData sim_data(c);
  294.   hdsim& sim = sim_data.getSim();
  295.  
  296.   write_snapshot_to_hdf5(sim, "initial.h5");
  297.  
  298.   my_main_loop(sim,c);
  299.  
  300.   write_snapshot_to_hdf5(sim, "final.h5");
  301.  
  302.   return 0;
  303. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement