/mechanical/ilt-relax.c

https://github.com/mirrorscotty/material-data · C · 119 lines · 87 code · 31 blank · 1 comment · 3 complexity · 655fec50afaa64f4bc4f1d04f59e6230 MD5 · raw file

  1. #include "material-data.h"
  2. #include "matrix.h"
  3. #include "inv-laplace.h"
  4. #include <complex.h>
  5. #include <math.h>
  6. #include <stdlib.h>
  7. /* Approximate 0 as .001 for derivatives */
  8. #define ZERO 0.001
  9. double complex LBurgersECreep(burgerse *b,
  10. double complex s,
  11. double T,
  12. double M,
  13. double P)
  14. {
  15. double complex sum;
  16. double J0, mu0, *J;
  17. int i;
  18. if(P<10000)
  19. P=10000;
  20. J = (double*) calloc(sizeof(double), b->n);
  21. J0 = b->J0b*pow(P, b->J0e);
  22. mu0 = b->mu0b*pow(P, b->mu0e);
  23. for(i=0; i<b->n; i++)
  24. J[i] = b->Jb[i]*pow(P, b->Je[i]);
  25. sum = J0/s + 1/(mu0*s*s);
  26. for(i=0; i<b->n; i++)
  27. sum += J[i]*(1/s - 1/(s+1/b->tau[i]));
  28. free(J);
  29. return sum;
  30. }
  31. double complex _LGinaRelax(double complex s, void *params)
  32. {
  33. burgerse *b;
  34. mechdat *d;
  35. double result, T, M, P;
  36. d = (mechdat*) params;
  37. b = CreateBurgersE();
  38. T = d->T;
  39. M = d->M;
  40. P = d->P;
  41. result = 1/(s*s*LBurgersECreep(b, s, T, M, P));
  42. DestroyBurgersE(b);
  43. return result;
  44. }
  45. double complex _DLGinaRelax(double complex s, void *params)
  46. {
  47. burgerse *b;
  48. mechdat *d;
  49. double result, T, M, P;
  50. d = (mechdat*) params;
  51. b = CreateBurgersE();
  52. T = d->T;
  53. M = d->M;
  54. P = d->P;
  55. result = 1/(s*LBurgersECreep(b, s, T, M, P)) - LGinaRelax(ZERO, T, M, P);
  56. DestroyBurgersE(b);
  57. return result;
  58. }
  59. double LGinaRelax(double t, double T, double M, double P)
  60. {
  61. vector *tv, *Gv;
  62. mechdat *param;
  63. double G;
  64. tv = CreateVector(1);
  65. setvalV(tv, 0, t);
  66. param = CreateMechDat(T, M, P);
  67. Gv = ilt_euler(&_LGinaRelax, tv, 32, (void*)param);
  68. G = valV(Gv, 0);
  69. DestroyVector(Gv);
  70. DestroyVector(tv);
  71. DestroyMechDat(param);
  72. return G;
  73. }
  74. double DLGinaRelax(double t, double T, double M, double P)
  75. {
  76. vector *tv, *Gv;
  77. mechdat *param;
  78. double G;
  79. tv = CreateVector(1);
  80. setvalV(tv, 0, t);
  81. param = CreateMechDat(T, M, P);
  82. Gv = ilt_euler(&_DLGinaRelax, tv, 32, (void*)param);
  83. G = valV(Gv, 0);
  84. DestroyVector(Gv);
  85. DestroyVector(tv);
  86. DestroyMechDat(param);
  87. return G;
  88. }