class FluidChamber(DynamicalModel): VFluid = F.RealVariable(causality=CS.Parameter, variability=VR.Constant, default=0.1) pInit = F.RealVariable(causality=CS.Parameter, variability=VR.Constant, default=300e5) molarMass = F.RealVariable(causality=CS.Parameter, variability=VR.Constant, default=16e-3) RGas = F.RealVariable(causality=CS.Parameter, variability=VR.Constant) T = F.RealState(start=300) rho = F.RealState(start=1) p = F.RealVariable(causality=CS.Output) m = F.RealVariable(causality=CS.Output) QDotWall = F.RealVariable(causality=CS.Input) portWall = F.Port([p, T, QDotWall]) def initialize(self): self.RGas = 8.13 / self.molarMass self.rho = self.pInit / (self.RGas * self.rho * self.T) @F.Function(inputs=[T, rho], outputs=[p]) def setState(self, t): self.p = self.RGas * self.rho * self.T def compute(self, t): self.m = self.VFluid * self.rho self.der.rho = 0 self.der.T = self.QDotWall / self.m / (5. / 2 * self.RGas)
class ForceSource(DynamicalModel): f = F.RealVariable(causality=CS.Output, variability=VR.Constant, default=-10.) x = F.RealVariable(causality=CS.Input) v = F.RealVariable(causality=CS.Input) p = F.Port([f, v, x])
class WaterTower(DynamicalModel): ACrossSection = F.RealVariable(causality=CS.Parameter, variability=VR.Constant, default=1.0) hWater = F.RealState(start=0.5) mDotIn = F.RealVariable(causality=CS.Input) mDotOut = F.RealVariable(causality=CS.Input) p = F.RealVariable(causality=CS.Output) portIn = F.Port([p, mDotIn]) portOut = F.Port([p, mDotOut]) @F.Function(inputs=[hWater], outputs=[p]) def compute_p(self, t): self.p = 1e5 + 1000 * 9.8 * self.hWater def compute(self, t): self.der.hWater = (self.mDotIn + self.mDotOut) / 1000. / self.ACrossSection
class Valve(DynamicalModel): Kv = F.RealVariable(causality=CS.Parameter, variability=VR.Constant, default=2000.) VDot = F.RealVariable(causality=CS.Output) mDot1 = F.RealVariable(causality=CS.Output) mDot2 = F.RealVariable(causality=CS.Output) p1 = F.RealVariable(causality=CS.Input) p2 = F.RealVariable(causality=CS.Input) controlSignal = F.RealVariable(causality=CS.Input, default=1) port1 = F.Port([p1, mDot1]) port2 = F.Port([p2, mDot2]) def compute(self, t): N1 = 8.784e-07 if (self.p1 > self.p2): self.VDot = N1 * self.Kv * m.sqrt((self.p1 - self.p2) / 1.0) self.mDot2 = 1000 * self.VDot * self.controlSignal self.mDot1 = -self.mDot2 else: self.VDot = 0 self.mDot2 = 0 self.mDot1 = 0 print self.mDot1
class Convection(DynamicalModel): hConv = F.RealVariable(causality=CS.Parameter, variability=VR.Constant, default=10) area = F.RealVariable(causality=CS.Parameter, variability=VR.Constant, default=0.2) pFluid = F.RealVariable(causality=CS.Input) TFluid = F.RealVariable(causality=CS.Input) TWall = F.RealVariable(causality=CS.Input) QFluid = F.RealVariable(causality=CS.Output) QWall = F.RealVariable(causality=CS.Output) portFluid = F.Port([pFluid, TFluid, QFluid]) portWall = ThermalPort('R', TVar=TWall, QVar=QWall) def compute(self, t): self.QFluid = self.hConv * self.area * (self.TWall - self.TFluid) self.QWall = -self.QFluid
class BoundMass(DynamicalModel): m = F.RealVariable(causality=CS.Parameter, variability=VR.Constant, default=10.) f = F.RealVariable(causality=CS.Input, default=10.) x = F.RealState(start=0.1) v = F.RealState(start=1.) p = F.Port([f, v, x]) def compute(self, t): self.der.x = self.v self.der.v = self.f / self.m def checkBounce(self): return self.x @F.StateEvent(locate=checkBounce) def onBounce(self): if (self.v < 0): self.v = -0.9 * self.v
class FlowSource(DynamicalModel): mDot = F.RealVariable(causality=CS.Output, variability=VR.Constant, default=100.0) p = F.RealVariable(causality=CS.Input) port = F.Port([p, mDot])
class PressureSource(DynamicalModel): p = F.RealVariable(causality=CS.Output, variability=VR.Constant, default=1e5) mDot = F.RealVariable(causality=CS.Input) port = F.Port([p, mDot])