postprocess.py 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. """
  2. A module for postprocessing the numerical results from HDPG1d solver.
  3. """
  4. import matplotlib.pyplot as plt
  5. import numpy as np
  6. class utils(object):
  7. def __init__(self, solution):
  8. self.solution = solution
  9. exactNumEle = 200
  10. exactBasisFuncs = 5
  11. self.solution.numEle = exactNumEle
  12. self.solution.numBasisFuncs = exactBasisFuncs
  13. x = np.linspace(0, 1, exactNumEle + 1)
  14. self.exactSol = self.solution.solve_local(
  15. [], x)[0].A1[exactNumEle * exactBasisFuncs - 1]
  16. def errorL2(self):
  17. errorL2 = 0.
  18. n_ele = self.solution.numEle
  19. p = self.solution.numBasisFuncs
  20. # solve the uniform case
  21. x = np.linspace(0, 1, n_ele + 1)
  22. U, _ = self.solution.solve_local([], x)
  23. errorL2 = np.abs(U[p * n_ele - 1] - self.exactSol)
  24. return errorL2
  25. def uniConv(self):
  26. numBasisFuncs = np.arange(2, 3)
  27. numEle = 2**np.arange(1, 9)
  28. uniError = np.zeros((numEle.size, numBasisFuncs.size))
  29. for i in range(numBasisFuncs.size):
  30. self.solution.numBasisFuncs = numBasisFuncs[i]
  31. for j, n in enumerate(numEle):
  32. self.solution.numEle = n
  33. uniError[j, i] = self.errorL2()
  34. return numEle, uniError
  35. def convHistory(self):
  36. trueError = self.solution.trueError
  37. estError = self.solution.estError
  38. plt.loglog(trueError[0, 0:-1],
  39. trueError[1, 0:-1], '-ro')
  40. # plt.axis([1, 250, 1e-13, 1e-2])
  41. numEle, errorL2 = self.uniConv()
  42. plt.loglog(numEle, errorL2, '-o')
  43. plt.loglog(estError[0, :],
  44. estError[1, :], '--', color='#1f77b4')
  45. plt.xlabel('Number of elements', fontsize=17)
  46. plt.ylabel('Error', fontsize=17)
  47. plt.grid()
  48. plt.legend(('Adaptive', 'Uniform', 'Estimator'), loc=3, fontsize=15)
  49. plt.show()