def runSimpleTrenchSystem(faradaysConstant=9.6e4, gasConstant=8.314, transferCoefficient=0.5, rateConstant0=1.76, rateConstant3=-245e-6, catalystDiffusion=1e-9, siteDensity=9.8e-6, molarVolume=7.1e-6, charge=2, metalDiffusion=5.6e-10, temperature=298., overpotential=-0.3, metalConcentration=250., catalystConcentration=5e-3, catalystCoverage=0., currentDensity0=0.26, currentDensity1=45., cellSize=0.1e-7, trenchDepth=0.5e-6, aspectRatio=2., trenchSpacing=0.6e-6, boundaryLayerDepth=0.3e-6, numberOfSteps=5, displayViewers=True): cflNumber = 0.2 numberOfCellsInNarrowBand = 10 cellsBelowTrench = 10 yCells = cellsBelowTrench \ + int((trenchDepth + boundaryLayerDepth) / cellSize) xCells = int(trenchSpacing / 2 / cellSize) from fipy.tools import serialComm mesh = Grid2D(dx=cellSize, dy=cellSize, nx=xCells, ny=yCells, communicator=serialComm) narrowBandWidth = numberOfCellsInNarrowBand * cellSize distanceVar = DistanceVariable(name='distance variable', mesh=mesh, value=-1., hasOld=1) bottomHeight = cellsBelowTrench * cellSize trenchHeight = bottomHeight + trenchDepth trenchWidth = trenchDepth / aspectRatio sideWidth = (trenchSpacing - trenchWidth) / 2 x, y = mesh.cellCenters distanceVar.setValue(1., where=(y > trenchHeight) | ((y > bottomHeight) & (x < xCells * cellSize - sideWidth))) distanceVar.calcDistanceFunction(order=2) catalystVar = SurfactantVariable(name="catalyst variable", value=catalystCoverage, distanceVar=distanceVar) bulkCatalystVar = CellVariable(name='bulk catalyst variable', mesh=mesh, value=catalystConcentration) metalVar = CellVariable(name='metal variable', mesh=mesh, value=metalConcentration) expoConstant = -transferCoefficient * faradaysConstant \ / (gasConstant * temperature) tmp = currentDensity1 * catalystVar.interfaceVar exchangeCurrentDensity = currentDensity0 + tmp expo = numerix.exp(expoConstant * overpotential) currentDensity = expo * exchangeCurrentDensity * metalVar \ / metalConcentration depositionRateVariable = currentDensity * molarVolume \ / (charge * faradaysConstant) extensionVelocityVariable = CellVariable(name='extension velocity', mesh=mesh, value=depositionRateVariable) surfactantEquation = AdsorbingSurfactantEquation( surfactantVar=catalystVar, distanceVar=distanceVar, bulkVar=bulkCatalystVar, rateConstant=rateConstant0 + rateConstant3 * overpotential**3) advectionEquation = TransientTerm() + AdvectionTerm( extensionVelocityVariable) metalEquation = buildMetalIonDiffusionEquation( ionVar=metalVar, distanceVar=distanceVar, depositionRate=depositionRateVariable, diffusionCoeff=metalDiffusion, metalIonMolarVolume=molarVolume, ) metalVar.constrain(metalConcentration, mesh.facesTop) from surfactantBulkDiffusionEquation import buildSurfactantBulkDiffusionEquation bulkCatalystEquation = buildSurfactantBulkDiffusionEquation( bulkVar=bulkCatalystVar, distanceVar=distanceVar, surfactantVar=catalystVar, diffusionCoeff=catalystDiffusion, rateConstant=rateConstant0 * siteDensity) bulkCatalystVar.constrain(catalystConcentration, mesh.facesTop) if displayViewers: try: from mayaviSurfactantViewer import MayaviSurfactantViewer viewer = MayaviSurfactantViewer(distanceVar, catalystVar.interfaceVar, zoomFactor=1e6, datamax=0.5, datamin=0.0, smooth=1, title='catalyst coverage') except: viewer = MultiViewer( viewers=(Viewer(distanceVar, datamin=-1e-9, datamax=1e-9), Viewer(catalystVar.interfaceVar))) else: viewer = None levelSetUpdateFrequency = int(0.8 * narrowBandWidth \ / (cellSize * cflNumber * 2)) for step in range(numberOfSteps): if step > 5 and step % 5 == 0 and viewer is not None: viewer.plot() if step % levelSetUpdateFrequency == 0: distanceVar.calcDistanceFunction(order=2) extensionVelocityVariable.setValue(depositionRateVariable()) distanceVar.updateOld() distanceVar.extendVariable(extensionVelocityVariable, order=2) dt = cflNumber * cellSize / extensionVelocityVariable.max() advectionEquation.solve(distanceVar, dt=dt) surfactantEquation.solve(catalystVar, dt=dt) metalEquation.solve(metalVar, dt=dt) bulkCatalystEquation.solve(bulkCatalystVar, dt=dt, solver=GeneralSolver(tolerance=1e-15, iterations=2000)) try: import os filepath = os.path.splitext(__file__)[0] + '.gz' print catalystVar.allclose(numerix.loadtxt(filepath), rtol=1e-4) except: return 0
distanceToTravel = L / 5. boxSize = .2 nx = int(L / dx) ny = int(L / dx) steps = int(distanceToTravel / dx / cfl) timeStepDuration = cfl * dx / velocity mesh = Grid2D(dx=dx, dy=dx, nx=nx, ny=ny) x0 = (L - boxSize) / 2 x1 = (L + boxSize) / 2 distanceVariable = DistanceVariable(mesh=mesh, value=1., hasOld=1) x, y = mesh.cellCenters distanceVariable.setValue(-1, where=((x0 < x) & (x < x1)) & ((x0 < y) & (y < x1))) surfactantVariable = SurfactantVariable(distanceVar=distanceVariable, value=1.) from fipy.variables.surfactantConvectionVariable import SurfactantConvectionVariable surfactantEquation = TransientTerm() - \ ExplicitUpwindConvectionTerm(SurfactantConvectionVariable(distanceVariable)) advectionEquation = TransientTerm() + AdvectionTerm(velocity) if __name__ == '__main__': distanceViewer = Viewer(vars=distanceVariable, datamin=-.001, datamax=.001)
from fipy import Grid2D, DistanceVariable, Viewer from fipy.tools import numerix dx = 0.5 dy = 2. nx = 5 ny = 5 Lx = nx * dx Ly = ny * dy mesh = Grid2D(dx = dx, dy = dy, nx = nx, ny = ny) var = DistanceVariable( name = 'level set variable', mesh = mesh, value = -1., hasOld = 1 ) x, y = mesh.cellCenters var.setValue(1, where=((Lx / 3. < x) & (x < 2. * Lx / 3.)) & ((Ly / 3. < y) & (y < 2. * Ly / 3))) if __name__ == '__main__': var.calcDistanceFunction(order=1) viewer = Viewer(vars=var, maxval=-5., minval=5.) viewer.plot() input('finished')
siteDensity = 1. cinf = 1. nx = 100 totalTimeSteps = 100 dt = 0.001 ## build the mesh dx = L / (nx - 1.5) mesh = Grid1D(nx=nx, dx=dx, communicator=serialComm) ## build the distance variable value = mesh.cellCenters[0] - 1.499 * dx ##distanceVar = DistanceVariable(mesh = mesh, value = dx * (arange(nx) - 0.999)) distanceVar = DistanceVariable(mesh=mesh, value=value, hasOld=1) ## Build the bulk diffusion equation bulkVar = CellVariable(mesh=mesh, value=cinf) surfactantVar = SurfactantVariable(distanceVar=distanceVar) from .surfactantBulkDiffusionEquation import buildSurfactantBulkDiffusionEquation bulkEqn = buildSurfactantBulkDiffusionEquation(bulkVar, distanceVar=distanceVar, surfactantVar=surfactantVar, diffusionCoeff=diffusion, rateConstant=rateConstant * siteDensity)
def runSimpleTrenchSystem(faradaysConstant=9.6e4, gasConstant=8.314, transferCoefficient=0.5, rateConstant0=1.76, rateConstant3=-245e-6, catalystDiffusion=1e-9, siteDensity=9.8e-6, molarVolume=7.1e-6, charge=2, metalDiffusion=5.6e-10, temperature=298., overpotential=-0.3, metalConcentration=250., catalystConcentration=5e-3, catalystCoverage=0., currentDensity0=0.26, currentDensity1=45., cellSize=0.1e-7, trenchDepth=0.5e-6, aspectRatio=2., trenchSpacing=0.6e-6, boundaryLayerDepth=0.3e-6, numberOfSteps=5, displayViewers=True): cflNumber = 0.2 numberOfCellsInNarrowBand = 10 cellsBelowTrench = 10 yCells = cellsBelowTrench \ + int((trenchDepth + boundaryLayerDepth) / cellSize) xCells = int(trenchSpacing / 2 / cellSize) from fipy.tools import serialComm mesh = Grid2D(dx = cellSize, dy = cellSize, nx = xCells, ny = yCells, communicator=serialComm) narrowBandWidth = numberOfCellsInNarrowBand * cellSize distanceVar = DistanceVariable( name = 'distance variable', mesh = mesh, value = -1., hasOld = 1) bottomHeight = cellsBelowTrench * cellSize trenchHeight = bottomHeight + trenchDepth trenchWidth = trenchDepth / aspectRatio sideWidth = (trenchSpacing - trenchWidth) / 2 x, y = mesh.cellCenters distanceVar.setValue(1., where=(y > trenchHeight) | ((y > bottomHeight) & (x < xCells * cellSize - sideWidth))) distanceVar.calcDistanceFunction(order=2) catalystVar = SurfactantVariable( name = "catalyst variable", value = catalystCoverage, distanceVar = distanceVar) bulkCatalystVar = CellVariable( name = 'bulk catalyst variable', mesh = mesh, value = catalystConcentration) metalVar = CellVariable( name = 'metal variable', mesh = mesh, value = metalConcentration) expoConstant = -transferCoefficient * faradaysConstant / (gasConstant * temperature) tmp = currentDensity1 * catalystVar.interfaceVar exchangeCurrentDensity = currentDensity0 + tmp expo = numerix.exp(expoConstant * overpotential) currentDensity = expo * exchangeCurrentDensity * metalVar / metalConcentration depositionRateVariable = currentDensity * molarVolume / (charge * faradaysConstant) extensionVelocityVariable = CellVariable( name = 'extension velocity', mesh = mesh, value = depositionRateVariable) surfactantEquation = AdsorbingSurfactantEquation( surfactantVar = catalystVar, distanceVar = distanceVar, bulkVar = bulkCatalystVar, rateConstant = rateConstant0 + rateConstant3 * overpotential**3) advectionEquation = TransientTerm() + AdvectionTerm(extensionVelocityVariable) metalEquation = buildMetalIonDiffusionEquation( ionVar = metalVar, distanceVar = distanceVar, depositionRate = depositionRateVariable, diffusionCoeff = metalDiffusion, metalIonMolarVolume = molarVolume, ) metalVar.constrain(metalConcentration, mesh.facesTop) from .surfactantBulkDiffusionEquation import buildSurfactantBulkDiffusionEquation bulkCatalystEquation = buildSurfactantBulkDiffusionEquation( bulkVar = bulkCatalystVar, distanceVar = distanceVar, surfactantVar = catalystVar, diffusionCoeff = catalystDiffusion, rateConstant = rateConstant0 * siteDensity ) bulkCatalystVar.constrain(catalystConcentration, mesh.facesTop) if displayViewers: try: from .mayaviSurfactantViewer import MayaviSurfactantViewer viewer = MayaviSurfactantViewer(distanceVar, catalystVar.interfaceVar, zoomFactor = 1e6, datamax=0.5, datamin=0.0, smooth = 1, title = 'catalyst coverage') except: viewer = MultiViewer(viewers=( Viewer(distanceVar, datamin=-1e-9, datamax=1e-9), Viewer(catalystVar.interfaceVar))) else: viewer = None levelSetUpdateFrequency = int(0.8 * narrowBandWidth \ / (cellSize * cflNumber * 2)) for step in range(numberOfSteps): if step>5 and step % 5 == 0 and viewer is not None: viewer.plot() if step % levelSetUpdateFrequency == 0: distanceVar.calcDistanceFunction(order=2) extensionVelocityVariable.setValue(depositionRateVariable()) distanceVar.updateOld() distanceVar.extendVariable(extensionVelocityVariable, order=2) dt = cflNumber * cellSize / extensionVelocityVariable.max() advectionEquation.solve(distanceVar, dt = dt) surfactantEquation.solve(catalystVar, dt = dt) metalEquation.solve(metalVar, dt = dt) bulkCatalystEquation.solve(bulkCatalystVar, dt = dt, solver=GeneralSolver(tolerance=1e-15, iterations=2000)) try: import os filepath = os.path.splitext(__file__)[0] + '.gz' print(catalystVar.allclose(numerix.loadtxt(filepath), rtol = 1e-4)) except: return 0
nx = 50 velocity = 1. cfl = 0.1 velocity = 1. distanceToTravel = L / 10. initialRadius = L / 4. dx = L / nx timeStepDuration = cfl * dx / velocity steps = int(distanceToTravel / dx / cfl) mesh = Grid2D(dx = dx, dy = dx, nx = nx, ny = nx) distanceVariable = DistanceVariable( name = 'level set variable', mesh = mesh, value = 1., hasOld = 1 ) x, y = mesh.cellCenters cellRadius = numerix.sqrt((x - L / 2.)**2 + (y - L / 2.)**2) distanceVariable.setValue(cellRadius - initialRadius) initialSurfactantValue = 1. surfactantVariable = SurfactantVariable( value = initialSurfactantValue, distanceVar = distanceVariable ) advectionEquation = TransientTerm() + AdvectionTerm(velocity)
__docformat__ = 'restructuredtext' from fipy import Grid2D, DistanceVariable, Viewer from fipy.tools import numerix, serialComm dx = 1. dy = 1. nx = 5 ny = 5 Lx = nx * dx Ly = ny * dy mesh = Grid2D(dx=dx, dy=dy, nx=nx, ny=ny, communicator=serialComm) var = DistanceVariable(name='level set variable', mesh=mesh, value=-1., hasOld=1) x, y = mesh.cellCenters var.setValue(1, where=((x < dx) | (x > (Lx - dx)) | (y < dy) | (y > (Ly - dy)))) if __name__ == '__main__': var.calcDistanceFunction(order=1) viewer = Viewer(vars=var, datamin=-5., datamax=5.) viewer.plot() input('finished')
from fipy import Grid2D, DistanceVariable, Viewer from fipy.tools import numerix, serialComm dx = 1. dy = 1. nx = 5 ny = 5 Lx = nx * dx Ly = ny * dy mesh = Grid2D(dx = dx, dy = dy, nx = nx, ny = ny, communicator=serialComm) var = DistanceVariable( name = 'level set variable', mesh = mesh, value = -1., hasOld = 1 ) x, y = mesh.cellCenters var.setValue(1, where=((x < dx) | (x > (Lx - dx)) | (y < dy) | (y > (Ly - dy)))) if __name__ == '__main__': var.calcDistanceFunction(order=1) viewer = Viewer(vars=var, datamin=-5., datamax=5.) viewer.plot() input('finished')
L = 1. nx = 50 cfl = 0.1 initialRadius = L / 4. k = 1 dx = L / nx steps = 20 from fipy.tools import serialComm mesh = Grid2D(dx=dx, dy=dx, nx=nx, ny=nx, communicator=serialComm) x, y = mesh.cellCenters distanceVariable = DistanceVariable( name='level set variable', mesh=mesh, value=numerix.sqrt((x - L / 2.)**2 + (y - L / 2.)**2) - initialRadius, hasOld=1) initialSurfactantValue = 1. surfactantVariable = SurfactantVariable(value=initialSurfactantValue, distanceVar=distanceVariable) velocity = CellVariable( name='velocity', mesh=mesh, value=1., ) advectionEquation = TransientTerm() + AdvectionTerm(velocity)