Skip to content
Snippets Groups Projects
ogs6.R 12.8 KiB
Newer Older
#'OGS6
#'@description Constructor for the OGS6 base class
#'@export
    #'@description
    #'Creates new OGS6 object
    #'@param sim_name string: Simulation name
    #'@param sim_id double: Simulation ID
    #'@param sim_path string: Path where all files for the simulation will be
    #' saved
    #'@param ogs_bin_path string: Path to OpenGeoSys6 /bin directory
    #'@param test_mode In test mode, sim_path and ogs_bin_path will not be
    #' validated. If you're not a developer, please leave this as it is :)
                          ogs_bin_path,
                          test_mode = FALSE) {

      # Basic validation
      assertthat::assert_that(assertthat::is.string(sim_name))
      assertthat::assert_that(assertthat::is.number(sim_id))
      assertthat::assert_that(assertthat::is.string(sim_path))
      assertthat::assert_that(assertthat::is.string(ogs_bin_path))
      if(!test_mode){
        validate_paths(sim_path, ogs_bin_path)
      }
        private$.sim_output <- list()

        private$.sim_name <- sim_name
        private$.sim_id <- sim_id
        private$.sim_path <- sim_path
        private$.ogs_bin_path <- ogs_bin_path

    #===== ADDING COMPONENTS =====


    #'@description
    #'... (WIP)
    #'@param name ...
    #'@param value ...
    add_sim_output = function(name, value) {
        private$.sim_output[[name]] <- value
    #'@description
    #'Adds a r2ogs6_mesh object
    #'@param mesh r2ogs6_mesh
      assertthat::assert_that(class(mesh) == "r2ogs6_mesh")
      private$.meshes <- c(private$.meshes, list(mesh))
    #'@description
    #'Adds a r2ogs6_gml object
    #'@param gml r2ogs6_gml
    add_gml = function(gml){
      assertthat::assert_that(class(gml) == "r2ogs6_gml")
      if(!is.null(private$.gml)){
        warning("Overwriting gml and geometry variable of OGS6 object",
                call. = FALSE)

      }
      private$.gml <- gml
      private$.geometry <- paste0(gml$name, ".gml")
    #'@description
    #'Adds a python script
    #'@param python_script string: File name of python script
    add_python_script = function(python_script){
      assertthat::assert_that(assertthat::is.string(python_script))
      if(!is.null(private$.python_script)){
        warning("Overwriting python_script variable of OGS6 object",
                call. = FALSE)

      }
      private$.python_script <- python_script
    },

    #'@description
    #'Adds a r2ogs6_process object
    #'@param process r2ogs6_process
    add_process = function(process){
      assertthat::assert_that(class(process) == "r2ogs6_process")
      private$.processes <- c(private$.processes, list(process))
    #'@description
    #'Adds a r2ogs6_time_loop object
    #'@param time_loop r2ogs6_time_loop
    add_time_loop = function(time_loop){
      assertthat::assert_that(class(time_loop) == "r2ogs6_time_loop")
      if(!is.null(private$.time_loop)){
        warning("Overwriting time_loop variable of OGS6 object", call. = FALSE)
      }
      private$.time_loop <- time_loop
    },

    #'@description
    #'Adds a r2ogs6_local_coordinate_system object
    #'@param local_coordinate_system r2ogs6_local_coordinate_system
    add_local_coordinate_system = function(local_coordinate_system){
      assertthat::assert_that(class(local_coordinate_system) ==
                                "r2ogs6_local_coordinate_system")
      if(!is.null(private$.local_coordinate_system)){
        warning("Overwriting local_coordinate_system variable of OGS6 object",
                call. = FALSE)
      }
      private$.local_coordinate_system <- local_coordinate_system
    },

    #'@description
    #'Adds a r2ogs6_medium object
    #'@param medium r2ogs6_medium
    add_medium = function(medium){
      assertthat::assert_that(class(medium) == "r2ogs6_medium")
      private$.media <- c(private$.media, list(medium))
    #'@description
    #'Adds a r2ogs6_parameter object
    #'@param parameter r2ogs6_parameter
    add_parameter = function(parameter){
      assertthat::assert_that(class(parameter) == "r2ogs6_parameter")
      private$.parameters <- c(private$.parameters, list(parameter))
    #'@description
    #'Adds a r2ogs6_curve object
    #'@param curve r2ogs6_curve
    add_curve = function(curve){
      assertthat::assert_that(class(curve) == "r2ogs6_curve")
      private$.curves <- c(private$.curves, list(curve))
    #'@description
    #'Adds a r2ogs6_process_variable object
    #'@param process_variable r2ogs6_process_variable
    add_process_variable = function(process_variable){
      assertthat::assert_that(class(process_variable) ==
                                "r2ogs6_process_variable")
      private$.process_variables <- c(private$.process_variables,
                                      list(process_variable))
    #'@description
    #'Adds a r2ogs6_nonlinear_solver object
    #'@param nonlinear_solver r2ogs6_nonlinear_solver
    add_nonlinear_solver = function(nonlinear_solver){
      assertthat::assert_that(class(nonlinear_solver) ==
                                "r2ogs6_nonlinear_solver")
      private$.nonlinear_solvers <- c(private$.nonlinear_solvers,
                                      list(nonlinear_solver))
    #'@description
    #'Adds a r2ogs6_linear_solver object
    #'@param linear_solver r2ogs6_linear_solver
    add_linear_solver = function(linear_solver){
      assertthat::assert_that(class(linear_solver) == "r2ogs6_linear_solver")
      private$.linear_solvers <- c(private$.linear_solvers, list(linear_solver))
    #'@description
    #'Adds a r2ogs6_vtkdiff object
    #'@param vtkdiff r2ogs6_vtkdiff
    add_vtkdiff = function(vtkdiff){
      assertthat::assert_that(class(vtkdiff) == "r2ogs6_vtkdiff")
      private$.test_definition <- c(private$.test_definition, list(vtkdiff))
    #'@description
    #'Adds a r2ogs6_insitu object
    #'@param insitu r2ogs6_insitu
    add_insitu = function(insitu){
      assertthat::assert_that(class(insitu) == "r2ogs6_insitu")

      if(!is.null(private$.insitu)){
        warning("Overwriting insitu variable of OGS6 object", call. = FALSE)
      }
      private$.insitu <- insitu
    },


    #===== UTILITY FUNCTIONS =====


    #'@description
    #'Checks if the OGS6 object has all necessary parameters for
    #' starting a simulation
      flag <- TRUE

      #.gml
      #flag <- obj_is_defined(flag, private$.gml, "gml")

      #.vtu
      flag <- get_list_status(flag, private$.meshes, "mesh")

      #.prj
      flag <- get_list_status(flag, private$.processes, "process")
      flag <- obj_is_defined(flag, private$.time_loop, "time_loop")
      flag <- obj_is_defined(flag, private$.local_coordinate_system,
                             "local_coordinate_system", is_opt = TRUE)
      flag <- get_list_status(flag, private$.media, "medium", is_opt = TRUE)
      flag <- get_list_status(flag, private$.parameters, "parameter")
      flag <- get_list_status(flag, private$.curves, "curve", is_opt = TRUE)
      flag <- get_list_status(flag, private$.process_variables,
                              "process_variable")
      flag <- get_list_status(flag, private$.nonlinear_solvers,
                              "nonlinear_solver")
      flag <- get_list_status(flag, private$.linear_solvers,
                              "linear_solver")
      flag <- get_list_status(flag, private$.test_definition,
                              "vtkdiff", is_opt = TRUE)
      flag <- obj_is_defined(flag, private$.insitu,
                             "insitu", is_opt = TRUE)

      if(flag){
        cat(paste0("Your simulation object has all necessary components.\n",
        "You can try to start the simulation by calling run_simulation() ",
        "on your OGS6 object.\n",
        "Note that this will call more validation functions, ",
        "so you may not be done just yet.\n"))
    #'@description
    #'Clears components from the OGS6 object
    #'@param which character: The names of the components (all by default).
    #' If you want to delete only some components, run
    #' names(get_implemented_classes()) for the available options.
    clear = function(which = names(get_implemented_classes())){

      assertthat::assert_that(is.character(which))

      valid_input = names(get_implemented_classes())

      null_it <- c("geometry", "time_loop")

      for(i in seq_len(length(which))){
        if(!which[[i]] %in% valid_input){
          warning(paste0("Parameter '", which[[i]],
                         "' not recognized by OGS6$clear(). ",
                        "Valid parameters are:\n'",
                        paste(valid_input, sep = "", collapse = "', '"),
                        "'\nSkipping."), call. = FALSE)
          next
        }else{
          call_str <- ""
          if(which[[i]] %in% null_it){
            call_str <- paste0("private$.", which[[i]], " <- NULL")
          }else{
            call_str <- paste0("private$.", which[[i]], " <- list()")
          }
          eval(parse(text = call_str))
        }
      }

      #'@field sim_output
      #'Getter for OGS6 private parameter '.sim_output'
        private$.sim_output
      #'@field sim_name
      #'Getter for OGS6 private parameter '.sim_name'
      sim_name = function() {
        private$.sim_name
      #'@field sim_id
      #'Getter for OGS6 private parameter '.sim_id'
      sim_id = function() {
        private$.sim_id
      #'@field sim_path
      #'Getter for OGS6 private parameter '.sim_path'
      sim_path = function() {
        private$.sim_path
      #'@field ogs_bin_path
      #'Getter for OGS6 private parameter '.ogs_bin_path'
      ogs_bin_path = function() {
        private$.ogs_bin_path
      #'@field gml
      #'Getter for OGS6 private parameter '.gml'
      gml = function() {
        private$.gml
      #'@field meshes
      #'Getter for OGS6 private parameter '.meshes'
      meshes = function() {
        private$.meshes
      #'@field geometry
      #'Getter for OGS6 private parameter '.geometry'
      geometry = function() {
        private$.geometry
      #'@field python_script
      #'Getter for OGS6 private parameter '.python_script'
      python_script = function() {
        private$.python_script
      #'@field processes
      #'Getter for OGS6 private parameter '.processes'
      processes = function() {
        private$.processes
      #'@field time_loop
      #'Getter for OGS6 private parameter '.time_loop'
      time_loop = function() {
        private$.time_loop
      #'@field local_coordinate_system
      #'Getter for OGS6 private parameter '.local_coordinate_system'
      local_coordinate_system = function() {
        private$.local_coordinate_system
      #'@field media
      #'Getter for OGS6 private parameter '.media'
      media = function() {
        private$.media
      #'@field parameters
      #'Getter for OGS6 private parameter '.parameters'
      parameters = function() {
        private$.parameters
      #'@field curves
      #'Getter for OGS6 private parameter '.curves'
      curves = function() {
        private$.curves
      #'@field process_variables
      #'Getter for OGS6 private parameter '.process_variables'
      process_variables = function() {
        private$.process_variables
      #'@field nonlinear_solvers
      #'Getter for OGS6 private parameter '.nonlinear_solvers'
      nonlinear_solvers = function() {
        private$.nonlinear_solvers
      #'@field linear_solvers
      #'Getter for OGS6 private parameter '.linear_solvers'
      linear_solvers = function() {
        private$.linear_solvers
      #'@field test_definition
      #'Getter for OGS6 private parameter '.test_definition'
      test_definition = function() {
        private$.test_definition
      #'@field insitu
      #'Getter for OGS6 private parameter '.insitu'
      insitu = function() {
        private$.insitu
      .python_script = NULL,
      .processes = list(),
      .local_coordinate_system = NULL,
      .media = list(),
      .parameters = list(),
      .curves = list(),
      .process_variables = list(),
      .nonlinear_solvers = list(),
      .linear_solvers = list(),
      .test_definition = list(),
      .insitu = NULL