示例#1
0
    def __init__(self,
                 pset=solverparams.ParameterSet(),
                 rtol=1.0e-6,
                 atol=1.0e-2,
                 miter=100,
                 substep=1,
                 verbose=False,
                 steady=False):
        """
      Setup the solver

      Additional parameters:
        pset        object with solver parameters 
        rtol        iteration relative tolerance
        atol        iteration absolute tolerance
        miter       maximum iterations
        substep     divide user-provided time increments into smaller values 
        verbose     print a lot of debug info
        steady      ignore thermal mass and use conduction only
    """
        self.rtol = pset.get_default("rtol", rtol)
        self.atol = pset.get_default("atol", atol)
        self.miter = pset.get_default("miter", miter)
        self.substep = pset.get_default("substep", substep)
        self.verbose = pset.get_default("verbose", verbose)
        self.steady = pset.get_default('steady', steady)
示例#2
0
def sample_parameters():
  params = solverparams.ParameterSet()

  params["nthreads"] = 2
  params["progress_bars"] = True

  params["thermal"]["rtol"] = 1.0e-6
  params["thermal"]["atol"] = 1.0e-8
  params["thermal"]["miter"] = 20
  params["thermal"]["substep"] = 5

  params["structural"]["rtol"] = 1.0e-6
  params["structural"]["atol"] = 1.0e-8
  params["structural"]["miter"] = 50
  params["structural"]["verbose"] = False
  params["structural"]["qorder"] = 1
  params["structural"]["dof_tol"] = 1.0e-6

  params["system"]["rtol"] = 1.0e-6
  params["system"]["atol"] = 1.0e-8
  params["system"]["miter"] = 50
  params["system"]["verbose"] = False
  # If true store results on disk (slower, but less memory)
  params["page_results"] = True

  return params
示例#3
0
    def __init__(
            self,
            receiver,
            thermal_solver,
            thermal_material,
            fluid_material,
            structural_solver,
            deformation_material,
            damage_material,
            system_solver,
            damage_model,
            pset=solverparams.ParameterSet(),
    ):
        self.receiver = receiver
        self.thermal_solver = thermal_solver
        self.thermal_material = thermal_material
        self.fluid_material = fluid_material
        self.structural_solver = structural_solver
        self.deformation_material = deformation_material
        self.damage_material = damage_material
        self.system_solver = system_solver
        self.damage_model = damage_model

        self.pset = pset
        self.nthreads = pset.get_default("nthreads", 1)
        self.progress = pset.get_default("progress_bars", False)

        self.page = pset.get_default("page_results", False)
        self.receiver.set_paging(self.page)

        self.heuristics = []
示例#4
0
def sample_parameters():
    params = solverparams.ParameterSet()

    params["nthreads"] = 1
    params["progress_bars"] = True
    # If true store results on disk (slower, but less memory)
    params["page_results"] = False

    params["thermal"]["rtol"] = 1.0e-6
    params["thermal"]["atol"] = 1.0e-4
    params["thermal"]["miter"] = 20

    params["structural"]["rtol"] = 1.0e-6
    params["structural"]["atol"] = 1.0e-8
    params["structural"]["miter"] = 50
    params["structural"]["verbose"] = False

    params["system"]["rtol"] = 1.0e-6
    params["system"]["atol"] = 1.0e-8
    params["system"]["miter"] = 10
    params["system"]["verbose"] = False

    # How to extrapolate damage forward in time based on the cycles provided
    # Options:
    #     "lump" = D_future = sum(D_simulated) / N * days
    #     "last" = D_future = sum(D_simulated[:-1]) + D_simulated[-1] * days
    #     "poly" = polynomial extrapolation with order given by the "order" param
    params["damage"]["extrapolate"] = "lump"
    params["damage"]["order"] = 2

    return params
