80 lines
3.2 KiB
Julia
80 lines
3.2 KiB
Julia
# Simulation.jl
|
|
# API of Simulation class, that holds all information regarding a
|
|
# specific simulation run like its timestep, number of iterations and output
|
|
# options. Simulation object also holds a predefined Grid and Boundary object.
|
|
# Translated from C++'s Simulation.hpp.
|
|
|
|
struct Simulation{T} <: AbstractSimulation{T}
|
|
grid::Grid{T}
|
|
bc::Boundary{T}
|
|
approach::APPROACH
|
|
|
|
iterations::Int
|
|
timestep::T
|
|
|
|
consoleOutput::CONSOLE_OUTPUT
|
|
csvOutput::CSV_OUTPUT
|
|
|
|
# Constructor
|
|
function Simulation(grid::Grid{T}, bc::Boundary{T}, approach::APPROACH=BTCS, iterations::Int=1, timestep::T=0.1,
|
|
consoleOutput::CONSOLE_OUTPUT=CONSOLE_OUTPUT_OFF, csvOutput::CSV_OUTPUT=CSV_OUTPUT_OFF) where {T}
|
|
new{T}(grid, bc, approach, iterations, timestep, consoleOutput, csvOutput)
|
|
end
|
|
end
|
|
|
|
function run(simulation::Simulation{T}) where {T}
|
|
file = nothing
|
|
try
|
|
if simulation.csvOutput > CSV_OUTPUT_OFF
|
|
file = createCSVfile(simulation)
|
|
end
|
|
|
|
function simulationStepCallback()
|
|
if simulation.consoleOutput >= CONSOLE_OUTPUT_VERBOSE
|
|
writeConcentrationsToCLI(simulation)
|
|
end
|
|
if simulation.csvOutput >= CSV_OUTPUT_VERBOSE
|
|
writeConcentrationsToCSV(file, simulation)
|
|
end
|
|
end
|
|
|
|
if simulation.approach == BTCS
|
|
runBTCS(simulation.grid, simulation.bc, simulation.timestep, simulation.iterations, simulationStepCallback)
|
|
elseif simulation.approach == FTCS
|
|
timestep, iterations = adjustTimestep(simulation.grid, simulation.approach, simulation.timestep, simulation.iterations, simulation.consoleOutput >= CONSOLE_OUTPUT_VERBOSE)
|
|
runFTCS(simulation.grid, simulation.bc, timestep, iterations, simulationStepCallback)
|
|
else
|
|
error("Undefined approach!")
|
|
end
|
|
|
|
if simulation.consoleOutput >= CONSOLE_OUTPUT_ON
|
|
writeConcentrationsToCLI(simulation)
|
|
end
|
|
|
|
if simulation.csvOutput >= CSV_OUTPUT_ON
|
|
writeConcentrationsToCSV(file, simulation)
|
|
end
|
|
|
|
finally
|
|
if file !== nothing
|
|
close(file)
|
|
end
|
|
end
|
|
end
|
|
|
|
function setIterations(simulation::Simulation{T}, iterations::Int)::Simulation{T} where {T}
|
|
return Simulation(simulation.grid, simulation.bc, simulation.approach, iterations, simulation.timestep, simulation.consoleOutput, simulation.csvOutput)
|
|
end
|
|
|
|
function setOutputConsole(simulation::Simulation{T}, consoleOutput::CONSOLE_OUTPUT)::Simulation{T} where {T}
|
|
return Simulation(simulation.grid, simulation.bc, simulation.approach, simulation.iterations, simulation.timestep, consoleOutput, simulation.csvOutput)
|
|
end
|
|
|
|
function setOutputCSV(simulation::Simulation{T}, csvOutput::CSV_OUTPUT)::Simulation{T} where {T}
|
|
return Simulation(simulation.grid, simulation.bc, simulation.approach, simulation.iterations, simulation.timestep, simulation.consoleOutput, csvOutput)
|
|
end
|
|
|
|
function setTimestep(simulation::Simulation{T}, timestep::T)::Simulation{T} where {T}
|
|
return Simulation(simulation.grid, simulation.bc, simulation.approach, simulation.iterations, timestep, simulation.consoleOutput, simulation.csvOutput)
|
|
end
|