Skip to content
Snippets Groups Projects
prj_medium.R 25 KiB
Newer Older
Ruben Heinrich's avatar
Ruben Heinrich committed
#===== prj_medium =====
Ruben Heinrich's avatar
Ruben Heinrich committed
#' prj_medium
#' @description tag: medium, a specific medium with optional id corresponding
#'   to the MaterialIDs
Ruben Heinrich's avatar
Ruben Heinrich committed
#' @param phases list, prj_phase: Optional: Medium phases
#' @param properties list, prj_pr_property: Optional: Medium properties
#' @param id string | double: Optional: ID corresponding to the MaterialIDs
#' @example man/examples/ex_prj_medium.R
#' @export
Ruben Heinrich's avatar
Ruben Heinrich committed
prj_medium <- function(phases = NULL,
                          properties = NULL,
                          id = NULL) {
    if(is.character(phases)){
        phases <- NULL
    }

Ruben Heinrich's avatar
Ruben Heinrich committed
    new_prj_medium(phases,
                      properties,
                      id)
Ruben Heinrich's avatar
Ruben Heinrich committed
new_prj_medium <- function(phases = NULL,
                              properties = NULL,
                              id = NULL) {

Ruben Heinrich's avatar
Ruben Heinrich committed
        is_wrapper_list(phases, "prj_phase")

    if(!is.null(properties)){
Ruben Heinrich's avatar
Ruben Heinrich committed
        is_wrapper_list(properties, "prj_pr_property")
    are_null_or_strings(id)

    structure(
        list(
            phases = phases,
            properties = properties,
            id = id,
            xpath = "media/medium",
            attr_names = c("id"),
            flatten_on_exp = character()
        ),
Ruben Heinrich's avatar
Ruben Heinrich committed
        class = "prj_medium"
Ruben Heinrich's avatar
Ruben Heinrich committed
#===== prj_pr_property =====
Ruben Heinrich's avatar
Ruben Heinrich committed
#' prj_pr_property
#' @description tag: property
#' @param name string:
#' @param type string:
#' @param value Optional:
#' @param parameter_name Optional:
#' @param exponent Optional:
#' @param residual_liquid_saturation Optional:
#' @param residual_gas_saturation Optional:
#' @param initial_porosity Optional:
#' @param minimal_porosity Optional:
#' @param maximal_porosity Optional:
#' @param p_b Optional:
#' @param independent_variable Optional:
#' @param curve Optional:
#' @param minimum_relative_permeability_liquid Optional:
#' @param cutoff_value Optional:
#' @param lambda Optional:
#' @param min_relative_permeability Optional:
#' @param initial_permeability Optional:
#' @param maximum_permeability Optional:
#' @param intrinsic_permeability Optional:
#' @param initial_aperture Optional:
#' @param mean_frac_distance Optional:
#' @param mean_frac_distances Optional: numeric vector
#' @param threshold_strain Optional:
#' @param threshold_strains Optional: numeric vector
#' @param fracture_normal Optional:
#' @param fracture_normals Optional: numeric vector
#' @param fracture_rotation_xy Optional:
#' @param fracture_rotation_yz Optional:
#' @param reference_permeability Optional:
#' @param fitting_factor Optional:
#' @param cohesion Optional:
#' @param friction_angle Optional:
#' @param tensile_strength_parameter Optional:
#' @param b1 Optional:
#' @param b2 Optional:
#' @param b3 Optional:
#' @param minimum_permeability Optional:
#' @param entry_pressure Optional:
#' @param intrinsic_permeabilities Optional:
#' @param exponents Optional:
#' @example man/examples/ex_prj_pr_property.R
#' @export
Ruben Heinrich's avatar
Ruben Heinrich committed
prj_pr_property <- function(name,
                            type,
                            value = NULL,
                            parameter_name = NULL,
                            exponent = NULL,
                            residual_liquid_saturation = NULL,
                            residual_gas_saturation = NULL,
                            initial_porosity = NULL,
                            minimal_porosity = NULL,
                            maximal_porosity = NULL,
                            p_b = NULL,
                            independent_variable = NULL,
                            curve = NULL,
                            minimum_relative_permeability_liquid = NULL,
                            cutoff_value = NULL,
                            lambda = NULL,
                            min_relative_permeability = NULL,
                            initial_permeability = NULL,
                            maximum_permeability = NULL,
                            intrinsic_permeability = NULL,
                            initial_aperture = NULL,
                            mean_frac_distance = NULL,
                            mean_frac_distances = NULL,
                            threshold_strain = NULL,
                            threshold_strains = NULL,
                            fracture_normal = NULL,
                            fracture_normals = NULL,
                            fracture_rotation_xy = NULL,
                            fracture_rotation_yz = NULL,
                            reference_permeability = NULL,
                            fitting_factor = NULL,
                            cohesion = NULL,
                            friction_angle = NULL,
                            tensile_strength_parameter = NULL,
                            b1 = NULL,
                            b2 = NULL,
                            b3 = NULL,
                            minimum_permeability = NULL,
                            entry_pressure = NULL,
                            intrinsic_permeabilities = NULL,
                            exponents = NULL) {
    value <- coerce_string_to_numeric(value)
    exponent <- coerce_string_to_numeric(exponent)
    residual_liquid_saturation <-
        coerce_string_to_numeric(residual_liquid_saturation)
    residual_gas_saturation <- coerce_string_to_numeric(residual_gas_saturation)
    p_b <- coerce_string_to_numeric(p_b)
    minimum_relative_permeability_liquid <-
        coerce_string_to_numeric(minimum_relative_permeability_liquid)
    lambda <- coerce_string_to_numeric(lambda)
    cutoff_value <- coerce_string_to_numeric(cutoff_value)
    reference_permeability <- coerce_string_to_numeric(reference_permeability)
    fitting_factor <- coerce_string_to_numeric(fitting_factor)
    cohesion <- coerce_string_to_numeric(cohesion)
    friction_angle <- coerce_string_to_numeric(friction_angle)
    maximum_permeability <- coerce_string_to_numeric(maximum_permeability)
    tensile_strength_parameter <-
        coerce_string_to_numeric(tensile_strength_parameter)
    entry_pressure <- coerce_string_to_numeric(entry_pressure)

    new_prj_pr_property(name,
                        type,
                        value,
                        parameter_name,
                        exponent,
                        residual_liquid_saturation,
                        residual_gas_saturation,
                        initial_porosity,
                        minimal_porosity,
                        maximal_porosity,
                        p_b,
                        independent_variable,
                        curve,
                        minimum_relative_permeability_liquid,
                        cutoff_value,
                        lambda,
                        min_relative_permeability,
                        initial_permeability,
                        maximum_permeability,
                        intrinsic_permeability,
                        initial_aperture,
                        mean_frac_distance,
                        mean_frac_distances,
                        threshold_strain,
                        threshold_strains,
                        fracture_normal,
                        fracture_normals,
                        fracture_rotation_xy,
                        fracture_rotation_yz,
                        reference_permeability,
                        fitting_factor,
                        cohesion,
                        friction_angle,
                        tensile_strength_parameter,
                        b1,
                        b2,
                        b3,
                        minimum_permeability,
                        entry_pressure,
                        intrinsic_permeabilities,
                        exponents)
Ruben Heinrich's avatar
Ruben Heinrich committed
new_prj_pr_property <- function(name,
                                type,
                                value = NULL,
                                parameter_name = NULL,
                                exponent = NULL,
                                residual_liquid_saturation = NULL,
                                residual_gas_saturation = NULL,
                                initial_porosity = NULL,
                                minimal_porosity = NULL,
                                maximal_porosity = NULL,
                                p_b = NULL,
                                independent_variable = NULL,
                                curve = NULL,
                                minimum_relative_permeability_liquid = NULL,
                                cutoff_value = NULL,
                                lambda = NULL,
                                min_relative_permeability = NULL,
                                initial_permeability = NULL,
                                maximum_permeability = NULL,
                                intrinsic_permeability = NULL,
                                initial_aperture = NULL,
                                mean_frac_distance = NULL,
                                mean_frac_distances = NULL,
                                threshold_strain = NULL,
                                threshold_strains = NULL,
                                fracture_normal = NULL,
                                fracture_normals = NULL,
                                fracture_rotation_xy = NULL,
                                fracture_rotation_yz = NULL,
                                reference_permeability = NULL,
                                fitting_factor = NULL,
                                cohesion = NULL,
                                friction_angle = NULL,
                                tensile_strength_parameter = NULL,
                                b1 = NULL,
                                b2 = NULL,
                                b3 = NULL,
                                minimum_permeability = NULL,
                                entry_pressure = NULL,
                                intrinsic_permeabilities = NULL,
                                exponents = NULL) {
    assertthat::assert_that(assertthat::is.string(name))
    assertthat::assert_that(assertthat::is.string(type))
    are_null_or_numeric(value)
    are_null_or_numbers(exponent,
                        residual_liquid_saturation,
                        residual_gas_saturation,
                        p_b,
                        minimum_relative_permeability_liquid,
                        lambda,
                        cutoff_value,
                        reference_permeability,
                        fitting_factor,
                        cohesion,
                        friction_angle,
                        maximum_permeability,
                        tensile_strength_parameter,
                        entry_pressure)
    are_null_or_strings(parameter_name,
                        independent_variable,
                        curve,
                        initial_permeability)
    structure(list(name = name,
                   type = type,
                   value = value,
                   parameter_name = parameter_name,
                   exponent = exponent,
                   residual_liquid_saturation = residual_liquid_saturation,
                   residual_gas_saturation = residual_gas_saturation,
                   initial_porosity = initial_porosity,
                   minimal_porosity = minimal_porosity,
                   maximal_porosity = maximal_porosity,
                   p_b = p_b,
                   independent_variable = independent_variable,
                   curve = curve,
                   minimum_relative_permeability_liquid =
                       minimum_relative_permeability_liquid,
                   cutoff_value = cutoff_value,
                   lambda = lambda,
                   min_relative_permeability = min_relative_permeability,
                   initial_permeability = initial_permeability,
                   maximum_permeability = maximum_permeability,
                   intrinsic_permeability = intrinsic_permeability,
                   initial_aperture = initial_aperture,
                   mean_frac_distance = mean_frac_distance,
                   mean_frac_distances = mean_frac_distances,
                   threshold_strain = threshold_strain,
                   threshold_strains = threshold_strains,
                   fracture_normal = fracture_normal,
                   fracture_normals = fracture_normals,
                   fracture_rotation_xy = fracture_rotation_xy,
                   fracture_rotation_yz = fracture_rotation_yz,
                   reference_permeability = reference_permeability,
                   fitting_factor = fitting_factor,
                   cohesion = cohesion,
                   friction_angle = friction_angle,
                   tensile_strength_parameter = tensile_strength_parameter,
                   b1 = b1,
                   b2 = b2,
                   b3 = b3,
                   minimum_permeability = minimum_permeability,
                   entry_pressure = entry_pressure,
                   intrinsic_permeabilities = intrinsic_permeabilities,
                   exponents = exponents,
                   xpath = "media/medium/properties/property",
                   attr_names = character(),
                   flatten_on_exp = character()
Ruben Heinrich's avatar
Ruben Heinrich committed
    class = "prj_pr_property"
Ruben Heinrich's avatar
Ruben Heinrich committed
#' ogs6_get_medium_property
#' @description Returns a medium property based on the property name
Ruben Heinrich's avatar
Ruben Heinrich committed
#' @param medium prj_medium
#' @param name string: The property name
Ruben Heinrich's avatar
Ruben Heinrich committed
#' @return prj_pr_property
Ruben Heinrich's avatar
Ruben Heinrich committed
ogs6_get_medium_property <- function(medium, name){
Ruben Heinrich's avatar
Ruben Heinrich committed

Ruben Heinrich's avatar
Ruben Heinrich committed
    assertthat::assert_that(class(medium) == "prj_medium")
Ruben Heinrich's avatar
Ruben Heinrich committed
    assertthat::assert_that(assertthat::is.string(name))

    properties_names <- lapply(medium$properties, `[[`, "name")
    property <- medium$properties[properties_names == name][[1]]
Ruben Heinrich's avatar
Ruben Heinrich committed

    return(invisible(property))
}


Ruben Heinrich's avatar
Ruben Heinrich committed
#===== prj_phase =====
Ruben Heinrich's avatar
Ruben Heinrich committed
#' prj_phase
#' @description tag: phase, a coherent material with homogeneous properties
#' @param type string: Phase type
#'   (get valid types with get_valid_phase_types())
Ruben Heinrich's avatar
Ruben Heinrich committed
#' @param properties list, prj_pr_property: Properties
#' @param components list, components
#' @example man/examples/ex_prj_phase.R
#' @export
Ruben Heinrich's avatar
Ruben Heinrich committed
prj_phase <- function(type,
                         properties = NULL,
                         components = NULL){
Ruben Heinrich's avatar
Ruben Heinrich committed
    new_prj_phase(type,
                     properties,
                     components)
Ruben Heinrich's avatar
Ruben Heinrich committed
new_prj_phase <- function(type,
                             properties = NULL,
                             components = NULL) {
    assertthat::assert_that(assertthat::is.string(type))
    assertthat::assert_that(type %in% get_valid_phase_types())

    if(!is.null(properties)){
Ruben Heinrich's avatar
Ruben Heinrich committed
        is_wrapper_list(properties, "prj_ph_property")
Ruben Heinrich's avatar
Ruben Heinrich committed
        is_wrapper_list(components, "prj_component")
    structure(
        list(
            type = type,
            properties = properties,
            components = components,
            xpath = "media/medium/phases/phase",
            attr_names = character(),
            flatten_on_exp = character()
Ruben Heinrich's avatar
Ruben Heinrich committed
        class = "prj_phase"
    )
}


get_valid_phase_types <- function(){
    valid_phase_types <- c("Gas",
                           "Solid",
                           "AqueousLiquid",
                           "NonAqueousLiquid")

    return(invisible(valid_phase_types))
}


Ruben Heinrich's avatar
Ruben Heinrich committed
#===== prj_ph_property =====
Ruben Heinrich's avatar
Ruben Heinrich committed
#' prj_ph_property
#' @description tag: property
#' @param name string:
#' @param type string:
#' @param value Optional:
#' @param reference_value Optional:
#' @param offset Optional:
#' @param exponent Optional:
#' @param parameter_name Optional:
#' @param swelling_pressures Optional:
#' @param exponents Optional:
#' @param lower_saturation_limit Optional:
#' @param upper_saturation_limit Optional:
#' @param ... independent_variable
#' @example man/examples/ex_prj_ph_property.R
#' @export
Ruben Heinrich's avatar
Ruben Heinrich committed
prj_ph_property <- function(name,
                            type,
                            value = NULL,
                            reference_value = NULL,
                            offset = NULL,
                            exponent = NULL,
                            parameter_name = NULL,
                            swelling_pressures = NULL,
                            exponents = NULL,
                            lower_saturation_limit = NULL,
                            upper_saturation_limit = NULL,
                            ...) {
    if (!is.list(value)) {
        value <- coerce_string_to_numeric(value)
    }

    reference_value <- coerce_string_to_numeric(reference_value)
    exponents <- coerce_string_to_numeric(exponents)
    offset <- coerce_string_to_numeric(offset)
    swelling_pressures <- coerce_string_to_numeric(swelling_pressures)
    lower_saturation_limit <- coerce_string_to_numeric(lower_saturation_limit)
    upper_saturation_limit <- coerce_string_to_numeric(upper_saturation_limit)

    ellipsis_list <- list(...)
    independent_variable <-
        ellipsis_list[names(ellipsis_list) == "independent_variable"]

    new_prj_ph_property(name,
                        type,
                        value,
                        reference_value,
                        independent_variable,
                        offset,
                        exponent,
                        parameter_name,
                        swelling_pressures,
                        exponents,
                        lower_saturation_limit,
                        upper_saturation_limit)
Ruben Heinrich's avatar
Ruben Heinrich committed
new_prj_ph_property <- function(name,
                                type,
                                value = NULL,
                                reference_value = NULL,
                                independent_variable = NULL,
                                offset = NULL,
                                exponent = NULL,
                                parameter_name = NULL,
                                swelling_pressures = NULL,
                                exponents = NULL,
                                lower_saturation_limit = NULL,
                                upper_saturation_limit = NULL) {

    are_strings(name,
                type)
    if (is.list(value)) {
        are_null_or_strings(value[[1]])
    } else {
        are_null_or_numeric(value)
    }
    are_null_or_numbers(
        reference_value,
        offset,
        lower_saturation_limit,
        upper_saturation_limit
    )
    are_null_or_numeric(swelling_pressures,
                        exponents)
    are_null_or_strings(parameter_name)

    if (!is.null(independent_variable)) {
        independent_variable <- lapply(independent_variable, function(x){
            x <- coerce_names(x,
                              c("variable_name",
                                "reference_condition",
                                "slope"))
        })
    }

    if (!is.null(exponent)) {
        exponent <- coerce_names(exponent,
                                 c("variable_name",
                                   "reference_condition",
                                   "factor"))
    structure(list(name = name,
                   type = type,
                   value = value,
                   reference_value = reference_value,
                   independent_variable = independent_variable,
                   offset = offset,
                   exponent = exponent,
                   parameter_name = parameter_name,
                   swelling_pressures = swelling_pressures,
                   exponents = exponents,
                   lower_saturation_limit = lower_saturation_limit,
                   upper_saturation_limit = upper_saturation_limit,
                   xpath = "media/medium/phases/phase/properties/property",
                   attr_names = character(),
                   flatten_on_exp = c("exponents",
                                      "swelling_pressures"),
                   unwrap_on_exp = c("independent_variable")
    ),
    class = "prj_ph_property"
Ruben Heinrich's avatar
Ruben Heinrich committed
#===== prj_component =====
Ruben Heinrich's avatar
Ruben Heinrich committed
#' prj_component
#' @description tag: component
#' @param name string:
Ruben Heinrich's avatar
Ruben Heinrich committed
#' @param properties list, prj_com_property:
#' @example man/examples/ex_prj_component.R
#' @export
Ruben Heinrich's avatar
Ruben Heinrich committed
prj_component <- function(name,
                             properties){

    #Make this more user friendly
    #...

Ruben Heinrich's avatar
Ruben Heinrich committed
    new_prj_component(name,
Ruben Heinrich's avatar
Ruben Heinrich committed
new_prj_component <- function(name,
                                 properties) {

    assertthat::assert_that(assertthat::is.string(name))

Ruben Heinrich's avatar
Ruben Heinrich committed
    is_wrapper_list(properties, "prj_com_property")

    structure(
        list(
            name = name,
            properties = properties,
            xpath = "media/medium/phases/phase/components/component",
            attr_names = character(),
            flatten_on_exp = character()
        ),

Ruben Heinrich's avatar
Ruben Heinrich committed
        class = "prj_component"
Ruben Heinrich's avatar
Ruben Heinrich committed
#===== prj_com_property =====
Ruben Heinrich's avatar
Ruben Heinrich committed
#' prj_com_property
#' @description tag: property
#' @param name string: Property name
#' @param type string: Property type
#' @param value Optional: string | double: ...
#' @param parameter_name Optional:
#' @param reference_diffusion Optional: character
#' @param activation_energy Optional: string | double
#' @param reference_temperature Optional: numeric
#' @param triple_temperature Optional: numeric
#' @param triple_pressure Optional: numeric
#' @param critical_temperature Optional: numeric
#' @param critical_pressure Optional: numeric
#' @param reference_pressure Optional: numeric
#' @example man/examples/ex_prj_com_property.R
#' @export
Ruben Heinrich's avatar
Ruben Heinrich committed
prj_com_property <- function(name,
                             type,
                             value = NULL,
                             parameter_name = NULL,
                             reference_diffusion = NULL,
                             activation_energy = NULL,
                             reference_temperature = NULL,
                             triple_temperature = NULL,
                             triple_pressure = NULL,
                             critical_temperature = NULL,
                             critical_pressure = NULL,
                             reference_pressure= NULL) {



    #Coerce input
    value <- coerce_string_to_numeric(value)
    activation_energy <- coerce_string_to_numeric(activation_energy)
    reference_temperature <- coerce_string_to_numeric(reference_temperature)
    triple_temperature <- coerce_string_to_numeric(triple_temperature)
    triple_pressure <- coerce_string_to_numeric(triple_pressure)
    critical_temperature <- coerce_string_to_numeric(critical_temperature)
    critical_pressure <- coerce_string_to_numeric(critical_pressure)
    reference_pressure <- coerce_string_to_numeric(reference_pressure)
Ruben Heinrich's avatar
Ruben Heinrich committed
    new_prj_com_property(name,
                         type,
                         value,
                         parameter_name,
                         reference_diffusion,
                         activation_energy,
                         reference_temperature,
                         triple_temperature,
                         triple_pressure,
                         critical_temperature,
                         critical_pressure,
                         reference_pressure
                         )
Ruben Heinrich's avatar
Ruben Heinrich committed
new_prj_com_property <- function(name,
                                 type,
                                 value = NULL,
                                 parameter_name = NULL,
                                 reference_diffusion = NULL,
                                 activation_energy = NULL,
                                 reference_temperature = NULL,
                                 triple_temperature = NULL,
                                 triple_pressure = NULL,
                                 critical_temperature = NULL,
                                 critical_pressure = NULL,
                                 reference_pressure= NULL) {


    assertthat::assert_that(assertthat::is.string(name))
    assertthat::assert_that(assertthat::is.string(type))

    are_null_or_numbers(value)
    are_null_or_numeric(activation_energy)
    are_null_or_numeric(reference_temperature)
    are_null_or_numeric(triple_temperature)
    are_null_or_numeric(triple_pressure)
    are_null_or_numeric(critical_temperature)
    are_null_or_numeric(critical_pressure)
    are_null_or_numeric(reference_pressure)
    are_null_or_strings(parameter_name)
    are_null_or_strings(reference_diffusion)

    structure(
        list(
            name = name,
            type = type,
            value = value,
            parameter_name = parameter_name,
            reference_diffusion = reference_diffusion,
            activation_energy = activation_energy,
            reference_temperature = reference_temperature,
            triple_temperature = triple_temperature,
            triple_pressure = triple_pressure,
            critical_temperature = critical_temperature,
            critical_pressure = critical_pressure,
            reference_pressure = reference_pressure,
Ruben Heinrich's avatar
Ruben Heinrich committed
            xpath = paste0("media/medium/phases/phase/components/component/",
                           "properties/property"),
            attr_names = character(),
            flatten_on_exp = character()
        ),
Ruben Heinrich's avatar
Ruben Heinrich committed
        class = "prj_com_property"