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)
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
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 = []
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
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 }
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, }
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
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)
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
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())
# 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"])