Source code for ogstools.ogs6py.processvars

"""
Copyright (c) 2012-2024, OpenGeoSys Community (http://www.opengeosys.org)
            Distributed under a Modified BSD License.
              See accompanying file LICENSE or
              http://www.opengeosys.org/project/license

"""
from typing import Any

from lxml import etree as ET

from ogstools.ogs6py import build_tree


[docs] class ProcessVars(build_tree.BuildTree): """ Managing the process variables section in the project file. """
[docs] def __init__(self, tree: ET.ElementTree) -> None: self.tree = tree self.root = self.tree.getroot() self.pvs = self.populate_tree( self.root, "process_variables", overwrite=True )
[docs] def set_ic(self, **args: Any) -> None: """ Set initial conditions. Parameters ---------- process_variable_name : `str` components : `int` or `str` order : `int` or `str` initial_condition : `str` compensate_non_equilibrium_initial_residuum : `str` """ self._convertargs(args) if "process_variable_name" not in args: msg = "No process_variable_name given" raise KeyError(msg) if "components" not in args: msg = """Please provide the number of components \ of the given process variable.""" raise KeyError(msg) if "order" not in args: msg = """Out of order. Please specify the polynomial order \ of the process variable's shape functions.""" raise KeyError(msg) if "initial_condition" not in args: msg = "No initial_condition specified." raise KeyError(msg) pv = self.populate_tree(self.pvs, "process_variable") self.populate_tree(pv, "name", text=args["process_variable_name"]) self.populate_tree(pv, "components", text=args["components"]) self.populate_tree(pv, "order", text=args["order"]) compens = "compensate_non_equilibrium_initial_residuum" boolmapping = {True: "true", False: "false"} if compens in args: if isinstance(args[compens], bool): self.populate_tree(pv, compens, text=boolmapping[args[compens]]) else: self.populate_tree(pv, compens, text=args[compens]) self.populate_tree( pv, "initial_condition", text=args["initial_condition"] )
[docs] def add_bc(self, **args: Any) -> None: """ Adds a boundary condition. Parameters ---------- process_variable_name : `str` type : `str` geometrical_set : `str` geometry : `str` component : `int` or `str` parameter : `str` bc_object : `str` mesh : `str` """ self._convertargs(args) if "process_variable_name" not in args: msg = "No process variable name specified." raise KeyError(msg) if "type" not in args: msg = "No type given." raise KeyError(msg) process_variable_name = args["process_variable_name"] pv = self.root.find( f"./process_variables/process_variable[name='{process_variable_name}']" ) if pv is None: msg = "You need to set initial condition for that process variable first." raise KeyError(msg) boundary_conditions = pv.find("./boundary_conditions") if boundary_conditions is None: boundary_conditions = self.populate_tree(pv, "boundary_conditions") boundary_condition = self.populate_tree( boundary_conditions, "boundary_condition" ) self.populate_tree(boundary_condition, "type", text=args["type"]) if "geometrical_set" in args: if "geometry" not in args: msg = "You need to provide a geometry." raise KeyError(msg) self.populate_tree( boundary_condition, "geometrical_set", text=args["geometrical_set"], ) self.populate_tree( boundary_condition, "geometry", text=args["geometry"] ) elif "mesh" in args: self.populate_tree(boundary_condition, "mesh", text=args["mesh"]) else: msg = """You should provide either a geometrical set \ or a mesh to define BC for.""" raise KeyError(msg) if "parameter" in args: if "component" in args: self.populate_tree( boundary_condition, "component", text=args["component"] ) self.populate_tree( boundary_condition, "parameter", text=args["parameter"] ) elif "bc_object" in args: if "component" in args: self.populate_tree( boundary_condition, "component", text=args["component"] ) self.populate_tree( boundary_condition, "bc_object", text=args["bc_object"] ) elif "u_0" in args: if "alpha" in args: self.populate_tree( boundary_condition, "alpha", text=args["alpha"] ) self.populate_tree(boundary_condition, "u_0", text=args["u_0"]) else: msg = """Please provide the parameter for Dirichlet \ or Neumann BCs/bc_object for Python BCs""" raise KeyError(msg)
[docs] def add_st(self, **args: Any) -> None: """ Add a source term. Parameters ---------- process_variable_name : `str` type : `str` geometrical_set : `str` geometry : `str` component : `int` or `str` parameter : `str` source_term_object : `str` mesh : `str` """ self._convertargs(args) if "process_variable_name" not in args: msg = "No process variable name specified." raise KeyError(msg) if "type" not in args: msg = "No type given." raise KeyError(msg) process_variable_name = args["process_variable_name"] pv = self.root.find( f"./process_variables/process_variable[name='{process_variable_name}']" ) if pv is None: msg = "You need to set initial condition for that process variable first." raise KeyError(msg) source_terms = pv.find("./source_terms") if source_terms is None: source_terms = self.populate_tree(pv, "source_terms") source_term = self.populate_tree(source_terms, "source_term") self.populate_tree(source_term, "type", text=args["type"]) if "geometrical_set" in args: if "geometry" not in args: msg = "You need to provide a geometry." raise KeyError(msg) self.populate_tree( source_term, "geometrical_set", text=args["geometrical_set"] ) self.populate_tree(source_term, "geometry", text=args["geometry"]) elif "mesh" in args: self.populate_tree(source_term, "mesh", text=args["mesh"]) else: msg = "You should provide either a geometrical set \ or a mesh to define STs for." raise KeyError(msg) if "parameter" in args: if "component" in args: self.populate_tree( source_term, "component", text=args["component"] ) self.populate_tree(source_term, "parameter", text=args["parameter"]) elif "source_term_object" in args: if "component" in args: self.populate_tree( source_term, "component", text=args["component"] ) self.populate_tree( source_term, "source_term_object", text=args["source_term_object"], ) elif "u_0" in args: if "alpha" in args: self.populate_tree(source_term, "alpha", text=args["alpha"]) self.populate_tree(source_term, "u_0", text=args["u_0"]) else: msg = """Please provide the parameter for Dirichlet \ or Neumann ST/source_term_object for Python STs.""" raise KeyError(msg)