Source code for jf1uids.fluid_equations.registered_variables

from typing import NamedTuple

import jax.numpy as jnp

from jaxtyping import Array, Float, Int

from typing import Union

from jf1uids.option_classes.simulation_config import SimulationConfig

[docs] class StaticIntVector(NamedTuple): x: int y: int z: int
[docs] class RegisteredVariables(NamedTuple): """The registered variables are the variables that are stored in the state array. The order of the variables in the state array is important and should be consistent throughout the code. """ #: Number of variables num_vars: int = 3 # Baseline variables #: Density index density_index: int = 0 #: Velocity index velocity_index: Union[int, StaticIntVector] = 1 # in e.g. 3D, we have three velocity components, each with its own index #: Magnetic field index magnetic_index: Union[int, StaticIntVector] = -1 #: Energy index pressure_index: int = 2 # Additional variables, these # have to be registered #: stellar wind density index wind_density_index: int = -1 wind_density_active: bool = False #: simplified cosmic rays # in the simplest CR model witout CR diffusion, # streaming and no explicitly modeled magnetic field # n_CR = P_CR^(1/gamma_CR) is a conserved quantity. # This is the cosmic_ray_n, the index below points to. cosmic_ray_n_index: int = -1 cosmic_ray_n_active: bool = False
# here you can add more variables
[docs] def get_registered_variables(config: SimulationConfig) -> RegisteredVariables: """Get the registered variables for the simulation. Args: config: The simulation configuration. Returns: The registered variables. """ registered_variables = RegisteredVariables() if config.dimensionality == 2: # we have two velocity components registered_variables = registered_variables._replace(num_vars = registered_variables.num_vars + 1) # update the velocity index registered_variables = registered_variables._replace(velocity_index = StaticIntVector(1, 2, -1)) # TODO: unified MHD approach in 1D/2D/3D # magnetic field index if config.mhd: # TODO: better indexing registered_variables = registered_variables._replace(pressure_index = 3) registered_variables = registered_variables._replace(magnetic_index = StaticIntVector(4, 5, 6)) registered_variables = registered_variables._replace(num_vars = registered_variables.num_vars + 3) else: # update the pressure index registered_variables = registered_variables._replace(pressure_index = registered_variables.num_vars - 1) if config.dimensionality == 3: # we have three velocity components registered_variables = registered_variables._replace(num_vars = registered_variables.num_vars + 2) # update the velocity index to be an array registered_variables = registered_variables._replace(velocity_index = StaticIntVector(1, 2, 3)) # update the pressure index registered_variables = registered_variables._replace(pressure_index = registered_variables.num_vars - 1) if config.wind_config.trace_wind_density: registered_variables = registered_variables._replace(wind_density_index = registered_variables.num_vars) registered_variables = registered_variables._replace(num_vars = registered_variables.num_vars + 1) registered_variables = registered_variables._replace(wind_density_active = True) if config.simplified_cosmic_rays: registered_variables = registered_variables._replace(cosmic_ray_n_index = registered_variables.num_vars) registered_variables = registered_variables._replace(num_vars = registered_variables.num_vars + 1) registered_variables = registered_variables._replace(cosmic_ray_n_active = True) # here you can register more variables return registered_variables