(self, residual)
| 127 | self.pre.Update() |
| 128 | |
| 129 | def CheckResidual(self, residual): |
| 130 | self.iterations += 1 |
| 131 | self.residuals.append(residual) |
| 132 | if len(self.residuals) == 1: |
| 133 | if self.tol is None: |
| 134 | self._final_residual = self.atol |
| 135 | else: |
| 136 | self._final_residual = residual * self.tol |
| 137 | if self.atol is not None: |
| 138 | self._final_residual = max(self._final_residual, self.atol) |
| 139 | else: |
| 140 | if self.callback is not None: |
| 141 | self.callback(self.iterations, residual) |
| 142 | if self.callback_sol is not None: |
| 143 | self.callback_sol(self.sol) |
| 144 | if self.residuals[0] != 0: |
| 145 | logerrstop = log(self._final_residual) |
| 146 | logerrfirst = log(self.residuals[0]) |
| 147 | if residual == 0: |
| 148 | _SetThreadPercentage(100) |
| 149 | else: |
| 150 | _SetThreadPercentage(100.*max(self.iterations/self.maxiter, |
| 151 | (log(residual)-logerrfirst)/(logerrstop - logerrfirst))) |
| 152 | if self.printrates: |
| 153 | print("{}{} iteration {}, residual = {} ".format(_clear_line_command, self.name, self.iterations, residual), end="\n" if isinstance(self.printrates, bool) else self.printrates) |
| 154 | if self.iterations == self.maxiter and residual > self._final_residual: |
| 155 | print("{}WARNING: {} did not converge to TOL".format(_clear_line_command, self.name)) |
| 156 | is_converged = self.iterations >= self.maxiter or residual <= self._final_residual |
| 157 | if is_converged and self.printrates == "\r": |
| 158 | print("{}{} {}converged in {} iterations to residual {}".format(_clear_line_command, self.name, "NOT " if residual >= self._final_residual else "", self.iterations, residual)) |
| 159 | |
| 160 | # if self.plotrates: |
| 161 | if False: |
| 162 | if self.iterations==1: |
| 163 | import matplotlib.pyplot as plt |
| 164 | from IPython.display import display, clear_output |
| 165 | fig, ax = plt.subplots() |
| 166 | self.plt = plt |
| 167 | self.ax = ax |
| 168 | self.fig = fig |
| 169 | self.its = [] |
| 170 | self.ress = [] |
| 171 | self.clear_output=clear_output |
| 172 | self.display=display |
| 173 | plt.ioff() |
| 174 | plt.show() |
| 175 | self.its.append(self.iterations) |
| 176 | self.ress.append(residual) |
| 177 | # update_plot(plt, ax, self.its, self.ress) |
| 178 | self.ax.clear() |
| 179 | self.ax.semilogy(self.its, self.ress, label='error') |
| 180 | self.ax.set_xlabel('iteration') |
| 181 | self.ax.set_ylabel('error') |
| 182 | self.ax.set_title('CG Solver Convergence') |
| 183 | self.ax.legend() |
| 184 | self.plt.draw() |
| 185 | self.clear_output(wait=True) |
| 186 | self.display(self.fig) |
no test coverage detected