Advertisement
Guest User

Untitled

a guest
Feb 28th, 2017
105
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.23 KB | None | 0 0
  1. Needs["NDSolve`FEM`"]
  2. Domain = ImplicitRegion[
  3. 0 <= x <= 1.25*10^-2 && 0 <= y <= 1*10^-2, {x, y}];
  4. meshA = ToElementMesh[Domain, MaxCellMeasure -> {"Length" -> 0.0007},
  5. "MaxBoundaryCellMeasure" -> 0.0002]
  6. meshA["Wireframe"]
  7.  
  8. PDEtoMatrix[{pde_, Ga_}, u_, r_] :=
  9. Module[{ndstate, feData, sd, bcData, methodData,
  10. pdeData}, {ndstate} =
  11. NDSolve`ProcessEquations[Flatten[{pde, Ga}], u, Sequence @@ {r}];
  12. sd = ndstate["SolutionData"][[1]];
  13. feData = ndstate["FiniteElementData"];
  14. pdeData = feData["PDECoefficientData"];
  15. bcData = feData["BoundaryConditionData"];
  16. methodData = feData["FEMMethodData"];
  17. {DiscretizePDE[pdeData, methodData, sd],
  18. DiscretizeBoundaryConditions[bcData, methodData, sd], sd,
  19. methodData}]
  20.  
  21. Tin = 550;
  22. pre = 10^4;
  23. Ea = 5000*1000;
  24. R = 1.986*1000;
  25. k = pre*Exp[-Ea/Tin/R];
  26. a = 0.5;
  27. Ga = 3*10^-8;
  28. fm = {.15, .10};
  29. Rho = 1000;
  30. PM0 = {24, 28};
  31. CaZ = Rho*fm[[1]]/PM0[[1]];
  32. CbZ = Rho*fm[[2]]/PM0[[2]];
  33. Vx[x_, y_] := -a*(x - (1.25*10^-2)/2);
  34. Vy[x_, y_] := a*(y - 0.005);
  35. pde = {D[Ca[x, y]*Vx[x, y], x] + D[Ca[x, y]*Vy[x, y], y] -
  36. Ga*D[Ca [x, y], {x, 2}] - Ga*D[Ca [x, y], {y, 2}] == 0,
  37. D[Cb[x, y]*Vx[x, y], x] + D[Cb[x, y]*Vy[x, y], y] -
  38. Ga*D[Cb [x, y], {x, 2}] - Ga*D[Cb [x, y], {y, 2}] == 0};
  39. bds = {DirichletCondition[Ca[x, y] == CaZ, x == 0],
  40. DirichletCondition[Ca[x, y] == 0, x == 1.25*10^-2],
  41. DirichletCondition[Cb[x, y] == CbZ, x == 1.25*10^-2],
  42. DirichletCondition[Cb[x, y] == 0, x == 0]};
  43.  
  44. {dPDE, dBC, sd, md} =
  45. PDEtoMatrix[{pde, bds}, {Ca, Cb}, {x, y} [Element] meshA,
  46. Method -> {"FiniteElement",
  47. "InterpolationOrder" -> {Ca -> 2, Cb -> 2},
  48. "MeshOptions" -> {"ImproveBoundaryPosition" -> False,
  49. "MaxCellMeasure" -> 0.001}}];
  50.  
  51. linearLoad = dPDE["LoadVector"];
  52. linearStiffness = dPDE["StiffnessMatrix"];
  53. vd = md["VariableData"];
  54. offsets = md["IncidentOffsets"];
  55.  
  56. uOld = ConstantArray[{0.}, md["DegreesOfFreedom"]];
  57. mesh2 = md["ElementMesh"];
  58. mesh1 = MeshOrderAlteration[mesh2, 1];
  59.  
  60. ClearAll[rhs]
  61. rhs[t_?NumericQ, ut_] := Module[{uOld}, uOld = ut;
  62. Do[ClearAll[Ca0, Cb0];
  63.  
  64. (*create functions interpolations*)
  65. Ca0 = ElementMeshInterpolation[{mesh2},
  66. uOld[[offsets[[1]] + 1 ;; offsets[[2]]]]];
  67. Cb0 = ElementMeshInterpolation[{mesh2},
  68. uOld[[offsets[[2]] + 1 ;; offsets[[3]]]]];
  69.  
  70. (*these are the linearized coefficients*)
  71. nlPdeCoeff =
  72. InitializePDECoefficients[vd, sd,
  73. "ConvectionCoefficients" -> {{{Vx[x, y], Vy[x, y]},{0,0}},{{0, 0}, {Vx[x, y], Vy[x, y]}}},
  74. "DiffusionCoefficients" -> {{{{-Ga, 0}, {0, -Ga}}, {{0, 0}, {0, 0}}}, {{{0, 0}, {0, 0}}, {{-Ga,
  75. 0}, {0, -Ga}}}},
  76. "ReactionCoefficients" -> {{k*Cb0[x,y], 0}, {0, 0}}, {{0, 0},{0,k*Ca0[x,y]}}];
  77.  
  78. nlsys = DiscretizePDE[nlPdeCoeff, md, sd];
  79. nlLoad = nlsys["LoadVector"];
  80. nlStiffness = nlsys["StiffnessMatrix"];
  81. ns = nlStiffness + linearStiffness;
  82. nl = nlLoad + linearLoad;
  83. DeployBoundaryConditions[{nl, ns}, dBC];
  84. diriPos = dBC["DirichletRows"];
  85. nl[[diriPos]] = nl[[diriPos]] - uOld[[diriPos]];
  86.  
  87. dU = LinearSolve[N[ns], N[nl]];
  88. Print[i, " Residual: ", Norm[nl, Infinity], " Correction: ",
  89. Norm[dU, Infinity]];
  90. uOld = uOld + dU;
  91. If[Norm[dU, Infinity] < 10^-6, Break[]];, {i, 8}];
  92. uOld]
  93.  
  94. uNew = rhs[0, uOld];
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement