Advertisement
Guest User

Untitled

a guest
Apr 27th, 2017
59
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.57 KB | None | 0 0
  1.  
  2. # include "fem.h"
  3.  
  4.  
  5. femProblem *advdiffNew(double epsilon, double beta, double zeta, int size, int sizePlot)
  6. {
  7. femProblem *myProblem = malloc(sizeof(femProblem));
  8. myProblem->epsilon = epsilon;
  9. myProblem->beta = beta;
  10. myProblem->zeta = zeta;
  11.  
  12. myProblem->size = size;
  13. myProblem->X = malloc(sizeof(double) * size);
  14. myProblem->U = malloc(sizeof(double) * size);
  15.  
  16. myProblem->sizePlot = sizePlot;
  17. myProblem->x = malloc(sizeof(double) * sizePlot);
  18. myProblem->u = malloc(sizeof(double) * sizePlot);
  19. myProblem->uregime = malloc(sizeof(double) * sizePlot);
  20.  
  21. advdiffReset(myProblem);
  22.  
  23.  
  24. return myProblem;
  25. }
  26.  
  27. void advdiffReset(femProblem *myProblem)
  28. {
  29. double h;
  30. int i;
  31.  
  32. h = 1.0/(myProblem->size-1);
  33. for (i=0; i < myProblem->size; i++) {
  34. myProblem->X[i] = i*h;
  35. myProblem->U[i] = 0.0; }
  36. myProblem->U[0] = 1.0;
  37.  
  38.  
  39. h = 1.0/(myProblem->sizePlot-1);
  40. for (i=0; i < myProblem->sizePlot; i++) {
  41. myProblem->x[i] = i*h;
  42. myProblem->u[i] = 0.0;
  43. myProblem->uregime[i] = 0.0; }
  44. }
  45.  
  46. void advdiffFree(femProblem *myProblem)
  47. {
  48. free(myProblem->X);
  49. free(myProblem->U);
  50. free(myProblem->x);
  51. free(myProblem->u);
  52. free(myProblem->uregime);
  53. free(myProblem);
  54. }
  55.  
  56. void advdiffSteadySolution(femProblem *myProblem)
  57. {
  58. int size = myProblem->sizePlot, i;
  59. double *u = myProblem->uregime;
  60. double *x = myProblem->x;
  61. double beta = myProblem->beta;
  62. double epsilon = myProblem->epsilon;
  63. double pe = beta/epsilon;
  64.  
  65.  
  66. if (beta != 0.0)
  67. for (i=0; i < size; i++)
  68. u[i] = (exp(pe) - exp(pe*x[i]) )/(exp(pe) - 1.0);
  69. else
  70. for (i=0; i < size; i++)
  71. u[i] = 1 - x[i];
  72.  
  73. }
  74.  
  75. # ifndef NOANALYTIC
  76.  
  77. void advdiffSolution(femProblem *myProblem, double time)
  78. {
  79. int size = myProblem->sizePlot, i,j;
  80. double *u = myProblem->u;
  81. double *x = myProblem->x;
  82. double *uregime = myProblem->uregime;
  83. double beta = myProblem->beta;
  84. double epsilon = myProblem->epsilon;
  85. advdiffSteadySolution(myProblem);
  86. double prec=1.0;
  87.  
  88.  
  89. //
  90. // Solution diffusion pure :-)
  91. // A modifier !!!!
  92. //
  93. if (beta==0){
  94. for (i=0; i < size; i++)
  95. u[i] = 1 - x[i];
  96. for (j=1; j < 500; j++) {
  97. double k = M_PI * j;
  98. double alpha = k*k*epsilon;
  99. double coeff = 2/k;
  100. for (i=0; i < size; i++) {
  101. u[i] = u[i] - coeff * sin(k*x[i]) * exp(- alpha*time); }}
  102. }
  103. else
  104. {
  105. for (i=0; i < size; i++)
  106. u[i] = uregime[i];
  107. for (j=1; j < 500 && prec>1e-9; j++) {
  108. double k = M_PI * j;
  109. double coeff = beta/2.0;
  110. double coeff2 = coeff/epsilon;
  111. double coeff3 = (coeff*coeff)/epsilon;
  112. prec=2.0 * k * exp(coeff2 - coeff3*time - k*k*epsilon*time)/(k*k + coeff2*coeff2);
  113. for (i=0; i < size; i++) {
  114. double num = 2.0 * k * sin(k*x[i]) * exp(coeff2*x[i] - coeff3*time - k*k*epsilon*time);
  115. double den = k*k + coeff2*coeff2;
  116. u[i] = u[i] - (num/den);
  117. }
  118. }
  119. }
  120.  
  121.  
  122. }
  123.  
  124. # endif
  125. # ifndef NOTIMESTEP
  126.  
  127. double advdiffComputeTimeStep(femProblem *myProblem)
  128. {
  129. int size = myProblem->size;
  130. double beta = myProblem->beta;
  131. double epsilon = myProblem->epsilon;
  132. double zeta = myProblem->zeta ;
  133.  
  134. //
  135. // Solution pour Euler explicite :-)
  136. // A modifier pour Runge-Kutta !!!!
  137. //
  138.  
  139.  
  140. double h = 1.0/(size-1);
  141. double dt = fmin( (zeta*h*beta + 2*epsilon)/(beta*beta), (h*h)/(zeta*h*beta + 2*epsilon));
  142.  
  143. return 1.35*dt;
  144. }
  145.  
  146. # endif
  147. # ifndef NORIGHTHANDSIDE
  148.  
  149.  
  150. void advdiffComputeRightHandSide(femProblem *myProblem, double *U, double *F)
  151. {
  152. int size = myProblem->size, i;
  153. double epsilon = myProblem->epsilon;
  154. double beta = myProblem->beta;
  155. double zeta = myProblem->zeta;
  156. double h = 1.0/(size-1);
  157.  
  158. // A modifier !!
  159. F[0] = 0.0;
  160. F[size-1] = 0.0;
  161. for (i=1; i < size-1; i++)
  162. {
  163. F[i] = (-(1-zeta)*beta*((U[i+1]-U[i-1])/(2.0*h))) - (zeta*beta*((U[i]-U[i-1])/h)) + (epsilon*((U[i+1]-(2.0*U[i])+U[i-1])/(h*h)));
  164. }
  165. }
  166.  
  167.  
  168. # endif
  169. # ifndef NOEULER
  170.  
  171. void advdiffUpdateEuler(femProblem *myProblem, double dt)
  172. {
  173. double *U = myProblem->U;
  174. int size = myProblem->size;
  175. double *F = malloc(sizeof(double)*size);
  176. advdiffComputeRightHandSide(myProblem, U, F);
  177.  
  178. int i;
  179. for (i=0;i<size;i++){
  180. F[i] = F[i]*dt;
  181. U[i] = U[i] + F[i];
  182. }
  183. free(F);
  184.  
  185. }
  186.  
  187. # endif
  188. # ifndef NORK
  189.  
  190. void advdiffUpdateRungeKutta(femProblem *myProblem, double dt)
  191. {
  192. double *U = myProblem->U;
  193. int size = myProblem->size;
  194. double *K1 = malloc(sizeof(double)*size);
  195. double *Uu = malloc(sizeof(double)*size);
  196. advdiffComputeRightHandSide(myProblem, U, K1);
  197. int i;
  198. for (i=0;i<size;i++){
  199. Uu[i] = U[i] + dt*K1[i]/2.0;
  200. }
  201. double *K2 = malloc(sizeof(double)*size);
  202. advdiffComputeRightHandSide(myProblem, Uu, K2);
  203. for (i=0;i<size;i++){
  204. Uu[i] = U[i] + dt*K2[i]/2.0;
  205. }
  206. double *K3 = malloc(sizeof(double)*size);
  207. advdiffComputeRightHandSide(myProblem, Uu, K3);
  208. for (i=0;i<size;i++){
  209. Uu[i] = U[i] + dt*K3[i];
  210. }
  211. double *K4 = malloc(sizeof(double)*size);
  212. advdiffComputeRightHandSide(myProblem, Uu, K4);
  213. for (i=0;i<size;i++){
  214. U[i] = U[i] + (dt/6.0)*(K1[i]+2.0*K2[i]+2.0*K3[i]+K4[i]);
  215. }
  216.  
  217. free(Uu);
  218. free(K1);
  219. free(K2);
  220. free(K3);
  221. free(K4);
  222.  
  223. }
  224.  
  225. # endif
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement