gsl_sum__work_u.c 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. #include "gsl__config.h"
  2. #include "gsl_math.h"
  3. #include "gsl_errno.h"
  4. #include "gsl_sum.h"
  5. gsl_sum_levin_u_workspace *
  6. gsl_sum_levin_u_alloc (size_t n)
  7. {
  8. gsl_sum_levin_u_workspace * w;
  9. if (n == 0)
  10. {
  11. GSL_ERROR_VAL ("length n must be positive integer", GSL_EDOM, 0);
  12. }
  13. w = (gsl_sum_levin_u_workspace *) malloc(sizeof(gsl_sum_levin_u_workspace));
  14. if (w == NULL)
  15. {
  16. GSL_ERROR_VAL ("failed to allocate struct", GSL_ENOMEM, 0);
  17. }
  18. w->q_num = (double *) malloc (n * sizeof (double));
  19. if (w->q_num == NULL)
  20. {
  21. free(w) ; /* error in constructor, prevent memory leak */
  22. GSL_ERROR_VAL ("failed to allocate space for q_num", GSL_ENOMEM, 0);
  23. }
  24. w->q_den = (double *) malloc (n * sizeof (double));
  25. if (w->q_den == NULL)
  26. {
  27. free (w->q_num);
  28. free (w) ; /* error in constructor, prevent memory leak */
  29. GSL_ERROR_VAL ("failed to allocate space for q_den", GSL_ENOMEM, 0);
  30. }
  31. w->dq_num = (double *) malloc (n * n * sizeof (double));
  32. if (w->dq_num == NULL)
  33. {
  34. free (w->q_den);
  35. free (w->q_num);
  36. free(w) ; /* error in constructor, prevent memory leak */
  37. GSL_ERROR_VAL ("failed to allocate space for dq_num", GSL_ENOMEM, 0);
  38. }
  39. w->dq_den = (double *) malloc (n * n * sizeof (double));
  40. if (w->dq_den == NULL)
  41. {
  42. free (w->dq_num);
  43. free (w->q_den);
  44. free (w->q_num);
  45. free (w) ; /* error in constructor, prevent memory leak */
  46. GSL_ERROR_VAL ("failed to allocate space for dq_den", GSL_ENOMEM, 0);
  47. }
  48. w->dsum = (double *) malloc (n * sizeof (double));
  49. if (w->dsum == NULL)
  50. {
  51. free (w->dq_den);
  52. free (w->dq_num);
  53. free (w->q_den);
  54. free (w->q_num);
  55. free (w) ; /* error in constructor, prevent memory leak */
  56. GSL_ERROR_VAL ("failed to allocate space for dsum", GSL_ENOMEM, 0);
  57. }
  58. w->size = n;
  59. w->terms_used = 0;
  60. w->sum_plain = 0;
  61. return w;
  62. }
  63. void
  64. gsl_sum_levin_u_free (gsl_sum_levin_u_workspace * w)
  65. {
  66. free (w->dsum);
  67. free (w->dq_den);
  68. free (w->dq_num);
  69. free (w->q_den);
  70. free (w->q_num);
  71. free (w);
  72. }