Guest User

Untitled

a guest
Oct 23rd, 2017
92
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.53 KB | None | 0 0
  1. https://mathematica.stackexchange.com/questions/156900/can-any-one-help-me-
  2. make-my-program-work-faster
  3.  
  4. avec = {{1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, {0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
  5. 0, 0}, {0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0}};
  6. nvec = {1, 2, 3, 4, 5, 6, 1, 2, 3, 4, 5, 6};
  7. svec = {-1, -1, -1, -1, -1, -1, 1, 1, 1, 1, 1, 1};
  8. ne = 3;
  9. nμ = 12;
  10. δ = -50;
  11. β = 1;
  12. kdfxn[i_, j_] := If[i == j, 1, 0]
  13.  
  14. cfxn = Block[{n1a, n1b, n2a, n2b},
  15. With[{code = Which[
  16. n1a == n1b && n2a == n2b,
  17. Evaluate[N[1/6 (1 - 3/(n1a^2 π^2) - 3/(n2a^2 π^2))]],
  18.  
  19. n1a == n1b && n2a != n2b,
  20. Evaluate[N[(4 (1 + (-1)^(n2a + n2b)) n2a n2b)/((n2a^2 - n2b^2)^2 π^2)]],
  21.  
  22. n1a != n1b && n2a == n2b,
  23. Evaluate[N[(4 (1 + (-1)^(n1a + n1b)) n1a n1b)/((n1a^2 - n1b^2)^2 π^2)]],
  24.  
  25. True,
  26. Evaluate[N[-((32 (-1 + (-1)^(n1a + n1b)) (-1 + (-1)^(n2a + n2b)) n1a n1b
  27. n2a n2b)/((n1a^2 - n1b^2)^2 (n2a^2 - n2b^2)^2 π^4))]]
  28. ]},
  29. Compile[{{n1a, _Integer}, {n1b, _Integer}, {n2a, _Integer}, {n2b,
  30. _Integer}},
  31. code,
  32. CompilationTarget -> "C"
  33. ]
  34. ]];
  35.  
  36. chmat = With[{ccfxn = cfxn, kkdfxn = kdfxn},
  37. Compile[{{nm, _Integer}, {ne, _Integer}, {b, _Real}, {d, _Real},
  38. {avec, _Real, 2}, {nvec, _Real, 1}, {svec, _Real, 1}},
  39. Block[{sz0, sz1, sz2, sz3, n0, n1, n2, n3, h1, h2, tmp, tmp2,
  40. tmp21, kf01, kf23, kf13, kf02},
  41. Table[n0 = Compile`GetElement[nvec, nm0];
  42. n1 = Compile`GetElement[nvec, nm1];
  43. sz0 = Compile`GetElement[svec, nm0];
  44. sz1 = Compile`GetElement[svec, nm1];
  45. tmp = 0.;
  46. Do[sz2 = Compile`GetElement[svec, nm2];
  47. sz3 = Compile`GetElement[svec, nm3];
  48. n2 = Compile`GetElement[nvec, nm2];
  49. n3 = Compile`GetElement[nvec, nm3];
  50. tmp2 = ccfxn[n1, n0, n3, n2];
  51. tmp21 = ccfxn[n1, n3, n0, n2];
  52.  
  53. kf01 = kkdfxn[sz0, sz1];
  54. kf23 = kkdfxn[sz2, sz3];
  55. kf13 = kkdfxn[sz1, sz3];
  56. kf02 = kkdfxn[sz0, sz2];
  57.  
  58. Do[
  59. tmp += (tmp2 kf23 kf01 - tmp21 kf13 kf02) Compile`GetElement[
  60. avec, j, nm3] Compile`GetElement[avec, j, nm2], {j, 1,
  61. ne}], {nm2, 1, nm}, {nm3, 1, nm}];
  62. d tmp +
  63. If[nm0 == nm1, (n0^2 Pi^2 + b Compile`GetElement[svec, nm0]),
  64. 0.], {nm0, 1, nm}, {nm1, 1, nm}]], CompilationTarget -> "C",
  65. CompilationOptions -> {"InlineCompiledFunctions" -> True},
  66. RuntimeOptions -> "Speed"]];
  67.  
  68. Table[
  69. hmat = chmat[n[Mu], ne, [Delta], [Beta], avec, nvec, svec];
  70. {evals, evecs} = Eigensystem[hmat];
  71. pos = Ordering[evals][[1 ;; ne]];
  72. bvec = Map[x [Function] If[Total[x] < 0, -x, x], evecs[[pos]]];
  73. residual = Max[Abs[avec - bvec]];
  74. avec = bvec;
  75. {residual, Total[evals[[pos]]]},
  76. {j, 1, 30}]
Add Comment
Please, Sign In to add comment