11@doc raw """
22 InitialCondition(; coordinates, density, velocity=zeros(size(coordinates, 1)),
3- mass=nothing, pressure=0.0, particle_spacing=-1.0,
4- angular_velocity=nothing)
3+ mass=nothing, pressure=0.0, particle_spacing=-1.0)
54
65Struct to hold the initial configuration of the particles.
76
@@ -39,15 +38,9 @@ with `TrixiParticles.TriangleMesh` and `TrixiParticles.Polygon` returned by [`lo
3938- `particle_spacing`: The spacing between the particles. This is a scalar, as the spacing
4039 is assumed to be uniform. This is only needed when using
4140 set operations on the `InitialCondition` or for automatic mass calculation.
42- - `angular_velocity`: Initial angular velocity `ω` of the shape (not angular momentum).
43- It adds a rotational contribution to `velocity` around the center of mass of the shape.
44- If both `velocity` and `angular_velocity` are set, they are added.
45- In 2D, pass a scalar angular speed in rad/s.
46- In 3D, pass a vector of length 3: its direction is the rotation axis
47- (right-hand rule), its norm `|ω|` is the angular speed in rad/s.
48- The resulting local rotational velocity is `v = ω × r`, i.e., motion in
49- planes normal to the rotation axis.
50- By default, angular velocity is zero.
41+
42+ To add a rotational contribution to an existing initial condition, use
43+ [`apply_angular_velocity`](@ref).
5144
5245# Examples
5346```jldoctest; output = false
@@ -101,33 +94,28 @@ initial_condition = InitialCondition(; coordinates, velocity=x -> 2x, mass=1.0,
10194└──────────────────────────────────────────────────────────────────────────────────────────────────┘
10295```
10396"""
104- struct InitialCondition{ELTYPE, C, MATRIX, VECTOR, AV }
97+ struct InitialCondition{ELTYPE, C, MATRIX, VECTOR}
10598 particle_spacing :: ELTYPE
10699 coordinates :: C # Array{coordinates_eltype, 2}
107100 velocity :: MATRIX # Array{ELTYPE, 2}
108101 mass :: VECTOR # Array{ELTYPE, 1}
109102 density :: VECTOR # Array{ELTYPE, 1}
110103 pressure :: VECTOR # Array{ELTYPE, 1}
111- angular_velocity :: AV
112104end
113105
114106# The default constructor needs to be accessible for Adapt.jl to work with this struct.
115107# See the comments in general/gpu.jl for more details.
116108function InitialCondition (; coordinates, density, velocity= zeros (size (coordinates, 1 )),
117- mass= nothing , pressure= 0.0 , particle_spacing= - 1.0 ,
118- angular_velocity= nothing , apply_angular_velocity= true )
109+ mass= nothing , pressure= 0.0 , particle_spacing= - 1.0 )
119110 NDIMS = size (coordinates, 1 )
120111
121112 return InitialCondition {NDIMS} (coordinates, velocity, mass, density,
122- pressure, particle_spacing, angular_velocity;
123- apply_angular_velocity)
113+ pressure, particle_spacing)
124114end
125115
126116# Function barrier to make `NDIMS` static and therefore SVectors type-stable
127117function InitialCondition {NDIMS} (coordinates, velocity, mass, density,
128- pressure, particle_spacing,
129- angular_velocity;
130- apply_angular_velocity= true ) where {NDIMS}
118+ pressure, particle_spacing) where {NDIMS}
131119 if ! (particle_spacing isa AbstractFloat)
132120 throw (ArgumentError (" particle spacing must be a floating point number. " *
133121 " The type of the particle spacing determines the eltype " *
@@ -137,13 +125,10 @@ function InitialCondition{NDIMS}(coordinates, velocity, mass, density,
137125 # The arguments can all be functions, so use `particle_spacing` for the eltype
138126 ELTYPE = typeof (particle_spacing)
139127 n_particles = size (coordinates, 2 )
140- angular_velocity_ = convert_initial_angular_velocity (angular_velocity, Val (NDIMS),
141- ELTYPE)
142128
143129 if n_particles == 0
144130 return InitialCondition (particle_spacing, coordinates, zeros (ELTYPE, NDIMS, 0 ),
145- zeros (ELTYPE, 0 ), zeros (ELTYPE, 0 ), zeros (ELTYPE, 0 ),
146- angular_velocity_)
131+ zeros (ELTYPE, 0 ), zeros (ELTYPE, 0 ), zeros (ELTYPE, 0 ))
147132 end
148133
149134 # SVector of coordinates to pass to functions.
@@ -216,14 +201,9 @@ function InitialCondition{NDIMS}(coordinates, velocity, mass, density,
216201 end
217202
218203 velocities_ = ELTYPE .(velocities)
219- if apply_angular_velocity
220- add_initial_angular_velocity! (velocities_, coordinates, masses, angular_velocity_,
221- Val (NDIMS), ELTYPE)
222- end
223204
224205 return InitialCondition (particle_spacing, coordinates, velocities_,
225- ELTYPE .(masses), ELTYPE .(densities), ELTYPE .(pressures),
226- angular_velocity_)
206+ ELTYPE .(masses), ELTYPE .(densities), ELTYPE .(pressures))
227207end
228208
229209@inline function convert_initial_angular_velocity (:: Nothing , :: Val{NDIMS} ,
@@ -343,6 +323,33 @@ function add_initial_angular_velocity!(velocities, coordinates, mass,
343323 return velocities
344324end
345325
326+ @doc raw """
327+ apply_angular_velocity(initial_condition::InitialCondition, angular_velocity)
328+
329+ Return a new [`InitialCondition`](@ref) whose velocity includes the rotational
330+ contribution `v = ω × r` around the center of mass of `initial_condition`.
331+
332+ In 2D, pass a scalar angular speed in rad/s.
333+ In 3D, pass a vector of length 3 whose direction gives the rotation axis
334+ (right-hand rule) and whose norm `|ω|` gives the angular speed in rad/s.
335+ """
336+ function apply_angular_velocity (initial_condition:: InitialCondition , angular_velocity)
337+ NDIMS = ndims (initial_condition)
338+ ELTYPE = eltype (initial_condition)
339+ angular_velocity_ = convert_initial_angular_velocity (angular_velocity, Val (NDIMS),
340+ ELTYPE)
341+ velocity = copy (initial_condition. velocity)
342+
343+ add_initial_angular_velocity! (velocity, initial_condition. coordinates,
344+ initial_condition. mass, angular_velocity_,
345+ Val (NDIMS), ELTYPE)
346+
347+ return InitialCondition (initial_condition. particle_spacing,
348+ initial_condition. coordinates, velocity,
349+ initial_condition. mass, initial_condition. density,
350+ initial_condition. pressure)
351+ end
352+
346353function Base. show (io:: IO , ic:: InitialCondition )
347354 @nospecialize ic # reduce precompilation time
348355
@@ -423,9 +430,7 @@ function Base.union(initial_condition::InitialCondition, initial_conditions...)
423430 pressure = vcat (initial_condition. pressure, ic. pressure[valid_particles])
424431
425432 result = InitialCondition {ndims(ic)} (coordinates, velocity, mass, density, pressure,
426- particle_spacing,
427- initial_condition. angular_velocity;
428- apply_angular_velocity= false )
433+ particle_spacing)
429434
430435 return union (result, Base. tail (initial_conditions)... )
431436end
@@ -460,9 +465,7 @@ function Base.setdiff(initial_condition::InitialCondition, initial_conditions...
460465 pressure = initial_condition. pressure[valid_particles]
461466
462467 result = InitialCondition {ndims(ic)} (coordinates, velocity, mass, density, pressure,
463- particle_spacing,
464- initial_condition. angular_velocity;
465- apply_angular_velocity= false )
468+ particle_spacing)
466469
467470 return setdiff (result, Base. tail (initial_conditions)... )
468471end
@@ -496,9 +499,7 @@ function Base.intersect(initial_condition::InitialCondition, initial_conditions.
496499 pressure = initial_condition. pressure[too_close]
497500
498501 result = InitialCondition {ndims(ic)} (coordinates, velocity, mass, density, pressure,
499- particle_spacing,
500- initial_condition. angular_velocity;
501- apply_angular_velocity= false )
502+ particle_spacing)
502503
503504 return intersect (result, Base. tail (initial_conditions)... )
504505end
@@ -533,8 +534,7 @@ function InitialCondition(sol::ODESolution, system, semi; use_final_velocity=fal
533534 end
534535
535536 return InitialCondition {ndims(ic)} (coordinates, velocity, mass, density, pressure,
536- ic. particle_spacing, ic. angular_velocity;
537- apply_angular_velocity= false )
537+ ic. particle_spacing)
538538end
539539
540540# Find particles in `coords1` that are closer than `max_distance` to any particle in `coords2`
0 commit comments