Nondimensionalization
Create a nondimensionalization object in which we specify characteristic values, which are later employed to non-dimensionalize (or dimensionalize) all model parameters. Choose between GEO, SI or NO units:
SIunits assume all input and output is inSIunits. Very general, but for typical geodynamic simulations often not so useful (as a million years has many seconds, resulting in large numbers).GEOunits usesSIunits throughout but assumes that input/output are in a format that is more convenient for typical geodynamic use cases, such asMyrs,kmorMPaNOunits are nondimensional units. Note that for parameters to be correctly non-dimensionalized in this case, you still have to indicate units (such as thatvelocityis given inm/s).
A dimensional parameter can be transformed into a non-dimensional one with Nondimensionalize.
Specify characteristic values
Characteristic values can be defined in 3 ways.
GeoParams.Units.GEO_units — FunctionGEO_units(;length=1000km, temperature=1000C, stress=10MPa, viscosity=1e20Pas)Creates a non-dimensionalization object using GEO units.
GEO units implies that upon dimensionalization, time will be in Myrs, length in km, stress in MPa, etc. which is more convenient for typical geodynamic simulations than SI units The characteristic values given as input can be in arbitrary units (km or m), provided the unit is specified.
Examples:
julia> CharUnits = GEO_units()
Employing GEO units
Characteristic values:
length: 1000 km
time: 0.3169 Myrs
stress: 10 MPa
temperature: 1000.0 °C
julia> CharUnits.velocity
1.0e-7 m s⁻¹If we instead have a crustal-scale simulation, it is likely more appropriate to use a different characteristic length:
julia> CharUnits = GEO_units(length=10km)
Employing GEO units
Characteristic values:
length: 10 km
time: 0.3169 Myrs
stress: 10 MPa
temperature: 1000.0 °CGeoParams.Units.SI_units — FunctionCharUnits = SI_units(length=1000m, temperature=1000K, stress=10Pa, viscosity=1e20)Specify the characteristic values using SI units
Examples:
julia> CharUnits = SI_units(length=1000m)
Employing SI units
Characteristic values:
length: 1000 m
time: 1.0e19 s
stress: 10 Pa
temperature: 1000.0 KNote that the same can be achieved if the input is given in km:
julia> CharUnits = SI_units(length=1km)GeoParams.Units.NO_units — FunctionCharUnits = NO_units(length=1, temperature=1, stress=1, viscosity=1)Specify the characteristic values in non-dimensional units
Examples:
julia> using GeoParams;
julia> CharUnits = NO_units()
Employing NONE units
Characteristic values:
length: 1
time: 1.0
stress: 1
temperature: 1.0(Non)-dimensionalize parameters
Once characteristic values have been defined, you can use them to non-dimensionalize or dimensionalize any parameter.
GeoParams.Units.Nondimensionalize! — FunctionNondimensionalize!(param::GeoUnit, CharUnits::GeoUnits{TYPE})Nondimensionalizes param (given as GeoUnit) using the characteristic values specified in CharUnits in-place
Example 1
julia> using GeoParams;
julia> CharUnits = GEO_units();
julia> v = GeoUnit(3cm/yr)
3 cm yr⁻¹
julia> Nondimensionalize!(v, CharUnits)
0.009506426344208684Example 2
julia> CharUnits = GEO_units();
julia> A = GeoUnit(6.3e-2MPa^-3.05*s^-1)
0.063 MPa⁻³·⁰⁵ s⁻¹
julia> A_ND = Nondimensionalize(A, CharUnits)
7.068716262102384e14Nondimensionalize!(MatParam::AbstractMaterialParam, CharUnits::GeoUnits{TYPE})Non-dimensionalizes a material parameter structure (e.g., Density, CreepLaw)
Nondimensionalize!(phase_mat::MaterialParams, g::GeoUnits{TYPE})Nondimensionalizes all fields within the Material Parameters structure that contain material parameters
GeoParams.Units.Dimensionalize! — FunctionDimensionalize!(param::GeoUnit, CharUnits::GeoUnits{TYPE})Dimensionalizes param again to the values that it used to have using the characteristic values specified in CharUnits.
Example
julia> CharUnits = GEO_units();
julia> x = GeoUnit(3cm/yr)
julia> Nondimensionalize!(x, CharUnits)
julia> Dimensionalize!(x, CharUnits)
3.0 cm yr⁻¹Dimensionalize!(MatParam::AbstractMaterialParam, CharUnits::GeoUnits{TYPE})Dimensionalizes a material parameter structure (e.g., Density, CreepLaw)
Dimensionalize!(phase_mat::MaterialParams, g::GeoUnits{TYPE})Dimensionalizes all fields within the Material Parameters structure that contain material parameters
GeoParams.Units.Nondimensionalize — FunctionNondimensionalize(param, CharUnits::GeoUnits{TYPE})Nondimensionalizes param using the characteristic values specified in CharUnits
Example 1
julia> using GeoParams;
julia> CharUnits = GEO_units();
julia> v = 3cm/yr
3 cm yr⁻¹
julia> v_ND = Nondimensionalize(v, CharUnits)
0.009506426344208684Example 2
In geodynamics one sometimes encounters more funky units
julia> CharUnits = GEO_units();
julia> A = 6.3e-2MPa^-3.05*s^-1
0.063 MPa⁻³·⁰⁵ s⁻¹
julia> A_ND = Nondimensionalize(A, CharUnits)
7.068716262102384e14In case you are interested to see how the units of A look like in different units, use this function from the Unitful package:
julia> uconvert(u"Pa^-3.05*s^-1",A)
3.157479571851836e-20 Pa⁻³·⁰⁵and to see it decomposed in the basic SI units of length, mass and time:
julia> upreferred(A)
3.1574795718518295e-20 m³·⁰⁵ s⁵·¹ kg⁻³·⁰⁵GeoParams.Units.Dimensionalize — FunctionDimensionalize(param, param_dim::Unitful.FreeUnits, CharUnits::GeoUnits{TYPE})Dimensionalizes param into the dimensions param_dim using the characteristic values specified in CharUnits.
Example
julia> CharUnits = GEO_units();
julia> v_ND = Nondimensionalize(3cm/yr, CharUnits)
0.031688087814028945
julia> v_dim = Dimensionalize(v_ND, cm/yr, CharUnits)
3.0 cm yr⁻¹GeoParams.Units.isDimensional — FunctionisDimensional(MatParam::AbstractMaterialParam)true if MatParam is in dimensional units.