To reference or cite the objects present in the Software Heritage archive, permalinks based on SoftWare Heritage persistent IDentifiers (SWHIDs) must be used instead of copying and pasting the url from the address bar of the browser (as there is no guarantee the current URI scheme will remain the same over time).
Select below a type of object currently browsed in order to display its associated SWHID and permalink.
Merged r18932, r19073, and r19192 from trunk to v3.1 branch
#!/usr/bin/env python # # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ # #<LicenseText> # # CitcomS.py by Eh Tan, Eun-seo Choi, and Pururav Thoutireddy. # Copyright (C) 2002-2005, California Institute of Technology. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # #</LicenseText> # # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ # def controller(name="controller", facility="controller"): return Controller(name, facility) from pyre.components.Component import Component import journal class Controller(Component): def __init__(self, name, facility): Component.__init__(self, name, facility) self.done = False self.solver = None return # Set these attributes as read-only properties, so that they are # always in accordance with their counterparts in the C code clock = property(lambda self: self.solver.t) dt = property(lambda self: self.solver.dt) step = property(lambda self: self.solver.step) def initialize(self, app): self.solver = app.solver self.solver.initialize(app) return def launch(self, app): '''Setup initial conditions. ''' # initial conditions and 0th step self.solver.launch(app) # do io for 0th step self.save() # no need to write checkpoint files if restarting from # old checkpoint if not self.solver.inventory.ic.inventory.restart: self.checkpoint() return def march(self, totalTime=0, steps=0): """explicit time loop""" # special treatment for steps=1, where only 0th step is computed # this means that one can never request a run with (0th, 1st) steps if (self.step + 1) >= steps: self.endSimulation() return while 1: # notify solver we are starting a new timestep self.startTimestep() # compute an acceptable timestep dt = self.stableTimestep() # advance to the next step by dt self.advance(dt) # notify solver we finished a timestep self.endTimestep(totalTime, steps) # do io self.save() self.checkpoint() # are we done? if self.done: break # end of time advance loop # Notify solver we are done self.endSimulation() return def startTimestep(self): self.solver.newStep() return def stableTimestep(self): dt = self.solver.stableTimestep() return dt def advance(self, dt): self.solver.advance(dt) return def endTimestep(self, totalTime, steps): # are we done? if steps and self.step >= steps: self.done = True if totalTime and self.clock >= totalTime: self.done = True # solver can terminate time marching by returning True self.done = self.solver.endTimestep(self.done) return def endSimulation(self): self.solver.endSimulation() return def save(self): self.solver.save(self.inventory.monitoringFrequency) return def checkpoint(self): self.solver.checkpoint(self.inventory.checkpointFrequency) return class Inventory(Component.Inventory): import pyre.inventory monitoringFrequency = pyre.inventory.int("monitoringFrequency", default=100) checkpointFrequency = pyre.inventory.int("checkpointFrequency", default=100)