303_LaplaceEquation.py 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. import sys, os
  2. # Add the igl library to the modules search path
  3. sys.path.insert(0, os.getcwd() + "/../")
  4. import pyigl as igl
  5. from shared import TUTORIAL_SHARED_PATH, check_dependencies
  6. dependencies = ["viewer"]
  7. check_dependencies(dependencies)
  8. V = igl.eigen.MatrixXd()
  9. F = igl.eigen.MatrixXi()
  10. igl.readOFF(TUTORIAL_SHARED_PATH + "camelhead.off", V, F)
  11. # Find boundary edges
  12. E = igl.eigen.MatrixXi()
  13. igl.boundary_facets(F, E)
  14. # Find boundary vertices
  15. b = igl.eigen.MatrixXi()
  16. IA = igl.eigen.MatrixXi()
  17. IC = igl.eigen.MatrixXi()
  18. igl.unique(E, b, IA, IC)
  19. # List of all vertex indices
  20. vall = igl.eigen.MatrixXi()
  21. vin = igl.eigen.MatrixXi()
  22. igl.coloni(0, V.rows() - 1, vall)
  23. # List of interior indices
  24. igl.setdiff(vall, b, vin, IA)
  25. # Construct and slice up Laplacian
  26. L = igl.eigen.SparseMatrixd()
  27. L_in_in = igl.eigen.SparseMatrixd()
  28. L_in_b = igl.eigen.SparseMatrixd()
  29. igl.cotmatrix(V, F, L)
  30. igl.slice(L, vin, vin, L_in_in)
  31. igl.slice(L, vin, b, L_in_b)
  32. # Dirichlet boundary conditions from z-coordinate
  33. bc = igl.eigen.MatrixXd()
  34. Z = V.col(2)
  35. igl.slice(Z, b, bc)
  36. # Solve PDE
  37. solver = igl.eigen.SimplicialLLTsparse(-L_in_in)
  38. Z_in = solver.solve(L_in_b * bc)
  39. # slice into solution
  40. igl.slice_into(Z_in, vin, Z)
  41. # Alternative, short hand
  42. mqwf = igl.min_quad_with_fixed_data()
  43. # Linear term is 0
  44. B = igl.eigen.MatrixXd()
  45. B.setZero(V.rows(), 1)
  46. # Empty constraints
  47. Beq = igl.eigen.MatrixXd()
  48. Aeq = igl.eigen.SparseMatrixd()
  49. # Our cotmatrix is _negative_ definite, so flip sign
  50. igl.min_quad_with_fixed_precompute(-L, b, Aeq, True, mqwf)
  51. igl.min_quad_with_fixed_solve(mqwf, B, bc, Beq, Z)
  52. # Pseudo-color based on solution
  53. C = igl.eigen.MatrixXd()
  54. igl.jet(Z, True, C)
  55. # Plot the mesh with pseudocolors
  56. viewer = igl.viewer.Viewer()
  57. viewer.data.set_mesh(V, F)
  58. viewer.core.show_lines = False
  59. viewer.data.set_colors(C)
  60. viewer.launch()