anharmonic
The anharmonic method handles the calulation of unrelaxed shear and bulk modulus at elevated temperature and pressure as well as unrelaxed shear and compressional wave velocities. Note that you can also chose to directly set the shear and bulk modulus at the temperature and pressure of interest (see below).
The anharmonic scaling is a simple linear (or polynomial) fit utilizing coefficients for the temperature and pressure derivatives with respect to temperature and pressure.
Requires
VBR.in.SV.T_K
temperature in degrees KVBR.in.SV.GPa
pressure in GPaVBR.in.SV.rho
density in kg m-3
Calling Procedure
% set required state variables
clear
VBR.in.SV.T_K = linspace(800,1200,10)+273; % temperature [K]
VBR.in.SV.P_GPa = 2 * ones(size(VBR.in.SV.T_K)); % pressure [GPa]
VBR.in.SV.rho = 3300 * ones(size(VBR.in.SV.T_K)); % density [kg m^-3]
% add to elastic methods list
VBR.in.elastic.methods_list={'anharmonic'};
% call VBR_spine
[VBR] = VBR_spine(VBR) ;
Output
Output is stored in VBR.out.elastic.anharmonic
:
>> disp(fieldnames(VBR.out.elastic.anharmonic))
{
[1,1] = Gu % unrelaxed shear modulus at desired P,T
[2,1] = Ku % unrelaxed bulk modulus at desired P,T
[3,1] = Vpu % unrelaxed compressional wave velocity
[4,1] = Vsu % unrelaxed shear wave velocity
}
Additionally, the unrelaxed modulus at reference conditions is returned in VBR.out.elastic.Gu_0
as an array that is the same size as the input state variables in VBR.in.SV
.
Parameters
Some important parameters are
VBR.in.elastic.anharmonic.T_K_ref
: reference temperature in KVBR.in.elastic.anharmonic.P_Pa_ref
: reference temperature in PaVBR.in.elastic.anharmonic.Gu_0_ol
: reference unrelaxed olivine modulus in GPa at reference T, P.VBR.in.elastic.anharmonic.reference_scaling
: the reference scaling structure to use (optional, see below)VBR.in.elastic.anharmonic.temperature_scaling
: the temperature scaling to use (optional,see below)VBR.in.elastic.anharmonic.pressure_scaling
: the pressure scaling to use (optional,see below)
Default values for reference temperature and pressure are surface conditions.
To view the full list of parameters,
VBR.in.elastic.anharmonic = Params_Elastic('anharmonic');
disp(VBR.in.elastic.anharmonic)
overriding default values
To set any parameter to a non-default value, simply set the field before calling VBR_spine
:
VBR.in.SV=struct();
VBR.in.SV.T_K = linspace(800,1200,10)+273; % temperature [K]
VBR.in.SV.P_GPa = 2 * ones(size(VBR.in.SV.T_K)); % pressure [GPa]
VBR.in.SV.rho = 3300 * ones(size(VBR.in.SV.T_K)); % density [kg m^-3]
% add to elastic methods list
VBR.in.elastic.methods_list={'anharmonic'};
% adjust parameters
VBR.in.elastic.anharmonic.Gu_0_ol=74; % set a different reference modulus
% use Isaak and Abramson for temperature, pressure scaling respectively
VBR.in.elastic.anharmonic.temperature_scale = 'isaak';
VBR.in.elastic.anharmonic.pressure_scale = 'abramson';
% call VBR_spine
[VBR] = VBR_spine(VBR) ;
Temperature and Pressure Scaling
To check the available pressure scaling that you can use for VBR.in.elastic.anharmonic.pressure_scaling
:
VBR.in.elastic.anharmonic = Params_Elastic('anharmonic');
disp(VBR.in.elastic.anharmonic.available_pressure_scaling)
{
[1,1] = cammarano
[2,1] = abramson
[3,1] = upper_mantle
}
To check the available temperature scaling that you can use for VBR.in.elastic.anharmonic.temperature_scaling
:
disp(VBR.in.elastic.anharmonic.available_temperature_scaling)
{
[1,1] = isaak
[2,1] = cammarano
[3,1] = upper_mantle
}
You can check the individual values of anharmonic derivatives for the above scalings (including citations
fields) by accessing their respective structures, e.g., VBR.in.elastic.anharmonic.isaak
.
For both pressure and temperature scalings, the 'upper_mantle'
scaling includes anharmonic derivatives for a representative pyrolitic composition calculated from Abers and Hacker 2016.
the Reference Modulus
The VBR Calculator does not calculate unrelaxed moduli for various compositions. It is expected that the user will have some other means of setting an appropriate modulus value. The user may set VBR.in.elastic.anharmonic.Gu_0_ol
to any value they see fit, with the warning that the anelastic scalings implemented here are derived from studies on either olivine or olivine-like materials (i.e., borneol) and hence it is not certain whether the fitting parameters used are appropriate for assemblages where that assumption fails.
upper mantle reference
Given the above caveat, the VBRc does provide represenative values of moduli and their anharmonic derivatives for a pyrolitic composition calculated from Abers and Hacker 2016. You can enable it by setting the ``VBR.in.elastic.anharmonic.reference_scaling to
‘upper_mantle’ (or the name of a custom structure that includes the expected fields). Valid built-in options for the
reference_scaling` are:
disp(VBR.in.elastic.anharmonic.available_reference_scaling)
{
[1,1] = default
[2,1] = upper_mantle
}
If set to default
(which is the default behavior…), then the top level reference moduli in VBR.in.elastic.anharmonic
will be used.
Gu_0_crust
Additionally, there is a parameter structure for a crustal modulus, VBR.in.elastic.anharmonic.crust
that includes some anorthite-like values for shear
and bulk moduli and their respective temperature and pressure derivatives. This parameter allows calculation of more realistic velocity profiles in the crust and uppermost mantle at low temperatures below where anelastic affects are negligible but where having some velocity values may be useful for comparing to observed velocities.
The effective unrelexed modulus is calculated as a linear mixture of the crustal and olivine endmember moduli
at temperature and pressure of interest with the compositional fraction set by VBR.in.SV.chi
, with a value of 1 for pure olivine, e.g.,:
Gu = Gu_ol .* VBR.in.SV.chi + (1-VBR.in.SV.chi) .* Gu_crust;
If VBR.in.SV.chi
is not set by the user, then VBR.in.SV.chi
is initialized to a value of 1 everywhere, which corresponds to having no effect. You can also trun this off entirely by setting VBR.in.elastic.anharmonic.chi_mixing=0
.
Thus, to produce depth profiles, the state variable arrays should correspond to some depth dependence. For an example, see Projects/vbr_core_examples/CB_008_anharmonic_Guo.m
and Projects/vbr_core_examples/CB_012_simple_crust.m
.
Setting unrelaxed moduli at T, P directly
The VBRc relies on a simple linear calculation of the unrelaxed moduli at the temperature and pressure of interest. It is possible, however, to load in unrelaxed moduli calculated with other programs (like. e.g., Perplex). To do so, you can set the following fields:
VBR.in.elastic.Gu_TP = ...
VBR.in.elastic.Ku_TP = ...
Both Gu_TP
and Ku_TP
should be arrays of the same shape as the state variable
arrays. When these fields are present, the anharmonic calculation will simply read
from these fields, allowing you to set their values in any way you see fit (e.g.,
reading from Perplex output or calling your own functions). If you set only the
shear modulus, the bulk modulus will be calculated with the standard anharmonic
method.
Custom Temperature and Pressure Scaling
In addition to using the defined scaling structures, you can define your own! The following code snippet
creates a new scaling structure, my_custom_scaling
, that defines all the fields expected for an
anharmonic scaling structure and then adds it to the anharmonic input structure and tells the VBRc to use
it:
% write method list
VBR.in.elastic.methods_list={'anharmonic'};
% create a structure containing the anharmonic derivatives for
% the shear and bulk moduli. Must define all of these fields.
% The pressure scaling has an optional second derivative, set
% to 0 to use a linear scaling. The structure can have any name.
my_custom_scaling.dG_dT = -10 *1e6; % Pa/K
my_custom_scaling.dG_dP = 2; % Pa/Pa
my_custom_scaling.dG_dP2 = 0;
my_custom_scaling.dK_dT = 1.2 * my_custom_scaling.dG_dT;
my_custom_scaling.dK_dP = 3 * my_custom_scaling.dG_dP;
my_custom_scaling.dK_dP2 = 0;
% add the structure to the anharmonic input structure
VBR.in.elastic.anharmonic.my_custom_scaling = my_custom_scaling;
% tell the VBRc to use the custom scaling for anharmonic
% temperature and pressure dependence.
VBR.in.elastic.anharmonic.temperature_scaling = 'my_custom_scaling';
VBR.in.elastic.anharmonic.pressure_scaling = 'my_custom_scaling';
Additionally, if you include the following fields: Gu_0
, Ku_0
, P_ref_Pa
, T_ref_K
then you can
use the structure with the VBR.in.elastic.anharmonic.reference_scaling
specification.