示例#5
0
    def __init__(self,
                 pset=solverparams.ParameterSet(),
                 rtol=1.0e-6,
                 atol=1.0e-8,
                 qorder=1,
                 dof_tol=1.0e-6,
                 miter=10,
                 verbose=False):
        """
      Setup the solver with common parameters

      Additional Parameters:
        pset        parameter set with solver parameters
        rtol        relative tolerance for NR iterations
        atol        absolute tolerance for NR iterations
        qorder      quadrature order
        dof_tol     geometric tolerance on finding boundary
                    degrees of freedom
        miter       maximum newton-raphson iterations
        verbose     verbose solve
    """
        self.qorder = qorder
        self.rtol = pset.get_default("rtol", rtol)
        self.atol = pset.get_default("atol", atol)
        self.dof_tol = pset.get_default("dof_tol", dof_tol)
        self.miter = pset.get_default("miter", miter)
        self.verbose = pset.get_default("verbose", verbose)
        self.solver_options = {
            'rtol': self.rtol,
            'atol': self.atol,
            'dof_tol': self.dof_tol,
            'miter': self.miter,
            'verbose': self.verbose
        }
示例#6
0
    def __init__(
        self,
        pset=solverparams.ParameterSet(),
        rtol=1.0e-6,
        atol=1.0e-8,
        qorder=1,
        dof_tol=1.0e-6,
        miter=10,
        verbose=False,
        max_divide=4,
        force_divide=False,
        max_linesearch=10,
    ):
        """
        Setup the solver with common parameters

        Additional Parameters:
          pset:            parameter set with solver parameters
          rtol:            relative tolerance for NR iterations
          atol:            absolute tolerance for NR iterations
          qorder:          quadrature order
          dof_to:l         geometric tolerance on finding boundary
                           degrees of freedom
          miter:           maximum newton-raphson iterations
          verbose:         verbose solve
          max_divide:      maximum adaptive integration subdivisions
          force_divide:    force adaptive substeps, for tests or
                           accuracy checks
          max_linesearch   maximum line search cutbacks
        """
        self.qorder = qorder
        self.rtol = pset.get_default("rtol", rtol)
        self.atol = pset.get_default("atol", atol)
        self.dof_tol = pset.get_default("dof_tol", dof_tol)
        self.miter = pset.get_default("miter", miter)
        self.verbose = pset.get_default("verbose", verbose)
        self.max_divide = pset.get_default("max_divide", max_divide)
        self.force_divide = pset.get_default("force_divide", force_divide)
        self.max_search = pset.get_default("max_linesearch", max_linesearch)
        self.solver_options = {
            "rtol": self.rtol,
            "atol": self.atol,
            "dof_tol": self.dof_tol,
            "miter": self.miter,
            "verbose": self.verbose,
            "max_linesearch": self.max_search,
        }
示例#7
0
def sample_parameters():
  params = solverparams.ParameterSet()

  params["nthreads"] = 4
  params["progress_bars"] = True

  params["thermal"]["rtol"] = 1.0e-6
  params["thermal"]["atol"] = 1.0e-6
  params["thermal"]["miter"] = 20

  params["structural"]["rtol"] = 1.0e-6
  params["structural"]["atol"] = 1.0e-6
  params["structural"]["miter"] = 20

  params["system"]["rtol"] = 1.0e-6
  params["system"]["atol"] = 1.0e-6
  params["system"]["miter"] = 20
  params["system"]["verbose"] = False
  
  return params
示例#8
0
    def __init__(self,
                 pset=solverparams.ParameterSet(),
                 rtol=1.0e-6,
                 atol=1.0e-4,
                 miter=25,
                 verbose=False):
        """
      Initialize the solver

      Additional parameters:
        pset        parameter dictionary overriding the default solver params
        rtol        relative tolerance
        atol        absolute tolerance
        miter       number of permissible nonlinear iterations
        verbose     print a lot of debug info
    """
        self.rtol = pset.get_default("rtol", rtol)
        self.atol = pset.get_default("atol", atol)
        self.miter = pset.get_default("miter", miter)
        self.verbose = pset.get_default("verbose", verbose)
