예제 #1
0
def make_snowpack(thickness, microstructure_model, density,
                  interface=None,
                  surface=None,
                  substrate=None,
                  atmosphere=None,
                  **kwargs):
    """
    build a multi-layered snowpack. Each parameter can be an array, list or a constant value.

    :param thickness: thicknesses of the layers in meter (from top to bottom). The last layer thickness can be "numpy.inf"
    for a semi-infinite layer.
    :param microstructure_model: microstructure_model to use (e.g. sticky_hard_spheres or independent_sphere or exponential).
    :param surface: type of surface interface, flat/fresnel is the default.  If surface and interface are both set,
    the interface must be a constant refering to all the "internal" interfaces.
    :param interface: type of interface, flat/fresnel is the default. It is usually a string for the interfaces
    without parameters (e.g. Flat or Transparent) or is created with :py:func:`~smrt.core.interface.make_interface` in more complex cases.
    Interface can be a constant or a list. In the latter case, its length must be the same as the number of layers,
    and interface[0] refers to the surface interface.
    :param density: densities of the layers.
    :param substrate: set the substrate of the snowpack. Another way to add a substrate is to use the + operator
    (e.g. snowpack + substrate).
    :param **kwargs: All the other parameters (temperature, microstructure parameters, emmodel, etc.) are given as optional arguments
    (e.g. temperature=[270, 250]).
    They are passed for each layer to the function :py:func:`~smrt.inputs.make_medium.make_snow_layer`.
    Thus, the documentation of this function is the reference. It describes precisely the available parameters.
    The microstructure parameter(s) depend on the microstructure_model used and is documented in each microstructure_model module.

    e.g.::

        sp = make_snowpack([1, 10], "exponential", density=[200,300], temperature=[240, 250], corr_length=[0.2e-3, 0.3e-3])

"""

    sp = Snowpack(substrate=substrate, atmosphere=atmosphere)

    if not isinstance(thickness, collections.abc.Iterable):
        raise SMRTError("The thickness argument must be iterable, that is, a list of numbers, numpy array or pandas Series or DataFrame.")

    lib.check_argument_size(density, len(thickness), "density")
    lib.check_argument_size(kwargs, len(thickness))

    if surface is not None and lib.is_sequence(interface):
        raise SMRTError("Setting both 'surface' and 'interface' arguments is ambiguous when inteface is a list or any sequence.")

    for i, dz in enumerate(thickness):
        layer = make_snow_layer(dz, lib.get(microstructure_model, i, "microstructure_model"),
                                density=lib.get(density, i, "density"),
                                **lib.get(kwargs, i))

        # add the interface
        linterface = lib.get(interface, i, "interface") if (i > 0) or (surface is None) else surface
        sp.append(layer, interface=make_interface(linterface))

    return sp
예제 #2
0
def make_snowpack(thickness,
                  microstructure_model,
                  density,
                  interface=None,
                  substrate=None,
                  **kwargs):
    """
    build a multi-layered snowpack. Each parameter can be an array, list or a constant value.

    :param thickness: thicknesses of the layers in meter (from top to bottom). The last layer thickness can be "numpy.inf" for a semi-infinite layer.
    :param microstructure_model: microstructure_model to use (e.g. sticky_hard_spheres or independent_sphere or exponential).
    :param interface: type of interface, flat/fresnel is the default.
    :param density: densities of the layers.
    :param substrate: set the substrate of the snowpack. Another way to add a substrate is to use the + operator (e.g. snowpack + substrate).
    All the other parameters (temperature, microstructure parameters, emmodel, etc, etc) are given as optional arguments (e.g. temperature=[270, 250]).
    They are passed for each layer to the function :py:func:`~smrt.inputs.make_medium.make_snow_layer`. Thus, the documentation of this function is the reference. It describes precisely the available parameters.
    The microstructure parameter(s) depend on the microstructure_model used and is documented in each microstructure_model module.

    e.g.::

        sp = make_snowpack([1, 10], "exponential", density=[200,300], temperature=[240, 250], corr_length=[0.2e-3, 0.3e-3])

"""

    sp = Snowpack(substrate=substrate)

    if not isinstance(thickness, collections.Iterable):
        raise SMRTError(
            "The thickness argument must be iterable, that is, a list of numbers, numpy array or pandas Series or DataFrame."
        )

    lib.check_argument_size(density, len(thickness), "density")
    lib.check_argument_size(kwargs, len(thickness))

    for i, dz in enumerate(thickness):
        layer = make_snow_layer(dz,
                                lib.get(microstructure_model, i,
                                        "microstructure_model"),
                                density=lib.get(density, i, "density"),
                                **lib.get(kwargs, i))

        # add the interface
        sp.append(layer,
                  interface=make_interface(lib.get(interface, i, "interface")))

    return sp
