Skip to content

Commit 0c18af7

Browse files
committed
New module for dualstep thermomechanical ablation simulation
1 parent 0aa5022 commit 0c18af7

File tree

5 files changed

+374
-6
lines changed

5 files changed

+374
-6
lines changed

src/HyperFSI.jl

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ export BBTMaterial, BBTMMaterial, BBTTMaterial, BBTTAMaterial, BBTMAMaterial
3131
export hsource_bc!, hsource_databc!, temperature_ic!, temperature_bc!, temperature_databc!, second_bcs!, find_sec_bcs_points
3232

3333
# Running simulations
34-
export Thermstep, Thermomechstep, Dualstep, Thermstep_ablation, Thermomechstep_ablation, Flowstep, FSI_job, FSI_submit, IBM2D, Bcstruct
34+
export Thermstep, Thermomechstep, Dualstep, Thermstep_ablation, Thermomechstep_ablation, Dualstep_ablation, Flowstep, FSI_job, FSI_submit, IBM2D, Bcstruct
3535

3636

3737
include("IBM/boundary_counter.jl")
@@ -49,13 +49,15 @@ include("structure/time_solvers/thermomechstep.jl")
4949
include("structure/time_solvers/dual_timesteps.jl")
5050
include("structure/time_solvers/thermstep_ablation.jl")
5151
include("structure/time_solvers/thermomechstep_ablation.jl")
52+
include("structure/time_solvers/dual_timesteps_ablation.jl")
5253

5354
include("structure/physics/bond_based_thermal_diffusion.jl")
5455
include("structure/physics/bond_based_thermomechanics.jl")
5556
include("structure/physics/bond_based_dualstep_thermomechanics.jl")
5657
include("structure/physics/bond_based_thermal_diffusion_temp_dependent.jl")
5758
include("structure/physics/bond_based_thermal_diffusion_ablation.jl")
5859
include("structure/physics/bond_based_thermomechanics_ablation.jl")
60+
include("structure/physics/bond_based_dualstep_thermomechanics_ablation.jl")
5961

6062
include("fluid/FlowTimesolver.jl")
6163
include("fluid/Evolution.jl")

src/coupling_solvers/FSI_submit.jl

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -316,6 +316,13 @@ function FSI_submit(job::Job, mode::String, geo::AbstractPDGeometry ; kwargs...)
316316
ret = TMA_submit_threads(job, nthreads(), geo)
317317
end
318318
return ret
319+
elseif mode == "DTMA" # dualstep_thermomech ablation in structure
320+
if Peridynamics.mpi_run()
321+
ret = DTMA_submit_mpi(job)
322+
else
323+
ret = DTMA_submit_threads(job, nthreads(), geo)
324+
end
325+
return ret
319326
end
320327
end
321328

@@ -409,6 +416,24 @@ function TMA_submit_threads(job::Job, n_chunks::Int, geo::AbstractPDGeometry)
409416
return dh
410417
end
411418

419+
function DTMA_submit_threads(job::Job, n_chunks::Int, geo::AbstractPDGeometry)
420+
421+
simulation_duration = @elapsed begin
422+
logo_init_logs(job.options)
423+
Peridynamics.log_spatial_setup(job.options, job.spatial_setup)
424+
Peridynamics.log_create_data_handler_start()
425+
dh = Peridynamics.threads_data_handler(job.spatial_setup, job.time_solver, n_chunks)
426+
Peridynamics.init_time_solver!(job.time_solver, dh)
427+
Peridynamics.initialize!(dh, job.time_solver)
428+
Peridynamics.log_create_data_handler_end()
429+
Peridynamics.log_data_handler(job.options, dh)
430+
Peridynamics.log_timesolver(job.options, job.time_solver)
431+
solve_dual_thermomech_struct_ablation!(dh, job, geo)
432+
end
433+
Peridynamics.log_simulation_duration(job.options, simulation_duration)
434+
return dh
435+
end
436+
412437
function merge_chunk(C::Peridynamics.AbstractThreadsBodyDataHandler)
413438
n = C.chunks[end].system.chunk_handler.loc_points[end]
414439
pd_out = fill(0.0, 8, n)