示例#9
0
def sample_parameters():
  params = solverparams.ParameterSet()

  params["nthreads"] = 3
  params["progress_bars"] = True

  params["thermal"]["rtol"] = 1.0e-6
  params["thermal"]["atol"] = 1.0e-6
  params["thermal"]["miter"] = 20

  params["structural"]["rtol"] = 1.0e-6
  params["structural"]["atol"] = 1.0e-6
  params["structural"]["miter"] = 20

  params["system"]["rtol"] = 1.0e-6
  params["system"]["atol"] = 1.0e-6
  params["system"]["miter"] = 20
  params["system"]["verbose"] = False
  
  # Extrapolate damage based on the last cycle
  params["damage"]["extrapolate"] = "last"
  
  return params
示例#10
0
    def setUp(self):

        # Case 1: Single stress tensor over 1 time step
        # self.stress = np.array([[100.0,25.0,50.0,0,0,0]])
        # self.temperatures = np.array([1.0])
        # self.volumes = np.array([0.1])

        # Case 2: Testing for multiple (principal) stress tensors over 2 time steps
        self.stress = np.array([
            [[100.0, 25.0, 50.0, 0, 0, 0], [-1.5, -25.0, -5.6, 0, 0, 0]],
            [[15.0, 6.0, 20.0, 0, 0, 0], [-15, 6, -20, 0, 0, 0]],
        ])
        self.temperatures = np.array([[1.0, 3.0], [100.0, 10.0]])
        self.volumes = np.array([[0.1, 0.1], [0.1, 0.1]])

        # Case 3: Testing for an entirely random stress tensor over 3 time steps
        # self.stress = np.array([[[14.0,-17.0,4.3,105,2,15.5],[15.0,25.0,5.0,0,0,0]],
        # [[-1.5,-25.0,-5.6,17.1,-6.6,-301],[54.0,-7.0,0.3,10,20,15.5]],[[-10.0,25.0,50.0,0,0,0],
        # [-1.0,-205.0,-56.0,-11.7,-0.6,-30]]])
        # self.temperatures = np.array([[1.0,3.0],[15.0,100.0],[10.0,11.0]])
        # self.volumes = np.array([[0.1,0.1],[0.1,0.1],[0.1,0.1]])

        self.s0 = 70
        self.m = 3.5
        self.c_bar = 0.8
        self.nu = 0.25

        self.material = materials.StandardCeramicMaterial(
            np.array([0, 1000.0]),
            np.array([self.s0, self.s0]),
            self.m,
            self.c_bar,
            self.nu,
        )

        self.model = damage.SMMModelPennyShapedFlaw(
            solverparams.ParameterSet())
示例#11
0
    # Choose the material models
    fluid_mat = library.load_fluid("salt",
                                   "base")  # Generic chloride salt  model
    # Base 316H thermal and damage models, a simplified deformation model to
    # cut down on the run time of the 3D analysis
    thermal_mat, deformation_mat, damage_mat = library.load_material(
        "316H", "base", "base", "base")

    # Cut down on run time for now by making the tube analyses 1D
    # This is not recommended for actual design evaluation
    for panel in model.panels.values():
        for tube in panel.tubes.values():
            tube.make_1D(tube.h / 2, 0)

    # Setup some solver parameters
    params = solverparams.ParameterSet()
    params[
        'progress_bars'] = True  # Print a progress bar to the screen as we solve
    params[
        'nthreads'] = 4  # Solve will run in multithreaded mode, set to number of available cores
    params['system'][
        'atol'] = 1.0e-4  # During the standby very little happens, lower the atol to accept this result

    # Choose the solvers, i.e. how we are going to solve the thermal,
    # single tube, structural system, and damage calculation problems.
    # Right now there is only one option for each
    # Define the thermal solver to use in solving the heat transfer problem
    thermal_solver = thermal.FiniteDifferenceImplicitThermalSolver(
        params["thermal"])
    # Define the structural solver to use in solving the individual tube problems
    structural_solver = structural.PythonTubeSolver(params["structural"])