예제 #3
0
def make_generic_stack(thickness,
                       temperature=273,
                       ks=0,
                       ka=0,
                       effective_permittivity=1,
                       interface=None,
                       substrate=None,
                       atmosphere=None):
    """
    build a multi-layered medium with prescribed scattering and absorption coefficients and effective permittivity. Must be used with presribed_kskaeps emmodel.

    :param thickness: thicknesses of the layers in meter (from top to bottom). The last layer thickness can be "numpy.inf" for a semi-infinite layer.
    :param temperature: temperature of layers in K
    :param ks: scattering coefficient of layers in m^-1
    :param ka: absorption coefficient of layers in m^-1
    :param interface: type of interface, flat/fresnel is the default

"""
    # TODO: Add an example
    #    e.g.::
    #
    #        sp = make_snowpack([1, 10], "exponential", density=[200,300], temperature=[240, 250], corr_length=[0.2e-3, 0.3e-3])
    #
    #"""

    sp = Snowpack(substrate=substrate, atmosphere=atmosphere)

    if not isinstance(thickness, collections.abc.Iterable):
        raise SMRTError(
            "The thickness argument must be iterable, that is, a list of numbers, numpy array or pandas Series or DataFrame."
        )

    for i, dz in enumerate(thickness):
        layer = make_generic_layer(dz,
                                   ks=lib.get(ks, i, "ks"),
                                   ka=lib.get(ka, i, "ka"),
                                   effective_permittivity=lib.get(
                                       effective_permittivity, i,
                                       "effective_permittivity"),
                                   temperature=lib.get(temperature, i,
                                                       "temperature"))

        sp.append(layer, lib.get(interface, i))

    return sp
예제 #4
0
def make_snowpack(thickness, microstructure_model, density,
                  interface=None,
                  substrate=None, **kwargs):

    """
    build a multi-layered snowpack. Each parameter can be an array, list or a constant value.

    :param thickness: thicknesses of the layers in meter (from top to bottom). The last layer thickness can be "numpy.inf" for a semi-infinite layer.
    :param microstructure_model: microstructure_model to use (e.g. sticky_hard_spheres or independent_sphere or exponential)
    :param interface: type of interface, flat/fresnel is the default
    :param density: densities of the layers
    All the other parameters (temperature, microstructure parameters, emmodel, etc, etc) are given as optional arguments (e.g. temperature=[270, 250]).
    They are passed for each layer to the function :py:func:`~smrt.inputs.make_medium.make_snow_layer`. Thus, the documentation of this function is the reference. It describes precisely the available parameters.
    The microstructure parameter(s) depend on the microstructure_model used and is documented in each microstructure_model module.

    TODO: include the documentation of make_snow_layer here once stabilized

    e.g.::

        sp = make_snowpack([1, 10], "exponential", density=[200,300], temperature=[240, 250], corr_length=[0.2e-3, 0.3e-3])

"""
    def get(x, i):  # function to take the i-eme value in an array or dict of array. Can deal with scalar as well

        if isinstance(x, six.string_types):
            return x
        elif isinstance(x, pd.DataFrame) or isinstance(x, pd.Series):
            return x.values[i]
        if isinstance(x, collections.Sequence) or isinstance(x, np.ndarray):
            return x[i]
        elif isinstance(x, dict):
            return {k: get(x[k], i) for k in x}
        else:
            return x

    sp = Snowpack(substrate=substrate)

    for i, dz in enumerate(thickness):
        layer = make_snow_layer(dz, get(microstructure_model, i),
                                density=get(density, i),
                                **get(kwargs, i))

        sp.append(layer, get(interface, i))

    return sp
