Skip to content
GitLab
Projects
Groups
Snippets
/
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Menu
Open sidebar
SWIFT
SWIFTsim
Commits
259be318
Commit
259be318
authored
Mar 15, 2018
by
Matthieu Schaller
Browse files
Also update the other hydro schemes to use the newly defined functions.
parent
79b0d507
Changes
10
Hide whitespace changes
Inline
Side-by-side
src/hydro/Default/hydro.h
View file @
259be318
...
...
@@ -160,6 +160,18 @@ __attribute__((always_inline)) INLINE static float hydro_get_mass(
return
p
->
mass
;
}
/**
* @brief Sets the mass of a particle
*
* @param p The particle of interest
* @param m The mass to set.
*/
__attribute__
((
always_inline
))
INLINE
static
void
hydro_set_mass
(
struct
part
*
restrict
p
,
float
m
)
{
p
->
mass
=
m
;
}
/**
* @brief Returns the velocities drifted to the current time of a particle.
*
...
...
@@ -500,9 +512,12 @@ __attribute__((always_inline)) INLINE static void hydro_kick_extra(
* Requires the density to be known
*
* @param p The particle to act upon
* @param xp The extended data.
* @param cosmo The cosmological model.
*/
__attribute__
((
always_inline
))
INLINE
static
void
hydro_convert_quantities
(
struct
part
*
restrict
p
,
struct
xpart
*
restrict
xp
)
{}
struct
part
*
restrict
p
,
struct
xpart
*
restrict
xp
,
const
struct
cosmology
*
cosmo
)
{}
/**
* @brief Initialises the particles for the first time
...
...
@@ -529,4 +544,21 @@ __attribute__((always_inline)) INLINE static void hydro_first_init_part(
hydro_init_part
(
p
,
NULL
);
}
/**
* @brief Overwrite the initial internal energy of a particle.
*
* Note that in the cases where the thermodynamic variable is not
* internal energy but gets converted later, we must overwrite that
* field. The conversion to the actual variable happens later after
* the initial fake time-step.
*
* @param p The #part to write to.
* @param u_init The new initial internal energy.
*/
__attribute__
((
always_inline
))
INLINE
static
void
hydro_set_init_internal_energy
(
struct
part
*
p
,
float
u_init
)
{
p
->
u
=
u_init
;
}
#endif
/* SWIFT_DEFAULT_HYDRO_H */
src/hydro/Default/hydro_io.h
View file @
259be318
...
...
@@ -54,7 +54,7 @@ void hydro_read_particles(struct part* parts, struct io_props* list,
}
void
convert_part_pos
(
const
struct
engine
*
e
,
const
struct
part
*
p
,
double
*
ret
)
{
const
struct
xpart
*
xp
,
double
*
ret
)
{
if
(
e
->
s
->
periodic
)
{
ret
[
0
]
=
box_wrap
(
p
->
x
[
0
],
0
.
0
,
e
->
s
->
dim
[
0
]);
...
...
@@ -67,6 +67,40 @@ void convert_part_pos(const struct engine* e, const struct part* p,
}
}
void
convert_part_vel
(
const
struct
engine
*
e
,
const
struct
part
*
p
,
const
struct
xpart
*
xp
,
float
*
ret
)
{
const
int
with_cosmology
=
(
e
->
policy
&
engine_policy_cosmology
);
const
struct
cosmology
*
cosmo
=
e
->
cosmology
;
const
integertime_t
ti_current
=
e
->
ti_current
;
const
double
time_base
=
e
->
time_base
;
const
integertime_t
ti_beg
=
get_integer_time_begin
(
ti_current
,
p
->
time_bin
);
const
integertime_t
ti_end
=
get_integer_time_end
(
ti_current
,
p
->
time_bin
);
/* Get time-step since the last kick */
float
dt_kick_grav
,
dt_kick_hydro
;
if
(
with_cosmology
)
{
dt_kick_grav
=
cosmology_get_grav_kick_factor
(
cosmo
,
ti_beg
,
ti_current
);
dt_kick_grav
-=
cosmology_get_grav_kick_factor
(
cosmo
,
ti_beg
,
(
ti_beg
+
ti_end
)
/
2
);
dt_kick_hydro
=
cosmology_get_hydro_kick_factor
(
cosmo
,
ti_beg
,
ti_current
);
dt_kick_hydro
-=
cosmology_get_hydro_kick_factor
(
cosmo
,
ti_beg
,
(
ti_beg
+
ti_end
)
/
2
);
}
else
{
dt_kick_grav
=
(
ti_current
-
((
ti_beg
+
ti_end
)
/
2
))
*
time_base
;
dt_kick_hydro
=
(
ti_current
-
((
ti_beg
+
ti_end
)
/
2
))
*
time_base
;
}
/* Extrapolate the velocites to the current time */
hydro_get_drifted_velocities
(
p
,
xp
,
dt_kick_hydro
,
dt_kick_grav
,
ret
);
/* Conversion from internal units to peculiar velocities */
ret
[
0
]
*=
cosmo
->
a2_inv
;
ret
[
1
]
*=
cosmo
->
a2_inv
;
ret
[
2
]
*=
cosmo
->
a2_inv
;
}
/**
* @brief Specifies which particle fields to write to a dataset
*
...
...
@@ -74,16 +108,17 @@ void convert_part_pos(const struct engine* e, const struct part* p,
* @param list The list of i/o properties to write.
* @param num_fields The number of i/o fields to write.
*/
void
hydro_write_particles
(
struct
part
*
parts
,
struct
io_props
*
list
,
int
*
num_fields
)
{
void
hydro_write_particles
(
const
struct
part
*
parts
,
const
struct
xpart
*
xparts
,
struct
io_props
*
list
,
int
*
num_fields
)
{
*
num_fields
=
7
;
/* List what we want to write */
list
[
0
]
=
io_make_output_field_convert_part
(
"Coordinates"
,
DOUBLE
,
3
,
UNIT_CONV_LENGTH
,
parts
,
convert_part_pos
);
list
[
1
]
=
io_make_output_field
(
"Velocities"
,
FLOAT
,
3
,
UNIT_CONV_SPEED
,
parts
,
v
);
list
[
0
]
=
io_make_output_field_convert_part
(
"Coordinates"
,
DOUBLE
,
3
,
UNIT_CONV_LENGTH
,
parts
,
xparts
,
convert_part_pos
);
list
[
1
]
=
io_make_output_field_convert_part
(
"Velocities"
,
FLOAT
,
3
,
UNIT_CONV_SPEED
,
parts
,
xparts
,
convert_part_vel
);
list
[
2
]
=
io_make_output_field
(
"Masses"
,
FLOAT
,
1
,
UNIT_CONV_MASS
,
parts
,
mass
);
list
[
3
]
=
io_make_output_field
(
"SmoothingLength"
,
FLOAT
,
1
,
UNIT_CONV_LENGTH
,
...
...
src/hydro/Gadget2/hydro.h
View file @
259be318
...
...
@@ -170,6 +170,18 @@ __attribute__((always_inline)) INLINE static float hydro_get_mass(
return
p
->
mass
;
}
/**
* @brief Sets the mass of a particle
*
* @param p The particle of interest
* @param m The mass to set.
*/
__attribute__
((
always_inline
))
INLINE
static
void
hydro_set_mass
(
struct
part
*
restrict
p
,
float
m
)
{
p
->
mass
=
m
;
}
/**
* @brief Returns the velocities drifted to the current time of a particle.
*
...
...
src/hydro/Gizmo/hydro.h
View file @
259be318
...
...
@@ -517,7 +517,7 @@ __attribute__((always_inline)) INLINE static void hydro_reset_predicted_values(
* @param p The particle to act upon.
*/
__attribute__
((
always_inline
))
INLINE
static
void
hydro_convert_quantities
(
struct
part
*
p
,
struct
xpart
*
xp
)
{}
struct
part
*
p
,
struct
xpart
*
xp
,
const
struct
cosmology
*
cosmo
)
{}
/**
* @brief Extra operations to be done during the drift
...
...
@@ -812,6 +812,18 @@ __attribute__((always_inline)) INLINE static float hydro_get_mass(
return
p
->
conserved
.
mass
;
}
/**
* @brief Sets the mass of a particle
*
* @param p The particle of interest
* @param m The mass to set.
*/
__attribute__
((
always_inline
))
INLINE
static
void
hydro_set_mass
(
struct
part
*
restrict
p
,
float
m
)
{
p
->
conserved
.
mass
=
m
;
}
/**
* @brief Returns the velocities drifted to the current time of a particle.
*
...
...
@@ -917,4 +929,29 @@ __attribute__((always_inline)) INLINE static void hydro_set_entropy(
p
->
primitives
.
P
=
S
*
pow_gamma
(
p
->
primitives
.
rho
);
}
/**
* @brief Overwrite the initial internal energy of a particle.
*
* Note that in the cases where the thermodynamic variable is not
* internal energy but gets converted later, we must overwrite that
* field. The conversion to the actual variable happens later after
* the initial fake time-step.
*
* @param p The #part to write to.
* @param u_init The new initial internal energy.
*/
__attribute__
((
always_inline
))
INLINE
static
void
hydro_set_init_internal_energy
(
struct
part
*
p
,
float
u_init
)
{
p
->
conserved
.
energy
=
u_init
*
p
->
conserved
.
mass
;
#ifdef GIZMO_TOTAL_ENERGY
/* add the kinetic energy */
p
->
conserved
.
energy
+=
0
.
5
f
*
p
->
conserved
.
mass
*
(
p
->
conserved
.
momentum
[
0
]
*
p
->
primitives
.
v
[
0
]
+
p
->
conserved
.
momentum
[
1
]
*
p
->
primitives
.
v
[
1
]
+
p
->
conserved
.
momentum
[
2
]
*
p
->
primitives
.
v
[
2
]);
#endif
p
->
primitives
.
P
=
hydro_gamma_minus_one
*
p
->
primitives
.
rho
*
u_init
;
}
#endif
/* SWIFT_GIZMO_HYDRO_H */
src/hydro/Gizmo/hydro_io.h
View file @
259be318
...
...
@@ -72,7 +72,8 @@ void hydro_read_particles(struct part* parts, struct io_props* list,
* @param p Particle.
* @param ret (return) Internal energy of the particle
*/
void
convert_u
(
const
struct
engine
*
e
,
const
struct
part
*
p
,
float
*
ret
)
{
void
convert_u
(
const
struct
engine
*
e
,
const
struct
part
*
p
,
const
struct
xpart
*
xp
,
float
*
ret
)
{
ret
[
0
]
=
hydro_get_comoving_internal_energy
(
p
);
}
...
...
@@ -84,7 +85,8 @@ void convert_u(const struct engine* e, const struct part* p, float* ret) {
* @param p Particle.
* @param ret (return) Entropic function of the particle
*/
void
convert_A
(
const
struct
engine
*
e
,
const
struct
part
*
p
,
float
*
ret
)
{
void
convert_A
(
const
struct
engine
*
e
,
const
struct
part
*
p
,
const
struct
xpart
*
xp
,
float
*
ret
)
{
ret
[
0
]
=
hydro_get_comoving_entropy
(
p
);
}
...
...
@@ -95,7 +97,8 @@ void convert_A(const struct engine* e, const struct part* p, float* ret) {
* @param p Particle.
* @return Total energy of the particle
*/
void
convert_Etot
(
const
struct
engine
*
e
,
const
struct
part
*
p
,
float
*
ret
)
{
void
convert_Etot
(
const
struct
engine
*
e
,
const
struct
part
*
p
,
const
struct
xpart
*
xp
,
float
*
ret
)
{
#ifdef GIZMO_TOTAL_ENERGY
ret
[
0
]
=
p
->
conserved
.
energy
;
#else
...
...
@@ -110,7 +113,7 @@ void convert_Etot(const struct engine* e, const struct part* p, float* ret) {
}
void
convert_part_pos
(
const
struct
engine
*
e
,
const
struct
part
*
p
,
double
*
ret
)
{
const
struct
xpart
*
xp
,
double
*
ret
)
{
if
(
e
->
s
->
periodic
)
{
ret
[
0
]
=
box_wrap
(
p
->
x
[
0
],
0
.
0
,
e
->
s
->
dim
[
0
]);
...
...
@@ -123,6 +126,40 @@ void convert_part_pos(const struct engine* e, const struct part* p,
}
}
void
convert_part_vel
(
const
struct
engine
*
e
,
const
struct
part
*
p
,
const
struct
xpart
*
xp
,
float
*
ret
)
{
const
int
with_cosmology
=
(
e
->
policy
&
engine_policy_cosmology
);
const
struct
cosmology
*
cosmo
=
e
->
cosmology
;
const
integertime_t
ti_current
=
e
->
ti_current
;
const
double
time_base
=
e
->
time_base
;
const
integertime_t
ti_beg
=
get_integer_time_begin
(
ti_current
,
p
->
time_bin
);
const
integertime_t
ti_end
=
get_integer_time_end
(
ti_current
,
p
->
time_bin
);
/* Get time-step since the last kick */
float
dt_kick_grav
,
dt_kick_hydro
;
if
(
with_cosmology
)
{
dt_kick_grav
=
cosmology_get_grav_kick_factor
(
cosmo
,
ti_beg
,
ti_current
);
dt_kick_grav
-=
cosmology_get_grav_kick_factor
(
cosmo
,
ti_beg
,
(
ti_beg
+
ti_end
)
/
2
);
dt_kick_hydro
=
cosmology_get_hydro_kick_factor
(
cosmo
,
ti_beg
,
ti_current
);
dt_kick_hydro
-=
cosmology_get_hydro_kick_factor
(
cosmo
,
ti_beg
,
(
ti_beg
+
ti_end
)
/
2
);
}
else
{
dt_kick_grav
=
(
ti_current
-
((
ti_beg
+
ti_end
)
/
2
))
*
time_base
;
dt_kick_hydro
=
(
ti_current
-
((
ti_beg
+
ti_end
)
/
2
))
*
time_base
;
}
/* Extrapolate the velocites to the current time */
hydro_get_drifted_velocities
(
p
,
xp
,
dt_kick_hydro
,
dt_kick_grav
,
ret
);
/* Conversion from internal units to peculiar velocities */
ret
[
0
]
*=
cosmo
->
a2_inv
;
ret
[
1
]
*=
cosmo
->
a2_inv
;
ret
[
2
]
*=
cosmo
->
a2_inv
;
}
/**
* @brief Specifies which particle fields to write to a dataset
*
...
...
@@ -130,33 +167,35 @@ void convert_part_pos(const struct engine* e, const struct part* p,
* @param list The list of i/o properties to write.
* @param num_fields The number of i/o fields to write.
*/
void
hydro_write_particles
(
struct
part
*
parts
,
struct
io_props
*
list
,
int
*
num_fields
)
{
void
hydro_write_particles
(
const
struct
part
*
parts
,
const
struct
xpart
*
xparts
,
struct
io_props
*
list
,
int
*
num_fields
)
{
*
num_fields
=
10
;
/* List what we want to write */
list
[
0
]
=
io_make_output_field_convert_part
(
"Coordinates"
,
DOUBLE
,
3
,
UNIT_CONV_LENGTH
,
parts
,
convert_part_pos
);
list
[
1
]
=
io_make_output_field
(
"Velocities"
,
FLOAT
,
3
,
UNIT_CONV_SPEED
,
parts
,
primitives
.
v
);
list
[
0
]
=
io_make_output_field_convert_part
(
"Coordinates"
,
DOUBLE
,
3
,
UNIT_CONV_LENGTH
,
parts
,
xparts
,
convert_part_pos
);
list
[
1
]
=
io_make_output_field_convert_part
(
"Velocities"
,
FLOAT
,
3
,
UNIT_CONV_SPEED
,
parts
,
xparts
,
convert_part_vel
);
list
[
2
]
=
io_make_output_field
(
"Masses"
,
FLOAT
,
1
,
UNIT_CONV_MASS
,
parts
,
conserved
.
mass
);
list
[
3
]
=
io_make_output_field
(
"SmoothingLength"
,
FLOAT
,
1
,
UNIT_CONV_LENGTH
,
parts
,
h
);
list
[
4
]
=
io_make_output_field_convert_part
(
"InternalEnergy"
,
FLOAT
,
1
,
UNIT_CONV_ENERGY_PER_UNIT_MASS
,
parts
,
convert_u
);
parts
,
xparts
,
convert_u
);
list
[
5
]
=
io_make_output_field
(
"ParticleIDs"
,
ULONGLONG
,
1
,
UNIT_CONV_NO_UNITS
,
parts
,
id
);
list
[
6
]
=
io_make_output_field
(
"Density"
,
FLOAT
,
1
,
UNIT_CONV_DENSITY
,
parts
,
primitives
.
rho
);
list
[
7
]
=
io_make_output_field_convert_part
(
"Entropy"
,
FLOAT
,
1
,
UNIT_CONV_ENTROPY
,
parts
,
convert_A
);
"Entropy"
,
FLOAT
,
1
,
UNIT_CONV_ENTROPY
,
parts
,
xparts
,
convert_A
);
list
[
8
]
=
io_make_output_field
(
"Pressure"
,
FLOAT
,
1
,
UNIT_CONV_PRESSURE
,
parts
,
primitives
.
P
);
list
[
9
]
=
io_make_output_field_convert_part
(
"TotEnergy"
,
FLOAT
,
1
,
UNIT_CONV_ENERGY
,
parts
,
convert_Etot
);
"TotEnergy"
,
FLOAT
,
1
,
UNIT_CONV_ENERGY
,
parts
,
xparts
,
convert_Etot
);
}
/**
...
...
src/hydro/Minimal/hydro.h
View file @
259be318
...
...
@@ -197,6 +197,18 @@ __attribute__((always_inline)) INLINE static float hydro_get_mass(
return
p
->
mass
;
}
/**
* @brief Sets the mass of a particle
*
* @param p The particle of interest
* @param m The mass to set.
*/
__attribute__
((
always_inline
))
INLINE
static
void
hydro_set_mass
(
struct
part
*
restrict
p
,
float
m
)
{
p
->
mass
=
m
;
}
/**
* @brief Returns the velocities drifted to the current time of a particle.
*
...
...
@@ -540,9 +552,11 @@ __attribute__((always_inline)) INLINE static void hydro_kick_extra(
*
* @param p The particle to act upon
* @param xp The extended particle to act upon
* @param cosmo The cosmological model.
*/
__attribute__
((
always_inline
))
INLINE
static
void
hydro_convert_quantities
(
struct
part
*
restrict
p
,
struct
xpart
*
restrict
xp
)
{
struct
part
*
restrict
p
,
struct
xpart
*
restrict
xp
,
const
struct
cosmology
*
cosmo
)
{
/* Compute the pressure */
const
float
pressure
=
gas_pressure_from_internal_energy
(
p
->
rho
,
p
->
u
);
...
...
@@ -580,4 +594,21 @@ __attribute__((always_inline)) INLINE static void hydro_first_init_part(
hydro_init_part
(
p
,
NULL
);
}
/**
* @brief Overwrite the initial internal energy of a particle.
*
* Note that in the cases where the thermodynamic variable is not
* internal energy but gets converted later, we must overwrite that
* field. The conversion to the actual variable happens later after
* the initial fake time-step.
*
* @param p The #part to write to.
* @param u_init The new initial internal energy.
*/
__attribute__
((
always_inline
))
INLINE
static
void
hydro_set_init_internal_energy
(
struct
part
*
p
,
float
u_init
)
{
p
->
u
=
u_init
;
}
#endif
/* SWIFT_MINIMAL_HYDRO_H */
src/hydro/Minimal/hydro_io.h
View file @
259be318
...
...
@@ -69,18 +69,20 @@ void hydro_read_particles(struct part* parts, struct io_props* list,
UNIT_CONV_DENSITY
,
parts
,
rho
);
}
void
convert_S
(
const
struct
engine
*
e
,
const
struct
part
*
p
,
float
*
ret
)
{
void
convert_S
(
const
struct
engine
*
e
,
const
struct
part
*
p
,
const
struct
xpart
*
xp
,
float
*
ret
)
{
ret
[
0
]
=
hydro_get_comoving_entropy
(
p
);
}
void
convert_P
(
const
struct
engine
*
e
,
const
struct
part
*
p
,
float
*
ret
)
{
void
convert_P
(
const
struct
engine
*
e
,
const
struct
part
*
p
,
const
struct
xpart
*
xp
,
float
*
ret
)
{
ret
[
0
]
=
hydro_get_comoving_pressure
(
p
);
}
void
convert_part_pos
(
const
struct
engine
*
e
,
const
struct
part
*
p
,
double
*
ret
)
{
const
struct
xpart
*
xp
,
double
*
ret
)
{
if
(
e
->
s
->
periodic
)
{
ret
[
0
]
=
box_wrap
(
p
->
x
[
0
],
0
.
0
,
e
->
s
->
dim
[
0
]);
...
...
@@ -93,23 +95,59 @@ void convert_part_pos(const struct engine* e, const struct part* p,
}
}
void
convert_part_vel
(
const
struct
engine
*
e
,
const
struct
part
*
p
,
const
struct
xpart
*
xp
,
float
*
ret
)
{
const
int
with_cosmology
=
(
e
->
policy
&
engine_policy_cosmology
);
const
struct
cosmology
*
cosmo
=
e
->
cosmology
;
const
integertime_t
ti_current
=
e
->
ti_current
;
const
double
time_base
=
e
->
time_base
;
const
integertime_t
ti_beg
=
get_integer_time_begin
(
ti_current
,
p
->
time_bin
);
const
integertime_t
ti_end
=
get_integer_time_end
(
ti_current
,
p
->
time_bin
);
/* Get time-step since the last kick */
float
dt_kick_grav
,
dt_kick_hydro
;
if
(
with_cosmology
)
{
dt_kick_grav
=
cosmology_get_grav_kick_factor
(
cosmo
,
ti_beg
,
ti_current
);
dt_kick_grav
-=
cosmology_get_grav_kick_factor
(
cosmo
,
ti_beg
,
(
ti_beg
+
ti_end
)
/
2
);
dt_kick_hydro
=
cosmology_get_hydro_kick_factor
(
cosmo
,
ti_beg
,
ti_current
);
dt_kick_hydro
-=
cosmology_get_hydro_kick_factor
(
cosmo
,
ti_beg
,
(
ti_beg
+
ti_end
)
/
2
);
}
else
{
dt_kick_grav
=
(
ti_current
-
((
ti_beg
+
ti_end
)
/
2
))
*
time_base
;
dt_kick_hydro
=
(
ti_current
-
((
ti_beg
+
ti_end
)
/
2
))
*
time_base
;
}
/* Extrapolate the velocites to the current time */
hydro_get_drifted_velocities
(
p
,
xp
,
dt_kick_hydro
,
dt_kick_grav
,
ret
);
/* Conversion from internal units to peculiar velocities */
ret
[
0
]
*=
cosmo
->
a2_inv
;
ret
[
1
]
*=
cosmo
->
a2_inv
;
ret
[
2
]
*=
cosmo
->
a2_inv
;
}
/**
* @brief Specifies which particle fields to write to a dataset
*
* @param parts The particle array.
* @param xparts The extended particle array.
* @param list The list of i/o properties to write.
* @param num_fields The number of i/o fields to write.
*/
void
hydro_write_particles
(
struct
part
*
parts
,
struct
io_props
*
list
,
int
*
num_fields
)
{
void
hydro_write_particles
(
const
struct
part
*
parts
,
const
struct
xpart
*
xparts
,
struct
io_props
*
list
,
int
*
num_fields
)
{
*
num_fields
=
9
;
/* List what we want to write */
list
[
0
]
=
io_make_output_field_convert_part
(
"Coordinates"
,
DOUBLE
,
3
,
UNIT_CONV_LENGTH
,
parts
,
convert_part_pos
);
list
[
1
]
=
io_make_output_field
(
"Velocities"
,
FLOAT
,
3
,
UNIT_CONV_SPEED
,
parts
,
v
);
list
[
0
]
=
io_make_output_field_convert_part
(
"Coordinates"
,
DOUBLE
,
3
,
UNIT_CONV_LENGTH
,
parts
,
xparts
,
convert_part_pos
);
list
[
1
]
=
io_make_output_field_convert_part
(
"Velocities"
,
FLOAT
,
3
,
UNIT_CONV_SPEED
,
parts
,
xparts
,
convert_part_vel
);
list
[
2
]
=
io_make_output_field
(
"Masses"
,
FLOAT
,
1
,
UNIT_CONV_MASS
,
parts
,
mass
);
list
[
3
]
=
io_make_output_field
(
"SmoothingLength"
,
FLOAT
,
1
,
UNIT_CONV_LENGTH
,
...
...
@@ -120,10 +158,11 @@ void hydro_write_particles(struct part* parts, struct io_props* list,
UNIT_CONV_NO_UNITS
,
parts
,
id
);
list
[
6
]
=
io_make_output_field
(
"Density"
,
FLOAT
,
1
,
UNIT_CONV_DENSITY
,
parts
,
rho
);
list
[
7
]
=
io_make_output_field_convert_part
(
"Entropy"
,
FLOAT
,
1
,
UNIT_CONV_ENTROPY_PER_UNIT_MASS
,
parts
,
convert_S
);
list
[
7
]
=
io_make_output_field_convert_part
(
"Entropy"
,
FLOAT
,
1
,
UNIT_CONV_ENTROPY_PER_UNIT_MASS
,
parts
,
xparts
,
convert_S
);
list
[
8
]
=
io_make_output_field_convert_part
(
"Pressure"
,
FLOAT
,
1
,
UNIT_CONV_PRESSURE
,
parts
,
convert_P
);
"Pressure"
,
FLOAT
,
1
,
UNIT_CONV_PRESSURE
,
parts
,
xparts
,
convert_P
);
}
/**
...
...
src/hydro/PressureEntropy/hydro.h
View file @
259be318
...
...
@@ -170,6 +170,18 @@ __attribute__((always_inline)) INLINE static float hydro_get_mass(
return
p
->
mass
;
}
/**
* @brief Sets the mass of a particle
*
* @param p The particle of interest
* @param m The mass to set.
*/
__attribute__
((
always_inline
))
INLINE
static
void
hydro_set_mass
(
struct
part
*
restrict
p
,
float
m
)
{
p
->
mass
=
m
;
}
/**
* @brief Returns the velocities drifted to the current time of a particle.
*
...
...
@@ -556,12 +568,16 @@ __attribute__((always_inline)) INLINE static void hydro_kick_extra(
* Requires the density to be known
*
* @param p The particle to act upon
* @param xp The extended data.
* @param cosmo The cosmological model.
*/
__attribute__
((
always_inline
))
INLINE
static
void
hydro_convert_quantities
(
struct
part
*
restrict
p
,
struct
xpart
*
restrict
xp
)
{
struct
part
*
restrict
p
,
struct
xpart
*
restrict
xp
,
const
struct
cosmology
*
cosmo
)
{
/* We read u in the entropy field. We now get S from u */
xp
->
entropy_full
=
gas_entropy_from_internal_energy
(
p
->
rho_bar
,
p
->
entropy
);
xp
->
entropy_full
=
gas_entropy_from_internal_energy
(
p
->
rho_bar
*
cosmo
->
a3_inv
,
p
->
entropy
);
p
->
entropy
=
xp
->
entropy_full
;
p
->
entropy_one_over_gamma
=
pow_one_over_gamma
(
p
->
entropy
);
...
...
@@ -605,4 +621,21 @@ __attribute__((always_inline)) INLINE static void hydro_first_init_part(
hydro_init_part
(
p
,
NULL
);
}
/**
* @brief Overwrite the initial internal energy of a particle.
*
* Note that in the cases where the thermodynamic variable is not
* internal energy but gets converted later, we must overwrite that
* field. The conversion to the actual variable happens later after
* the initial fake time-step.
*
* @param p The #part to write to.
* @param u_init The new initial internal energy.
*/
__attribute__
((
always_inline
))
INLINE
static
void
hydro_set_init_internal_energy
(
struct
part
*
p
,
float
u_init
)
{
p
->
entropy
=
u_init
;
}
#endif
/* SWIFT_PRESSURE_ENTROPY_HYDRO_H */
src/hydro/PressureEntropy/hydro_io.h
View file @
259be318
...
...
@@ -67,18 +67,20 @@ void hydro_read_particles(struct part* parts, struct io_props* list,
UNIT_CONV_DENSITY
,
parts
,
rho
);
}
void
convert_u
(
const
struct
engine
*
e
,
const
struct
part
*
p
,
float
*
ret
)
{
void
convert_u
(
const
struct
engine
*
e
,
const
struct
part
*
p
,
const
struct
xpart
*
xp
,
float
*
ret
)
{
ret
[
0
]
=
hydro_get_comoving_internal_energy
(
p
);
}
void
convert_P
(
const
struct
engine
*
e
,
const
struct
part
*
p
,
float
*
ret
)
{
void
convert_P
(
const
struct
engine
*
e
,
const
struct
part
*
p
,
const
struct
xpart
*
xp
,
float
*
ret
)
{
ret
[
0
]
=
hydro_get_comoving_pressure
(
p
);
}
void
convert_part_pos
(
const
struct
engine
*
e
,
const
struct
part
*
p
,
double
*
ret
)
{
const
struct
xpart
*
xp
,
double
*
ret
)
{
if
(
e
->
s
->
periodic
)
{
ret
[
0
]
=
box_wrap
(
p
->
x
[
0
],
0
.
0
,
e
->
s
->
dim
[
0
]);
...
...
@@ -91,6 +93,40 @@ void convert_part_pos(const struct engine* e, const struct part* p,
}
}
void
convert_part_vel
(
const
struct
engine
*
e
,
const
struct
part
*
p
,
const
struct
xpart
*
xp
,
float
*
ret
)
{
const
int
with_cosmology
=
(
e
->
policy
&
engine_policy_cosmology
);
const
struct
cosmology
*
cosmo
=
e
->
cosmology
;
const
integertime_t
ti_current
=
e
->
ti_current
;
const
double
time_base
=
e
->
time_base
;
const
integertime_t
ti_beg
=
get_integer_time_begin
(
ti_current
,
p
->
time_bin
);
const
integertime_t
ti_end
=
get_integer_time_end
(
ti_current
,
p
->
time_bin
);
/* Get time-step since the last kick */
float
dt_kick_grav
,
dt_kick_hydro
;
if
(
with_cosmology
)
{
dt_kick_grav
=
cosmology_get_grav_kick_factor
(
cosmo
,
ti_beg
,
ti_current
);
dt_kick_grav
-=
cosmology_get_grav_kick_factor
(
cosmo
,
ti_beg
,
(
ti_beg
+
ti_end
)
/
2
);
dt_kick_hydro
=
cosmology_get_hydro_kick_factor
(
cosmo
,
ti_beg
,
ti_current
);
dt_kick_hydro
-=
cosmology_get_hydro_kick_factor
(
cosmo
,
ti_beg
,
(
ti_beg
+
ti_end
)
/
2
);
}
else
{
dt_kick_grav
=
(
ti_current
-
((
ti_beg
+
ti_end
)
/
2
))
*
time_base
;
dt_kick_hydro
=
(
ti_current
-
((
ti_beg
+
ti_end
)
/
2
))
*
time_base
;
}
/* Extrapolate the velocites to the current time */
hydro_get_drifted_velocities
(
p
,
xp
,
dt_kick_hydro
,
dt_kick_grav
,
ret
);
/* Conversion from internal units to peculiar velocities */
ret
[
0
]
*=
cosmo
->
a2_inv
;
ret
[
1
]
*=
cosmo
->
a2_inv
;
ret
[