postprocess.py 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  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 = 500
  10. exactBasisFuncs = 5
  11. self.solution.coeff.numEle = exactNumEle
  12. self.solution.coeff.pOrder = exactBasisFuncs - 1
  13. self.solution.mesh = np.linspace(0, 1, exactNumEle + 1)
  14. # approximate the exact solution for general problems
  15. # self.exactSol = self.solution.solveLocal()[0][exactNumEle * exactBasisFuncs - 1]
  16. # for the reaction diffusion test problem, we know the exact solution
  17. self.exactSol = np.sqrt(self.solution.kappa)
  18. def errorL2(self):
  19. errorL2 = 0.
  20. numEle = self.solution.coeff.numEle
  21. numBasisFuncs = self.solution.coeff.pOrder + 1
  22. # solve on the uniform mesh
  23. self.solution.mesh = np.linspace(0, 1, numEle + 1)
  24. U = self.solution.solveLocal()[0]
  25. errorL2 = np.abs(U[numBasisFuncs * numEle - 1] - self.exactSol)
  26. return errorL2
  27. def uniConv(self):
  28. numBasisFuncs = np.arange(
  29. self.solution.numBasisFuncs, self.solution.numBasisFuncs + 1)
  30. numEle = 2**np.arange(1, 9)
  31. uniError = np.zeros((numEle.size, numBasisFuncs.size))
  32. for i in range(numBasisFuncs.size):
  33. self.solution.coeff.pOrder = numBasisFuncs[i] - 1
  34. for j, n in enumerate(numEle):
  35. self.solution.coeff.numEle = n
  36. uniError[j, i] = self.errorL2()
  37. return numEle, uniError
  38. def convHistory(self):
  39. """Plot the uniform and adaptive convergence history"""
  40. plt.figure(2)
  41. trueErrorList = self.solution.trueErrorList
  42. trueErrorList[1] = np.abs(trueErrorList[1] - self.exactSol)
  43. estErrorList = self.solution.estErrorList
  44. plt.loglog(trueErrorList[0],
  45. trueErrorList[1], '-ro')
  46. numEle, errorL2 = self.uniConv()
  47. plt.loglog(numEle, errorL2, '-o')
  48. plt.loglog(estErrorList[0],
  49. estErrorList[1], '--', color='#1f77b4')
  50. plt.xlabel('Number of elements', fontsize=17)
  51. plt.ylabel('Error', fontsize=17)
  52. plt.grid()
  53. plt.legend(('Adaptive', 'Uniform', 'Estimator'), loc=3, fontsize=15)
  54. plt.show()