예제 #5
0
def make_ice_column(ice_type,
                    thickness,
                    temperature,
                    microstructure_model,
                    brine_inclusion_shape='spheres',
                    salinity=0.,
                    brine_volume_fraction=None,
                    brine_permittivity_model=None,
                    ice_permittivity_model=None,
                    saline_ice_permittivity_model=None,
                    porosity=0,
                    density=None,
                    add_water_substrate=True,
                    interface=None,
                    substrate=None,
                    atmosphere=None,
                    **kwargs):
    """Build a multi-layered ice column. Each parameter can be an array, list or a constant value.

    ice_type variable determines the type of ice, which has a big impact on how the medium is modelled and the parameters:
    - First year ice is modelled as scattering brines embedded in a pure ice background
    - Multi year ice is modelled as scattering air bubbles in a saline ice background (but brines are non-scattering in this case).
    - Fresh ice is modelled as scattering air bubbles in a pure ice background (but brines are non-scattering in this case).

    First-year and multi-year ice is equivalent only if scattering and porosity are nulls. It is important to understand that in multi-year ice
    scattering by brine pockets is neglected because scattering is due to air bubbles and the emmodel implemented up to now are not able to deal with
    three-phase media.

    :param ice_type: Ice type. Options are "firstyear", "multiyear", "fresh"
    :param thickness: thicknesses of the layers in meter (from top to bottom). The last layer thickness can be "numpy.inf" for a semi-infinite layer.
    :param temperature: temperature of ice/water in K
    :param brine_inclusion_shape: assumption for shape of brine inclusions. So far, "spheres" or "random_needles" (i.e. elongated ellipsoidal inclusions), and "mix" (a mix of the two) are implemented, 
    :param salinity: salinity of ice/water in kg/kg (see PSU constant in smrt module). Default is 0. If neither salinity nor brine_volume_fraction are given, the ice column is considered to consist of fresh water ice.
    :param brine_volume_fraction: brine / liquid water fraction in sea ice, optional parameter, if not given brine volume fraction is calculated from temperature and salinity in ~.smrt.permittivity.brine_volume_fraction
    :param density: density of ice layer in kg m :sup:`-3`
    :param porosity: porosity of ice layer (0 - 1). Default is 0.
    :param add_water_substrate: Adds a substrate made of water below the ice column.
    Possible arguments are True (default) or False. If True looks for ice_type to determine if a saline or fresh water layer is added and/or uses the
    optional arguments 'water_temperature', 'water_salinity' of the water substrate.
    :param interface: type of interface, flat/fresnel is the default
    :param substrate: if add_water_substrate is False, the substrate can be prescribed with this argument.

    All the other optional arguments are passed for each layer to the function :py:func:`~smrt.inputs.make_medium.make_ice_layer`.
    The documentation of this function describes in detail the parameters used/required depending on ice_type.

"""

    # add a substrate underneath the ice (if wanted):
    if add_water_substrate:
        wp = water_parameters(ice_type, **kwargs)

        # create a permittivity_function that depends only on frequency and temperature by setting other arguments
        permittivity_model = lambda f, t: wp.water_permittivity_model(
            f, t, wp.water_salinity)
        substrate = Flat(temperature=wp.water_temperature,
                         permittivity_model=permittivity_model)
    else:
        substrate = substrate

    sp = Snowpack(substrate=substrate, atmosphere=atmosphere)

    n = len(thickness)
    for name in [
            "temperature", "salinity", "microstructure_model",
            "brine_inclusion_shape", "brine_volume_fraction", "porosity",
            "density", "brine_permittivity_model", "ice_permittivity_model",
            "saline_ice_permittivity_model", "interface", "kwargs"
    ]:
        lib.check_argument_size(locals()[name], n)

    for i, dz in enumerate(thickness):
        layer = make_ice_layer(
            ice_type,
            dz,
            temperature=lib.get(temperature, i),
            salinity=lib.get(salinity, i),
            microstructure_model=lib.get(microstructure_model, i),
            brine_inclusion_shape=lib.get(brine_inclusion_shape, i),
            brine_volume_fraction=lib.get(brine_volume_fraction, i),
            porosity=lib.get(porosity, i),
            density=lib.get(density, i),
            brine_permittivity_model=lib.get(brine_permittivity_model, i),
            ice_permittivity_model=lib.get(ice_permittivity_model, i),
            saline_ice_permittivity_model=lib.get(
                saline_ice_permittivity_model, i),
            **lib.get(kwargs, i))
        sp.append(layer, interface=make_interface(lib.get(interface, i)))

    return sp