def A1(self, x, t): # third-type # Equation (38) U = math.sqrt(self._v*self._v+4.*self._D*self._R* \ (self._lambda-self._alpha)) # Equation (37) A1_ = \ self._v/(self._v+U)* \ exp_erf(0.5*x*(self._v-U)/self._D, 0.5*(self._R*x-U*t)/math.sqrt(self._D*self._R*t))+ \ self._v/(self._v-U)* \ exp_erf(0.5*x*(self._v+U)/self._D, 0.5*(self._R*x+U*t)/math.sqrt(self._D*self._R*t))+ \ 0.5*self._v*self._v/(self._D*self._R*(self._lambda-self._alpha))* \ exp_erf(self._v*x/self._D+(self._alpha-self._lambda)*t, 0.5*(self._R*x+self._v*t)/math.sqrt(self._D*self._R*t)) return A1_
def A1_constant(self, x, t): # first-type # Equation (42) U = math.sqrt(self._v * self._v + 4. * self._D * self._R * self._lambda) # Equation (41) A1_constant_ = \ self._v/(self._v+U)* \ exp_erf(0.5*x*(self._v-U)/self._D, 0.5*(self._R*x-U*t)/math.sqrt(self._D*self._R*t))+ \ self._v/(self._v-U)* \ exp_erf(0.5*x*(self._v+U)/self._D, 0.5*(self._R*x+U*t)/math.sqrt(self._D*self._R*t))+ \ 0.5*self._v*self._v/(self._D*self._R*self._lambda)* \ exp_erf(self._v*x/self._D-self._lambda*t, 0.5*(self._R*x+self._v*t)/math.sqrt(self._D*self._R*t)) return A1_constant_
def A3(self, x, t): # first-type # Equation (46) A3_ = \ 0.5*math.erfc(0.5*(x-self._v*t)/math.sqrt(self._D*t))+ \ math.sqrt(self._v*self._v*t/(math.pi*self._D))* \ math.exp(-0.25*(x-self._v*t)*(x-self._v*t)/(self._D*t)) - \ 0.5*(1.+self._v*x/self._D+self._v*self._v*t/self._D)* \ exp_erf(self._v*x/self._D, 0.5*(x+self._v*t)/math.sqrt(self._D*t)) return A3_
def A2(self, x, t): # first-type # Equation (39) A2_ = \ 0.5*math.erfc(0.5*(self._R*x-self._v*t)/ \ math.sqrt(self._D*self._R*t))+ \ math.sqrt(self._v*self._v*t/(math.pi*self._D*self._R))* \ math.exp(-0.25*(self._R*x-self._v*t)*(self._R*x-self._v*t)/ \ (self._D*self._R*t))- \ 0.5*(1.+self._v*x/self._D+self._v*self._v*t/(self._D*self._R))* \ exp_erf(self._v*x/self._D, 0.5*(self._R*x+self._v*t)/math.sqrt(self._D*self._R*t)) return A2_
def get_solution(self, t): debug_push('Ogata get_solution') dx = self._Lx / self._nx c = np.zeros(self._nx) x = self.get_rounded_even_spaced_numbers(dx, self._nx) # Equations following (12), but prior ot (13) for i in range(self._nx): xx = x[i] twosqrtDT = 2. * math.sqrt(self._D * t) c[i] = 0.5*(special.erfc((xx-self._v*t)/twosqrtDT) + \ exp_erf(self._v*xx/self._D, \ (xx+self._v*t)/twosqrtDT)) c[:] *= self._c0 debug_pop() return x, c