7 #include "../../mpi/mpi_commands.hpp" 16 class CellEdgesGetter :
public LazyList<Edge>
21 tess_(tess), edge_indices_(tess.GetCellEdges(n)) {}
23 size_t size(
void)
const 25 return edge_indices_.size();
28 Edge operator[](
size_t i)
const 30 return tess_.GetEdge(edge_indices_[i]);
35 const vector<int> edge_indices_;
41 vector<Extensive> init_extensives(
const Tessellation& tess,
43 const vector<ComputationalCell>& cells,
48 size_t Nloop =
static_cast<size_t>(tess.
GetPointNo());
49 vector<Extensive> res(Nloop);
52 for (
size_t i = 0; i < Nloop; ++i)
58 const double mass = volume * cell.
density;
62 res[i].momentum = mass * cell.
velocity;
64 res[i].tracers.resize(N);
65 for (
size_t j = 0; j < N; ++j)
66 res[i].tracers[j] = cell.
tracers[j] * mass;
71 for (
size_t i = 0; i < Nloop; ++i)
78 const double mass = volume * cell.
density * gamma;
84 res[i].energy = (gamma*enthalpy + (gamma - 1))* mass - cell.
pressure*volume;
85 res[i].momentum = mass * (enthalpy+1)*gamma*cell.
velocity;
87 res[i].tracers.resize(N);
88 for (
size_t j = 0; j < N; ++j)
89 res[i].tracers[j] = cell.
tracers[j] * mass;
104 const vector<ComputationalCell>& cells,
132 tracer_sticker_names,relativistic)),
133 point_motion_(point_motion),
134 edge_velocity_calculator_(evc),
143 tracer_sticker_names_(tracer_sticker_names),
144 cache_data_(tess, pg)
146 , proc_update_(proc_update)
150 size_t N = cells_.size();
151 vector<size_t> tindex =
sort_index(tracer_sticker_names_.tracer_names);
152 vector<size_t> sindex =
sort_index(tracer_sticker_names_.sticker_names);
153 tracer_sticker_names_.tracer_names =
VectorValues(tracer_sticker_names_.tracer_names, tindex);
154 tracer_sticker_names_.sticker_names =
VectorValues(tracer_sticker_names_.sticker_names, sindex);
155 for (
size_t i = 0; i < N; ++i)
157 for (
size_t j = 0; j < tindex.size(); ++j)
159 cells_[i].tracers[j] = cells[i].tracers[tindex[j]];
160 extensives_[i].tracers[j] = cells_[i].tracers[j] * extensives_[i].mass;
162 for (
size_t j = 0; j < sindex.size(); ++j)
163 cells_[i].stickers[j] = cells[i].stickers[sindex[j]];
166 MPI_exchange_data(tess_, cells_,
true);
174 return tracer_sticker_names_;
179 vector<Vector2D> point_velocities =
180 point_motion_(tess_, cells_, time_,tracer_sticker_names_);
183 MPI_exchange_data(tess_, point_velocities,
true);
186 vector<Vector2D> edge_velocities =
187 edge_velocity_calculator_(tess_, point_velocities);
189 const double dt = tsf_(tess_,
193 time_,tracer_sticker_names_);
195 point_velocities = point_motion_.ApplyFix(tess_, cells_, time_, dt, point_velocities,tracer_sticker_names_);
197 MPI_exchange_data(tess_, point_velocities,
true);
201 edge_velocity_calculator_(tess_, point_velocities);
203 const vector<Extensive> fluxes =
212 dt,tracer_sticker_names_);
223 time_,tracer_sticker_names_);
234 extensives_,tracer_sticker_names_);
237 if (proc_update_ != 0)
238 proc_update_->Update(proctess_, tess_);
239 vector<int> HilbertIndeces =
MoveMeshPoints(point_velocities, dt, tess_, proctess_, cycle_ % 10 == 0);
240 if (cycle_ % 10 == 0)
242 extensives_ =
VectorValues(extensives_, HilbertIndeces);
244 point_velocities =
VectorValues(point_velocities, HilbertIndeces);
247 MPI_exchange_data(tess_, extensives_,
false);
248 MPI_exchange_data(tess_, cells_,
false);
250 vector<int> HilbertIndeces =
MoveMeshPoints(point_velocities, dt, tess_, cycle_ % 25 == 0);
251 if (cycle_ % 25 == 0)
253 extensives_ =
VectorValues(extensives_, HilbertIndeces);
255 point_velocities =
VectorValues(point_velocities, HilbertIndeces);
261 cells_ = cu_(tess_, pg_, eos_, extensives_, cells_,cache_data_,tracer_sticker_names_, time_);
264 MPI_exchange_data(tess_, cells_,
true);
273 vector<Vector2D> point_velocities =
274 point_motion_(tess_, cells_, time_,tracer_sticker_names_);
276 vector<Vector2D> edge_velocities =
277 edge_velocity_calculator_(tess_, point_velocities);
279 const double dt = tsf_(tess_,
283 time_,tracer_sticker_names_);
285 point_velocities = point_motion_.ApplyFix(tess_, cells_, time_, dt, point_velocities,tracer_sticker_names_);
288 edge_velocity_calculator_(tess_, point_velocities);
290 const vector<Extensive> fluxes =
299 dt,tracer_sticker_names_);
309 extensives_, time_,tracer_sticker_names_);
320 extensives_,tracer_sticker_names_);
322 boost::scoped_ptr<Tessellation> oldtess(tess_.clone());
326 extensives_ = extensives_ +
FluxFix2(*oldtess, *oldtess, tess_, point_velocities, dt, cells_, fluxes, edge_velocities, obc_, eos_);
330 cells_ = cu_(tess_, pg_, eos_, extensives_, cells_,cache_data_,tracer_sticker_names_, time_);
339 vector<Extensive> average_extensive
340 (
const vector<Extensive>& extensives_1,
341 const vector<Extensive>& extensives_2)
343 assert(extensives_1.size() == extensives_2.size());
344 vector<Extensive> res(extensives_1.size());
345 for (
size_t i = 0; i < extensives_1.size(); ++i)
346 res[i] = 0.5*(extensives_1[i] + extensives_2[i]);
353 #ifdef RICH_DEBUG_PRINT 355 MPI_Comm_rank(MPI_COMM_WORLD, &rank);
356 MPI_Barrier(MPI_COMM_WORLD);
358 std::cout <<
"Here 0" << std::endl;
360 vector<Vector2D> point_velocities = point_motion_(tess_, cells_, time_,tracer_sticker_names_);
363 MPI_exchange_data(tess_, point_velocities,
true);
366 vector<Vector2D> edge_velocities =
367 edge_velocity_calculator_(tess_, point_velocities);
368 #ifdef RICH_DEBUG_PRINT 369 MPI_Barrier(MPI_COMM_WORLD);
371 std::cout <<
"Here 1" << std::endl;
374 double dt = tsf_(tess_, cells_, eos_, edge_velocities, time_,tracer_sticker_names_);
376 #ifdef RICH_DEBUG_PRINT 377 MPI_Barrier(MPI_COMM_WORLD);
379 std::cout <<
"Here 2" << std::endl;
382 point_velocities = point_motion_.ApplyFix(tess_, cells_, time_, dt, point_velocities,tracer_sticker_names_);
385 MPI_exchange_data(tess_, point_velocities,
true);
388 edge_velocity_calculator_(tess_, point_velocities);
390 dt = tsf_(tess_, cells_, eos_, edge_velocities, time_, tracer_sticker_names_);
391 #ifdef RICH_DEBUG_PRINT 392 MPI_Barrier(MPI_COMM_WORLD);
394 std::cout <<
"Here 3" << std::endl;
397 const vector<Extensive> mid_fluxes =
406 dt,tracer_sticker_names_);
407 #ifdef RICH_DEBUG_PRINT 408 MPI_Barrier(MPI_COMM_WORLD);
410 std::cout <<
"Here 4" << std::endl;
413 vector<Extensive> mid_extensives = extensives_;
425 mid_extensives,tracer_sticker_names_);
426 #ifdef RICH_DEBUG_PRINT 427 MPI_Barrier(MPI_COMM_WORLD);
429 std::cout <<
"Here 5" << std::endl;
432 eu_(mid_fluxes, pg_, tess_, dt, cache_data_, cells_, mid_extensives, time_,tracer_sticker_names_);
434 #ifdef RICH_DEBUG_PRINT 435 MPI_Barrier(MPI_COMM_WORLD);
437 std::cout <<
"Here 6" << std::endl;
441 if (proc_update_ != 0)
442 proc_update_->Update(proctess_, tess_);
443 vector<int> HilbertIndeces =
MoveMeshPoints(point_velocities, dt, tess_, proctess_, cycle_ % 10 == 0);
444 if (cycle_ % 10 == 0)
446 mid_extensives =
VectorValues(mid_extensives, HilbertIndeces);
447 extensives_ =
VectorValues(extensives_, HilbertIndeces);
449 point_velocities =
VectorValues(point_velocities, HilbertIndeces);
452 MPI_exchange_data(tess_, mid_extensives,
false);
453 MPI_exchange_data(tess_, extensives_,
false);
454 MPI_exchange_data(tess_, cells_,
false);
455 MPI_exchange_data(tess_, point_velocities,
false);
456 MPI_exchange_data(tess_, point_velocities,
true);
458 vector<int> HilbertIndeces =
MoveMeshPoints(point_velocities, dt, tess_, cycle_ % 25 == 0);
459 if (cycle_ % 25 == 0)
461 mid_extensives =
VectorValues(mid_extensives, HilbertIndeces);
462 extensives_ =
VectorValues(extensives_, HilbertIndeces);
464 point_velocities =
VectorValues(point_velocities, HilbertIndeces);
467 #ifdef RICH_DEBUG_PRINT 468 MPI_Barrier(MPI_COMM_WORLD);
470 std::cout <<
"Here 7" << std::endl;
475 vector<ComputationalCell> mid_cells = cu_(tess_, pg_, eos_, mid_extensives, cells_, cache_data_,
476 tracer_sticker_names_, time_ + dt);
477 #ifdef RICH_DEBUG_PRINT 478 MPI_Barrier(MPI_COMM_WORLD);
480 std::cout <<
"Here 8" << std::endl;
484 MPI_exchange_data(tess_, mid_cells,
true);
485 MPI_exchange_data(tess_, cells_,
true);
488 edge_velocity_calculator_(tess_, point_velocities);
490 const vector<Extensive> fluxes =
499 dt,tracer_sticker_names_);
501 #ifdef RICH_DEBUG_PRINT 502 MPI_Barrier(MPI_COMM_WORLD);
504 std::cout <<
"Here 9" << std::endl;
517 mid_extensives,tracer_sticker_names_);
519 eu_(fluxes, pg_, tess_, dt, cache_data_, cells_, mid_extensives, time_ + dt,tracer_sticker_names_);
521 #ifdef RICH_DEBUG_PRINT 522 MPI_Barrier(MPI_COMM_WORLD);
524 std::cout <<
"Here 10" << std::endl;
528 extensives_ = average_extensive(mid_extensives, extensives_);
530 cells_ = cu_(tess_, pg_, eos_, extensives_, cells_, cache_data_,tracer_sticker_names_, time_ + dt);
532 #ifdef RICH_DEBUG_PRINT 533 MPI_Barrier(MPI_COMM_WORLD);
535 std::cout <<
"Here 11" << std::endl;
539 MPI_exchange_data(tess_, cells_,
true);
548 vector<Vector2D> point_velocities = point_motion_(tess_, cells_, time_,tracer_sticker_names_);
550 vector<Vector2D> edge_velocities = edge_velocity_calculator_(tess_, point_velocities);
552 const double dt = tsf_(tess_, cells_, eos_, edge_velocities, time_,tracer_sticker_names_);
554 point_velocities = point_motion_.ApplyFix(tess_, cells_, time_, dt, point_velocities,tracer_sticker_names_);
556 edge_velocities = edge_velocity_calculator_(tess_, point_velocities);
558 vector<Extensive> fluxes = fc_(tess_, edge_velocities, cells_, extensives_, cache_data_, eos_, time_, 0.5*dt,
559 tracer_sticker_names_);
561 vector<Extensive> mid_extensives = extensives_;
563 boost::scoped_ptr<Tessellation> oldtess(tess_.clone());
565 vector<Vector2D> old_points = tess_.GetMeshPoints();
566 old_points.resize(static_cast<size_t>(tess_.GetPointNo()));
571 mid_extensives = mid_extensives +
FluxFix2(*oldtess, *oldtess, tess_, point_velocities, 0.5*dt, cells_, fluxes,
572 edge_velocities, obc_, eos_);
574 eu_(fluxes, pg_, *oldtess, 0.5*dt, data_temp, cells_, mid_extensives, time_,tracer_sticker_names_);
577 mid_extensives,tracer_sticker_names_);
582 vector<ComputationalCell> mid_cells = cu_(tess_, pg_, eos_, mid_extensives, cells_, cache_data_,tracer_sticker_names_, time_);
584 edge_velocities = edge_velocity_calculator_(tess_, point_velocities);
586 fluxes = fc_(tess_, edge_velocities, mid_cells, mid_extensives, cache_data_, eos_, time_, dt,tracer_sticker_names_);
588 boost::scoped_ptr<Tessellation> midtess(tess_.clone());
594 extensives_ = extensives_ +
FluxFix2(*oldtess, *midtess, tess_, point_velocities, dt, mid_cells, fluxes,
595 edge_velocities, obc_, eos_);
597 eu_(fluxes, pg_, *midtess, dt, cachetemp2, cells_, extensives_, time_,tracer_sticker_names_);
600 extensives_,tracer_sticker_names_);
603 cells_ = cu_(tess_, pg_, eos_, extensives_, cells_, cache_data_,tracer_sticker_names_, time_ + 0.5 * dt);
605 if (cycle_ % 25 == 0)
607 vector<int> HilbertIndeces =
MoveMeshPoints(point_velocities, dt, tess_, cycle_ % 25 == 0, old_points);
608 extensives_ =
VectorValues(extensives_, HilbertIndeces);
619 vector<Vector2D> point_velocities = point_motion_(tess_, cells_, time_,tracer_sticker_names_);
621 vector<Vector2D> edge_velocities = edge_velocity_calculator_(tess_, point_velocities);
623 const double dt = tsf_(tess_, cells_, eos_, edge_velocities, time_,tracer_sticker_names_);
625 point_velocities = point_motion_.ApplyFix(tess_, cells_, time_, dt, point_velocities,tracer_sticker_names_);
627 edge_velocities = edge_velocity_calculator_(tess_, point_velocities);
629 vector<Extensive> fluxes = fc_(tess_, edge_velocities, cells_, extensives_, cache_data_, eos_, time_, 0.5*dt,
630 tracer_sticker_names_);
632 vector<Extensive> mid_extensives = extensives_;
634 eu_(fluxes, pg_, tess_, 0.5*dt, cache_data_, cells_, mid_extensives, time_,tracer_sticker_names_);
637 mid_extensives,tracer_sticker_names_);
639 vector<Vector2D> old_points = tess_.GetMeshPoints();
640 old_points.resize(static_cast<size_t>(tess_.GetPointNo()));
642 boost::scoped_ptr<Tessellation> oldtess(tess_.clone());
644 vector<int> HilbertIndeces =
MoveMeshPoints(point_velocities, 0.5*dt, tess_, cycle_ % 25 == 0);
645 if (cycle_ % 25 == 0)
647 mid_extensives =
VectorValues(mid_extensives, HilbertIndeces);
648 extensives_ =
VectorValues(extensives_, HilbertIndeces);
650 point_velocities =
VectorValues(point_velocities, HilbertIndeces);
659 vector<ComputationalCell> mid_cells = cu_(tess_, pg_, eos_, mid_extensives, cells_, cache_data_,
660 tracer_sticker_names_, time_);
662 edge_velocities = edge_velocity_calculator_(tess_, point_velocities);
664 fluxes = fc_(tess_, edge_velocities, mid_cells, mid_extensives, cache_data_, eos_, time_, dt,
665 tracer_sticker_names_);
667 eu_(fluxes, pg_, tess_, dt, cache_data_, cells_, extensives_, time_,tracer_sticker_names_);
670 extensives_,tracer_sticker_names_);
672 boost::scoped_ptr<Tessellation> midtess(tess_.clone());
677 cells_ = cu_(tess_, pg_, eos_, extensives_, cells_, cache_data_,tracer_sticker_names_, time_ + 0.5 * dt);
685 template<
class T>
class AverageCalculator :
public LazyList<T>
689 AverageCalculator(
const vector<T>& ll1,
690 const vector<T>& ll2) :
693 assert(ll1.size() == ll2.size());
696 size_t getLength(
void)
const 701 T operator()(
size_t i)
const 703 return 0.5*(ll1_[i] + ll2_[i]);
707 const vector<T>& ll1_;
708 const vector<T>& ll2_;
751 cells_ = cu_(tess_, pg_, eos_, extensives_, cells_,
752 cache_data_,tracer_sticker_names_, time_);
754 MPI_exchange_data(tess_, cells_,
true);
761 for (
size_t i = 0; i < extensives_.size(); ++i)
764 const double volume = cache_data_.volumes[i];
765 const double mass = volume*cell.
density;
766 extensives_[i].mass = mass;
767 extensives_[i].energy = eos_.dp2e(cell.
density, cell.
pressure, cell.
tracers,tracer_sticker_names_.tracer_names)
769 extensives_[i].momentum = mass*cell.
velocity;
770 extensives_[i].tracers.resize(cell.
tracers.size());
771 size_t N = cell.
tracers.size();
772 for (
size_t j = 0; j < N; ++j)
773 extensives_[i].tracers[j] = cell.
tracers[j] * mass;
809 return pg_.calcVolume
const Tessellation & GetProcTessellation(void) const
Returns the processor tessellation.
vector< T > VectorValues(vector< T > const &v, vector< int > const &index)
Returns only the values with indeces in index.
void sort_index(const vector< T > &arr, vector< int > &res)
Returns the indeces of a sort.
Base class for extensive update scheme.
Abstract class for tessellation.
virtual int GetPointNo(void) const =0
Get Total number of mesh generating points.
Fixes the area inconsistency problem.
Two dimensional, newtonian simulation.
virtual double calcVolume(const vector< Edge > &edge_list) const =0
Calculates the physical volume of a cell.
vector< T > serial_generate(const LazyList< T > &ll)
Creates a vector from an LazyList.
double getTime(void) const
Returns the time.
Interface between two cells.
void recalculatePrimitives(void)
Recalculates the primitives from the extensive variables.
Base class for a scheme to calculate the velocity on the edges.
Abstract class for motion of mesh generating points.
const Tessellation & getTessellation(void) const
Returns the tessellation.
void recalculateExtensives(void)
Recalculates extensives (in case computational cells were changed manually)
tvector tracers
Tracers (can transfer from one cell to another)
Ordered list whose terms are evaluated lazily.
void setCycle(int cycle)
Sets the cycle.
TracerStickerNames const & GetTracerStickerNames(void) const
Returns the TracerStickerNames.
Abstract class for external forces.
int getCycle(void) const
Returns the number cycles.
const PhysicalGeometry & getPhysicalGeometry(void) const
Access to physical geometry.
const CacheData & getCacheData(void) const
Returns reference to the cached data.
Updates the positions of the processes.
double ScalarProd(Vector3D const &v1, Vector3D const &v2)
Scalar product of two vectors.
Base class for flux calculator.
Base class for equation of state.
void ExternalForceContribution(const Tessellation &tess, const PhysicalGeometry &pg, const CacheData &cd, const vector< ComputationalCell > &cells, const vector< Extensive > &fluxes, const vector< Vector2D > &point_velocities, const SourceTerm &source, double t, double dt, vector< Extensive > &extensives, TracerStickerNames const &tracerstickernames)
Adds force contribution to the extensive conserved variables.
Container for cache data.
Simulation output to hdf5 file format.
std::vector< std::string > tracer_names
The names of the tracers.
const EquationOfState & getEos(void) const
Access to the equation of state.
Base class for cell update scheme.
Class for keeping the names of the tracers and stickers.
void TimeAdvance2MidPointClip(void)
Second order time advance, mid point method with area fix.
void TimeAdvance2MidPoint(void)
Second order time advance, mid point method.
virtual double dp2e(double d, double p, tvector const &tracers=tvector(), vector< string > const &tracernames=vector< string >()) const =0
Calculates the thermal energy per unit mass.
Various manipulations of hydrodynamic variables.
void TimeAdvance(void)
Advances the simulation in time.
Abstract class for time step function.
~hdsim(void)
Class destructor.
Vector2D velocity
Velocity.
Abstract class for geometric boundary conditions for the tessellation.
const vector< ComputationalCell > & getAllCells(void) const
Returns a list of all computational cells.
void TimeAdvanceClip(void)
Advances the simulation in time with area fix.
void setStartTime(double t_start)
Sets the start time.
void TimeAdvance2Heun(void)
Second order time advance.
vector< int > MoveMeshPoints(vector< Vector2D > const &pointvelocity, double dt, Tessellation &tessellation, bool reorder, vector< Vector2D > oldpoints=vector< Vector2D >())
Move mesh points.
Base class for physical geometry.
double fastabs(Vector2D const &v)
Norm of a vector, less accurate.
double getCellVolume(size_t index) const
Returns the volume of a certain cell.
vector< Extensive > FluxFix2(Tessellation const &tessold, Tessellation const &tessmid, Tessellation const &tessnew, vector< Vector2D > const &pointvelocity, double dt, vector< ComputationalCell > const &cells, vector< Extensive > const &fluxes, vector< Vector2D > const &fv, OuterBoundary const &outer, EquationOfState const &eos)
Fixes the flux to propely converge second order.
const OuterBoundary & getOuterBoundary(void) const
Access to the geometric outer boundary.
const vector< Extensive > & getAllExtensives(void) const
Returns a list of extensive variables.