def u_exact(self,t): """ Routine to compute the exact solution at time t Args: t: current time Returns: exact solution """ me = mesh(self.nvars) for i in range(self.lambda_s.size): for j in range(self.lambda_f.size): me.values[i,j] = self.u0*np.exp((self.lambda_f[j]+self.lambda_s[i])*t) return me
def __eval_fexpl(self,u,t): """ Helper routine to evaluate the explicit part of the RHS Args: u: current values t: current time (not used here) Returns: explicit part of RHS """ fexpl = mesh(self.nvars) for i in range(self.lambda_s.size): for j in range(self.lambda_f.size): fexpl.values[i,j] = self.lambda_s[i]*u.values[i,j] return fexpl
def __eval_fexpl(self, u, t): """ Helper routine to evaluate the explicit part of the RHS Args: u: current values t: current time (not used here) Returns: explicit part of RHS """ fexpl = mesh(self.nvars) for i in range(self.lambda_s.size): for j in range(self.lambda_f.size): fexpl.values[i, j] = self.lambda_s[i] * u.values[i, j] return fexpl
def u_exact(self, t): """ Routine to compute the exact solution at time t Args: t: current time Returns: exact solution """ me = mesh(self.nvars) for i in range(self.lambda_s.size): for j in range(self.lambda_f.size): me.values[i, j] = self.u0 * np.exp( (self.lambda_f[j] + self.lambda_s[i]) * t) return me
def solve_system(self,rhs,factor,u0,t): """ Simple linear solver for (I-dtA)u = rhs Args: rhs: right-hand side for the nonlinear system factor: abbrev. for the node-to-node stepsize (or any other factor required) u0: initial guess for the iterative solver (not used here so far) t: current time (e.g. for time-dependent BCs) Returns: solution as mesh """ me = mesh(self.nvars) for i in range(self.lambda_s.size): for j in range(self.lambda_f.size): me.values[i,j] = rhs.values[i,j]/(1.0-factor*self.lambda_f[j]) return me
def solve_system(self, rhs, factor, u0): """ Simple linear solver for (I-dtA)u = rhs Args: rhs: right-hand side for the nonlinear system factor: abbrev. for the node-to-node stepsize (or any other factor required) u0: initial guess for the iterative solver (not used here so far) Returns: solution as mesh """ me = mesh(self.nvars) for i in range(self.lambda_s.size): for j in range(self.lambda_f.size): me.values[i, j] = rhs.values[i, j] / (1 - factor * self.lambda_f[j]) return me