src/structure/physics/ablation.jl

Lines changed: 24 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -74,30 +74,49 @@ function find_new_bcs_idx(dh::Peridynamics.AbstractThreadsBodyDataHandler, index
7474
return new_add_bcs_idx, idx_map
7575
end
7676

77-
# new boundary occurs after ablation, energy from ablation is divided by neighbors!
78-
function update_new_bcs!(chunk::Peridynamics.AbstractBodyChunk, idx_map::Dict{Int, Vector{Int}}, new_ablation_point_idx::Vector{Int})
77+
# new boundary occurs after ablation, only for constant flux q_const!
78+
function update_new_bcs_q!(chunk::Peridynamics.AbstractBodyChunk, idx_map::Dict{Int, Vector{Int}}, new_ablation_point_idx::Vector{Int})
7979

8080
for id in new_ablation_point_idx
8181
ids_new_bcs = idx_map[id]
82-
energy_add_aver = 0.0
82+
q_const = zeros(1,1)
8383
if length(ids_new_bcs) > 0
84-
energy_add_aver = chunk.paramsetup.energy
84+
q_const = chunk.storage.hsource[1, id]
85+
chunk.storage.hsource[1, id] .= 0.0
8586

8687
for j in intersect(ids_new_bcs, chunk.system.chunk_handler.loc_points)
8788
j_ch = chunk.system.chunk_handler.localizer[j]
88-
chunk.storage.hsource[1, j_ch] = energy_add_aver
89+
chunk.storage.hsource[1, j_ch] = q_const
8990
end
9091
end
9192
end
9293
end
9394

95+
# ablation energy source
9496
function update_new_bcs!(chunk::Peridynamics.AbstractBodyChunk, new_add_bcs_idx::Vector{Int})
9597

9698
for id in intersect(new_add_bcs_idx, chunk.system.chunk_handler.loc_points)
9799
i_ch = chunk.system.chunk_handler.localizer[id]
98100
chunk.storage.hsource[1, i_ch] = chunk.paramsetup.energy
99101
end
100102
end
103+
104+
# new boundary occurs after ablation, only for constant pressure p_const!
105+
function update_new_bcs_f!(chunk::Peridynamics.AbstractBodyChunk, idx_map::Dict{Int, Vector{Int}}, new_ablation_point_idx::Vector{Int})
106+
for id in new_ablation_point_idx
107+
ids_new_bcs = idx_map[id]
108+
p_const = zeros(3, 1)
109+
if length(ids_new_bcs) > 0
110+
p_const = chunk.storage.b_ext[:, id]
111+
chunk.storage.b_ext[:, id] .= 0.0
112+
113+
for j in intersect(ids_new_bcs, chunk.system.chunk_handler.loc_points)
114+
j_ch = chunk.system.chunk_handler.localizer[j]
115+
chunk.storage.b_ext[:, j_ch] = p_const
116+
end
117+
end
118+
end
119+
end
101120
#=
102121
function find_neighbors_indices(position::Matrix{Float64}, new_ablation_point_idx::Vector{Int}, radius::Float64)
103122
nhs = GridNeighborhoodSearch{3}(search_radius=radius, n_points=size(position, 2))
Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
"""
2+
Bond-Based dualstep_thermomechanics Module with Temperature-Dependent Properties and Ablation
3+
4+
This module extends the bond-based dualstep_thermomechanics model
5+
by incorporating Ablation Behavior.
6+
7+
··This module provides functionality for ablation, primarily for material point removal.
8+
··Uses an 'exist' state to indicate ablation status, which relates to ablation amount.
9+
··Specific chemical processes are configured in the ablation file, with flexible complexity.
10+
··Core functionality identifies new boundary points,
11+
and more critically, establishes new watertight boundaries for subsequent fluid-structure interaction.
12+
··Ablated points can be modeled to describe subsequent effects.
13+
··The variation of properties with temperature is under consideration.
14+
15+
··Basically, Materials model are as same as BBTMAMaterial, only times itergral is different.
16+
"""
17+
function Peridynamics.init_field_solver(::Dualstep_ablation, system::Peridynamics.AbstractSystem, ::Val{:position})
18+
return copy(system.position)
19+
end
20+
21+
function Peridynamics.init_field_solver(::Dualstep_ablation, system::Peridynamics.AbstractSystem, ::Val{:displacement})
22+
return zeros(3, Peridynamics.get_n_loc_points(system))
23+
end
24+
25+
function Peridynamics.init_field_solver(::Dualstep_ablation, system::Peridynamics.AbstractSystem, ::Val{:velocity})
26+
return zeros(3,size(system.position, 2))
27+
end
28+
29+
function Peridynamics.init_field_solver(::Dualstep_ablation, system::Peridynamics.AbstractSystem, ::Val{:velocity_half})
30+
return zeros(3, Peridynamics.get_n_loc_points(system))
31+
end
32+
33+
function Peridynamics.init_field_solver(::Dualstep_ablation, system::Peridynamics.AbstractSystem, ::Val{:velocity_half_old})
34+
return zeros(3, Peridynamics.get_n_loc_points(system))
35+
end
36+
37+
function Peridynamics.init_field_solver(::Dualstep_ablation, system::Peridynamics.AbstractSystem, ::Val{:acceleration})
38+
return zeros(3, Peridynamics.get_n_loc_points(system))
39+
end
40+
41+
function Peridynamics.init_field_solver(::Dualstep_ablation, system::Peridynamics.AbstractSystem, ::Val{:b_int})
42+
return zeros(3, Peridynamics.get_n_loc_points(system))
43+
end
44+
45+
function Peridynamics.init_field_solver(::Dualstep_ablation, system::Peridynamics.AbstractSystem, ::Val{:b_int_old})
46+
return zeros(3, Peridynamics.get_n_loc_points(system))
47+
end
48+
49+
function Peridynamics.init_field_solver(::Dualstep_ablation, system::Peridynamics.AbstractSystem, ::Val{:b_ext})
50+
return zeros(3, Peridynamics.get_n_loc_points(system))
51+
end
52+
53+
function Peridynamics.init_field_solver(::Dualstep_ablation, system::Peridynamics.AbstractSystem, ::Val{:density_matrix})
54+
return zeros(3, Peridynamics.get_n_loc_points(system))
55+
end
56+
57+
function Peridynamics.init_field_solver(::Dualstep_ablation, system::Peridynamics.AbstractSystem, ::Val{:temperature})
58+
return zeros(1, Peridynamics.size(system.position, 2))
59+
end
60+
61+
function Peridynamics.init_field_solver(::Dualstep_ablation, system::Peridynamics.AbstractSystem, ::Val{:pflux})
62+
return zeros(1, Peridynamics.get_n_loc_points(system))
63+
end
64+
65+
function Peridynamics.init_field_solver(::Dualstep_ablation, system::Peridynamics.AbstractSystem, ::Val{:hsource})
66+
return zeros(1, Peridynamics.get_n_loc_points(system))
67+
end
68+
69+
function Peridynamics.init_field_solver(::Dualstep_ablation, system::Peridynamics.AbstractSystem, ::Val{:ablation_deep})
70+
return zeros(1, Peridynamics.get_n_loc_points(system))
71+
end
72+
73+
function Peridynamics.init_field_solver(::Dualstep_ablation, system::Peridynamics.AbstractSystem, ::Val{:exist})
74+
return ones(Int, 1, size(system.position, 2))
75+
end
76+
77+
78+
79+
80+

0 commit comments

Comments
 (0)