Advertisement
bolverk

ring supernova simulation for sean raymond

Feb 15th, 2022
743
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 9.64 KB | None | 0 0
  1. #ifdef RICH_MPI
  2. #include "source/mpi/MeshPointsMPI.hpp"
  3. #endif
  4. #include <iostream>
  5. #include <fstream>
  6. #include <cmath>
  7. #include <vector>
  8. #include <string>
  9. #include "source/tessellation/geometry.hpp"
  10. #include "source/newtonian/two_dimensional/hdsim2d.hpp"
  11. #include "source/tessellation/tessellation.hpp"
  12. #include "source/newtonian/common/hllc.hpp"
  13. #include "source/newtonian/common/ideal_gas.hpp"
  14. #include "source/tessellation/VoronoiMesh.hpp"
  15. #include "source/newtonian/two_dimensional/spatial_distributions/uniform2d.hpp"
  16. #include "source/newtonian/two_dimensional/point_motions/eulerian.hpp"
  17. #include "source/newtonian/two_dimensional/point_motions/lagrangian.hpp"
  18. #include "source/newtonian/two_dimensional/point_motions/round_cells.hpp"
  19. #include "source/newtonian/two_dimensional/source_terms/zero_force.hpp"
  20. #include "source/newtonian/two_dimensional/geometric_outer_boundaries/SquareBox.hpp"
  21. #include "source/newtonian/test_2d/random_pert.hpp"
  22. #include "source/newtonian/two_dimensional/diagnostics.hpp"
  23. #include "source/misc/simple_io.hpp"
  24. #include "source/misc/mesh_generator.hpp"
  25. #include "source/newtonian/test_2d/main_loop_2d.hpp"
  26. #include "source/newtonian/two_dimensional/hdf5_diagnostics.hpp"
  27. #include "source/tessellation/shape_2d.hpp"
  28. #include "source/newtonian/test_2d/piecewise.hpp"
  29. #include "source/newtonian/two_dimensional/simple_flux_calculator.hpp"
  30. #include "source/newtonian/two_dimensional/simple_cell_updater.hpp"
  31. #include "source/newtonian/two_dimensional/simple_extensive_updater.hpp"
  32. #include "source/newtonian/two_dimensional/stationary_box.hpp"
  33. #include "source/tessellation/right_rectangle.hpp"
  34. #include "source/newtonian/test_2d/clip_grid.hpp"
  35. #include "source/newtonian/test_2d/multiple_diagnostics.hpp"
  36. #include "source/misc/vector_initialiser.hpp"
  37. #include "source/newtonian/test_2d/consecutive_snapshots.hpp"
  38. #include "source/newtonian/two_dimensional/source_terms/cylindrical_complementary.hpp"
  39. #include "source/newtonian/two_dimensional/source_terms/SeveralSources.hpp"
  40. #include <boost/random/mersenne_twister.hpp>
  41. #include <boost/random/uniform_real_distribution.hpp>
  42.  
  43. using namespace std;
  44. using namespace simulation2d;
  45.  
  46. namespace {
  47.  
  48.  
  49. #ifdef RICH_MPI
  50.  
  51.   vector<Vector2D> process_positions(const SquareBox& boundary)
  52.   {
  53.     const Vector2D lower_left = boundary.getBoundary().first;
  54.     const Vector2D upper_right = boundary.getBoundary().second;
  55.     int ws=0;
  56.     MPI_Comm_size(MPI_COMM_WORLD,&ws);
  57.     return RandSquare(ws,lower_left.x,upper_right.x,lower_left.y,upper_right.y);
  58.   }
  59.  
  60. #endif
  61.  
  62.   vector<ComputationalCell> calc_init_cond(const Tessellation& tess)
  63.   {    
  64.     vector<ComputationalCell> res(static_cast<size_t>(tess.GetPointNo()));
  65.     const Vector2D snc(0.3,0);
  66.     const double radius = 0.05;
  67.     for(size_t i=0;i<res.size();++i){
  68.       const Vector2D& r = tess.GetMeshPoint(static_cast<int>(i));
  69.       res.at(i).density = 1;
  70.       const bool is_in = abs(r-snc)<radius;
  71.       res.at(i).pressure = is_in ? 1e4 : 1;
  72.       res.at(i).velocity = Vector2D(0,0);
  73.     }
  74.     return res;
  75.   }
  76.  
  77.   class PressureFloor: public CellUpdater
  78.   {
  79.   public:
  80.  
  81.     PressureFloor(void) {}
  82.  
  83.     vector<ComputationalCell> operator()
  84.       (const Tessellation& tess,
  85.        const PhysicalGeometry& /*pg*/,
  86.        const EquationOfState& eos,
  87.        vector<Extensive>& extensives,
  88.        const vector<ComputationalCell>& old,
  89.        const CacheData& cd) const
  90.     {
  91.       size_t N = static_cast<size_t>(tess.GetPointNo());
  92.       vector<ComputationalCell> res(N, old[0]);
  93.       for(size_t i=0;i<N;++i){
  94.     Extensive& extensive = extensives[i];
  95.     const double volume = cd.volumes[i];
  96.     res[i].density = extensive.mass / volume;
  97.     if(res[i].density<0)
  98.       throw UniversalError("Negative density");
  99.     res[i].velocity = extensive.momentum / extensive.mass;
  100.     const double energy = extensive.energy / extensive.mass -
  101.       0.5*ScalarProd(res[i].velocity, res[i].velocity);
  102.     try{
  103.       if(energy>0)
  104.         res[i].pressure = eos.de2p(res[i].density,
  105.                        energy,
  106.                        res[i].tracers);
  107.       else
  108.         res[i].pressure = 1e-9;
  109.     }
  110.     catch(UniversalError& eo){
  111.       eo.addEntry("cell density", res[i].density);
  112.       eo.addEntry("cell energy", energy);
  113.       throw;
  114.     }
  115.     for(size_t j=0;j<extensive.tracers.size();++j)
  116.       res.at(i).tracers.at(j) = extensive.tracers.at(j)/extensive.mass;
  117.       }
  118.       return res;
  119.     }
  120.   };
  121.  
  122.   vector<Vector2D> add_noise(const vector<Vector2D>& source)
  123.   {
  124.       const double dx = source[1].x - source[0].x;
  125.       const double amp = 0.5*dx;
  126.       boost::random::uniform_real_distribution<> dist(-amp, amp);
  127.       boost::random::mt19937 gen;
  128.       vector<Vector2D> res = source;
  129.       for(size_t i=0;i<res.size();++i){
  130.           res[i].x += dist(gen);
  131.           res[i].y += dist(gen);
  132.       }
  133.       return res;
  134.   }
  135.  
  136.   class SimData
  137.   {
  138.   public:
  139.  
  140.     SimData(void):
  141.       pg_(Vector2D(0,0), Vector2D(0,1)),
  142.       width_(1),
  143.       outer_(1e-6,width_,width_,-width_),
  144. #ifdef RICH_MPI
  145.       vproc_(process_positions(outer_),outer_),
  146.       init_points_(SquareMeshM(50,50,vproc_,outer_.getBoundary().first,outer_.getBoundary().second)),
  147.       tess_(vproc_,init_points_,outer_),
  148. #else
  149.       init_points_(add_noise(cartesian_mesh(200,400,outer_.getBoundary().first,outer_.getBoundary().second))),
  150.       tess_(init_points_, outer_),
  151. #endif
  152.       eos_(5./3.),
  153.       //bpm_(),
  154.       //point_motion_(bpm_,eos_),
  155.       point_motion_(),
  156.       sb_(),
  157.       rs_(),
  158.       force_(pg_.getAxis()),
  159.       tsf_(0.3),
  160.       fc_(rs_),
  161.       eu_(),
  162.       cu_(),
  163.       sim_(
  164. #ifdef RICH_MPI
  165.        vproc_,
  166. #endif
  167.        tess_,
  168.        outer_,
  169.        pg_,
  170.        calc_init_cond(tess_),
  171.        eos_,
  172.        point_motion_,
  173.        sb_,
  174.        force_,
  175.        tsf_,
  176.        fc_,
  177.        eu_,
  178.        cu_) {}
  179.  
  180.     hdsim& getSim(void)
  181.     {
  182.       return sim_;
  183.     }
  184.  
  185.   private:
  186.     const CylindricalSymmetry pg_;
  187.     const double width_;
  188.     const SquareBox outer_;
  189. #ifdef RICH_MPI
  190.     VoronoiMesh vproc_;
  191. #endif
  192.     const vector<Vector2D> init_points_;
  193.     VoronoiMesh tess_;
  194.     const IdealGas eos_;
  195. #ifdef RICH_MPI
  196.     //Eulerian point_motion_;
  197.     //  Lagrangian point_motion_;
  198. #else
  199.     Eulerian point_motion_;
  200.     //    Lagrangian bpm_;
  201.     //    RoundCells point_motion_;
  202.     //Lagrangian point_motion_;
  203. #endif
  204.     const StationaryBox sb_;
  205.     const Hllc rs_;
  206.     CylindricalComplementary force_;
  207.     //SeveralSources force_;
  208.     //  ZeroForce force_;
  209.     const SimpleCFL tsf_;
  210.     const SimpleFluxCalculator fc_;
  211.     const SimpleExtensiveUpdater eu_;
  212.     const SimpleCellUpdater cu_;
  213.     //const PressureFloor cu_;
  214.     hdsim sim_;
  215.   };
  216.  
  217.   class WriteCycle: public DiagnosticFunction
  218.   {
  219.   public:
  220.  
  221.     WriteCycle(const string& fname):
  222.       fname_(fname) {}
  223.  
  224.     void operator()(const hdsim& sim)
  225.     {
  226.       write_number(sim.getCycle(),fname_);
  227.     }
  228.  
  229.   private:
  230.     const string fname_;
  231.   };
  232.  
  233.   class VolumeCalculator: public DiagnosticAppendix
  234.   {
  235.   public:
  236.  
  237.     vector<double> operator()(const hdsim& sim) const
  238.     {
  239.       vector<double> res(sim.getAllCells().size(),0);
  240.       for(size_t i=0;i<res.size();++i)
  241.     res.at(i) = sim.getCellVolume(i);
  242.       return res;
  243.     }
  244.  
  245.     string getName(void) const
  246.     {
  247.       return "volumes";
  248.     }    
  249.   };
  250.  
  251.   class CraterSizeHistory: public DiagnosticFunction
  252.   {
  253.   public:
  254.  
  255.     CraterSizeHistory(const string& fname):
  256.       fname_(fname),
  257.       r_list_(),
  258.       v_list_(),
  259.       t_list_(),
  260.       x_list_(),
  261.       y_list_() {}
  262.  
  263.     void operator()(const hdsim& sim)
  264.     {
  265.       const vector<ComputationalCell>& cells = sim.getAllCells();
  266.       const Tessellation& tess = sim.getTessellation();
  267.       size_t idx = 0;
  268.       double min_y = 0;
  269.       for(size_t i=0;i<cells.size();++i){
  270.     const Vector2D r = tess.GetMeshPoint(static_cast<int>(i));
  271.     if(r.y>min_y)
  272.       continue;
  273.     const ComputationalCell cell = cells.at(i);
  274.     if(cell.pressure<1e-7)
  275.       continue;
  276.     idx = i;
  277.     min_y = r.y;
  278.       }
  279.       const Vector2D r = tess.GetMeshPoint(static_cast<int>(idx));
  280.       const ComputationalCell cell = cells.at(idx);
  281.       r_list_.push_back(abs(r));
  282.       v_list_.push_back(abs(cell.velocity));
  283.       x_list_.push_back(r.x);
  284.       y_list_.push_back(r.y);
  285.       t_list_.push_back(sim.getTime());
  286.     }
  287.  
  288.     ~CraterSizeHistory(void)
  289.     {
  290.       ofstream f(fname_.c_str());
  291.       for(size_t i=0;i<r_list_.size();++i)
  292.     f << t_list_.at(i) << " "
  293.       << r_list_.at(i) << " "
  294.       << v_list_.at(i) << " "
  295.       << x_list_.at(i) << " "
  296.       << y_list_.at(i) << endl;
  297.       f.close();
  298.     }
  299.  
  300.   private:
  301.     const string fname_;
  302.     mutable vector<double> r_list_;
  303.     mutable vector<double> v_list_;
  304.     mutable vector<double> t_list_;
  305.     mutable vector<double> x_list_;
  306.     mutable vector<double> y_list_;
  307.   };
  308. }
  309.  
  310. int main(void)
  311. {
  312. #ifdef RICH_MPI
  313.     MPI_Init(NULL,NULL);
  314.     int rank=0;
  315.     MPI_Comm_rank(MPI_COMM_WORLD,&rank);
  316. #endif
  317.   SimData sim_data;
  318.   hdsim& sim = sim_data.getSim();
  319.  
  320.   const double tf = 2e-2;
  321.   SafeTimeTermination term_cond(tf,1e6);
  322.   MultipleDiagnostics diag
  323.   (VectorInitialiser<DiagnosticFunction*>()
  324.    (new ConsecutiveSnapshots(new ConstantTimeInterval(tf/100),
  325.                  new Rubric("output/snapshot_",".h5"),
  326.                  VectorInitialiser<DiagnosticAppendix*>(new VolumeCalculator())
  327.                  ()))
  328.    (new WriteTime("time.txt"))
  329.    //(new CraterSizeHistory("crater_size_history.txt"))
  330.    (new WriteCycle("cycle.txt"))());
  331.   write_snapshot_to_hdf5(sim, "output/initial.h5");
  332.   main_loop(sim,
  333.         term_cond,
  334.         &hdsim::TimeAdvance,
  335.         &diag);
  336.        
  337.  
  338. #ifdef RICH_MPI
  339.   write_snapshot_to_hdf5(sim, "process_"+int2str(rank)+"_final"+".h5");
  340.   MPI_Finalize();
  341. #else
  342.   write_snapshot_to_hdf5(sim, "output/final.h5");
  343. #endif
  344.  
  345.   return 0;
  346. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement