1 /* -*- Mode: C; indent-tabs-mode: nil; c-basic-offset: 4 c-style: "K&R" -*- */
4 libgpiv - library for Particle Image Velocimetry
6 Copyright (C) 2007, 2008 Gerber van der Graaf
8 This file is part of libgpiv.
9 Libgpiv is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
11 the Free Software Foundation; either version 2, or (at your option)
14 This program is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
19 You should have received a copy of the GNU General Public License
20 along with this program; if not, write to the Free Software Foundation,
21 Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
25 -------------------------------------------------------------------------------
32 LAST MODIFICATION DATE: $Id: utils_alloc.c,v 1.3 2008-09-25 13:19:53 gerber Exp $
33 --------------------------------------------------------------------------- */
37 #define GPIV_END 1 /* Used by vector */
46 /*-----------------------------------------------------------------------------
48 * Allocates memory for 2-dimensional matrix of gfloat data
50 *---------------------------------------------------------------------------*/
56 m
= (gfloat
**) g_malloc0 (nr
* sizeof (gfloat
*));
57 m
[0] = (gfloat
*) g_malloc0 (nr
* nc
* sizeof (gfloat
));
58 for (i
= 1; i
< nr
; i
++) {
69 gpiv_free_matrix (gfloat
**m
71 /*-----------------------------------------------------------------------------
73 * Frees memory for 2-dimensional array of float data
75 *---------------------------------------------------------------------------*/
77 g_return_if_fail (m
[0] != NULL
); /* gpiv_error ("m not allocated"); */
86 gpiv_matrix_index (const long nrl
,
91 /*-----------------------------------------------------------------------------
93 * Allocates memory for 2-dimensional matrix of float data
94 * with subscript range v[nrl..nrh][ncl..nch]
97 * long nrl: lowest row index number
98 * nrh: highest row index number
99 * ncl: lowest column index number
100 * nch highest column index number
105 * 2-dimensional array
106 *---------------------------------------------------------------------------*/
108 long i
, nrows
= nrh
- nrl
+ 1, ncolumns
= nch
- ncl
+ 1;
112 m
= (gfloat
**) g_malloc0 ((size_t) ((nrows
+ GPIV_END
) *
114 if (!m
) gpiv_error ("gpiv_matrix_index: allocation failure");
118 m
[nrl
] =(gfloat
*) g_malloc0 ((size_t) ((nrows
* ncolumns
+ GPIV_END
) *
120 if (!m
[nrl
]) gpiv_error ("gpiv_matrix_index: allocation failure");
124 for (i
=nrl
+1; i
<= nrh
; i
++) {
125 m
[i
] = m
[i
-1] + ncolumns
;
135 gpiv_free_matrix_index (gfloat
**m
,
141 /*-----------------------------------------------------------------------------
143 * Frees memory for 2-dimensional array of float data
144 * with subscript range v[nrl..nrh][ncl..nch]
148 * nrl: lowest row index number
149 * long nrh: highest row index number
150 * long ncl: lowest column index number
151 * long nch: highest column index number
157 *---------------------------------------------------------------------------*/
159 g_return_if_fail (m
[0] != NULL
); /* gpiv_error ("m not allocated"); */
160 g_free (m
[nrl
]+ncl
-GPIV_END
);
161 g_free (m
+nrl
-GPIV_END
);
168 gpiv_ucmatrix (const long nr
,
171 /*-----------------------------------------------------------------------------
173 * Allocates memory for 2-dimensional matrix of guchar data
183 *---------------------------------------------------------------------------*/
189 m
= (guchar
**) g_malloc0 (nr
* sizeof (guchar
*));
190 m
[0] = (guchar
*) g_malloc0 (nr
* nc
* sizeof (guchar
));
191 for (i
= 1; i
< nr
; i
++) {
192 m
[i
] = m
[0] + i
* nc
;
202 gpiv_free_ucmatrix (guchar
**m
204 /*-----------------------------------------------------------------------------
206 * Frees memory for 2-dimensional array of guchar data
215 *---------------------------------------------------------------------------*/
217 g_return_if_fail (m
[0] != NULL
); /* gpiv_error ("m not allocated"); */
226 gpiv_matrix_guint8 (const long nr
,
229 /*-----------------------------------------------------------------------------
231 * allocate a guint8 matrix with subscript range m[0..nr][0..nc]
235 * nc: number of columns
241 *---------------------------------------------------------------------------*/
247 m
= (guint8
**) g_malloc0 (nr
* sizeof (guint8
*));
248 m
[0] = (guint8
*) g_malloc0 (nr
* nc
* sizeof (guint8
));
249 for (i
= 1; i
< nr
; i
++) {
250 m
[i
] = m
[0] + i
* nc
;
260 gpiv_free_matrix_guint8 (guint8
**m
262 /*-----------------------------------------------------------------------------
264 * free a guint8 matrix allocated by gpiv_matrix_guint8
273 *---------------------------------------------------------------------------*/
275 g_return_if_fail (m
[0] != NULL
); /* gpiv_error ("m not allocated"); */
284 gpiv_matrix_guint16 (const long nr
,
287 /*-----------------------------------------------------------------------------
289 * allocate a guint16 matrix with subscript range m[0..nr][0..nc]
293 * nc: number of columns
299 *---------------------------------------------------------------------------*/
305 m
= (guint16
**) g_malloc0 (nr
* sizeof (guint16
*));
306 m
[0] = (guint16
*) g_malloc0 (nr
* nc
* sizeof (guint16
));
307 for (i
= 1; i
< nr
; i
++) {
308 m
[i
] = m
[0] + i
* nc
;
318 gpiv_free_matrix_guint16 (guint16
**m
320 /*-----------------------------------------------------------------------------
322 * free a guint16 matrix allocated by gpiv_matrix_guint16
331 *---------------------------------------------------------------------------*/
333 g_return_if_fail (m
[0] != NULL
); /* gpiv_error ("m not allocated"); */
342 gpiv_imatrix_index (const long nrl
,
347 /*-----------------------------------------------------------------------------
349 * Allocates memory for 2-dimensional matrix of integer data
350 * with subscript range v[nrl..nrh][ncl..nch]
354 * nrl: lowest row index number
355 * nrh: highest row index number
356 * ncl: lowest column index number
357 * nch: highest column index number
363 *---------------------------------------------------------------------------*/
365 long i
, nrows
= nrh
- nrl
+ 1, ncolumns
= nch
- ncl
+ 1;
369 m
= (gint
**) g_malloc0 ((size_t) ((nrows
+ GPIV_END
)*
373 m
[nrl
] = (gint
*) g_malloc0 ((size_t) ((nrows
* ncolumns
+ GPIV_END
)*
378 for (i
= nrl
+ 1; i
<= nrh
; i
++) {
379 m
[i
] = m
[i
-1] + ncolumns
;
389 gpiv_free_imatrix_index (gint
**m
,
395 /*-----------------------------------------------------------------------------
397 * Frees memory for 2-dimensional array of integer data
398 * with subscript range v[nrl..nrh][ncl..nch]
402 * nrl: lowest row index number
403 * nrh: highest row index number
404 * ncl: lowest column index number
405 * nch: highest column index number
411 *---------------------------------------------------------------------------*/
413 g_return_if_fail (m
[0] != NULL
); /* gpiv_error ("m not allocated"); */
414 g_free (m
[nrl
]+ncl
- GPIV_END
);
415 g_free (m
+nrl
- GPIV_END
);
422 gpiv_imatrix (const long nr
,
425 /*-----------------------------------------------------------------------------
427 * Allocates memory for 2-dimensional matrix of integer data
428 * unappreciated, use gpiv_imatrix_index instead
431 * nr: lowest row index number
432 * nc: lowest column index number
438 *---------------------------------------------------------------------------*/
444 m
= (gint
**) g_malloc0 (nr
* sizeof (gint
*));
445 m
[0] = (gint
*) g_malloc0 (nr
* nc
* sizeof (gint
));
446 for (i
= 1; i
< nr
; i
++) {
447 m
[i
] = m
[0] + i
* nc
;
457 gpiv_free_imatrix (gint
**m
459 /*-----------------------------------------------------------------------------
461 * Frees memory for 2-dimensional array of integer data
462 * unappreciated, use gpiv_free_imatrix_index instead
471 *---------------------------------------------------------------------------*/
473 g_return_if_fail (m
[0] != NULL
); /* gpiv_error ("m not allocated"); */
482 gpiv_double_matrix (const glong nr
,
485 /*-----------------------------------------------------------------------------
487 * allocate a contiguous 2-dimensional double matrix
492 * nc: number of columns
498 *---------------------------------------------------------------------------*/
504 m
= (double **) g_malloc0 (nr
* sizeof (double *));
505 m
[0] = (double *) g_malloc0 (nr
* nc
* sizeof (double));
506 for (i
= 1; i
< nr
; i
++) {
507 m
[i
] = m
[0] + i
* nc
;
517 gpiv_free_double_matrix (double **m
519 /*-----------------------------------------------------------------------------
521 * free a double matrix allocated by gpiv_double_matrix()
530 *---------------------------------------------------------------------------*/
532 g_return_if_fail (m
[0] != NULL
); /* gpiv_error ("m not allocated"); */
541 gpiv_fftw_real_matrix (glong nr
,
544 /*-----------------------------------------------------------------------------
546 * allocate a contiguous 2-dimensional fftw_real matrix
551 * nc: number of columns
557 *---------------------------------------------------------------------------*/
563 m
= (fftw_real
**) g_malloc0 (nr
* sizeof (fftw_real
*));
564 m
[0] = (fftw_real
*) g_malloc0 (nr
* nc
* sizeof (fftw_real
));
565 for (i
= 1; i
< nr
; i
++) {
566 m
[i
] = m
[0] + i
* nc
;
576 gpiv_free_fftw_real_matrix (fftw_real
**m
578 /*-----------------------------------------------------------------------------
580 * free a gdouble matrix allocated by gpiv_fftw_real_matrix()
589 *---------------------------------------------------------------------------*/
591 g_return_if_fail (m
[0] != NULL
); /* gpiv_error ("m not allocated"); */
596 #endif /* USE_FFTW3 */
601 gpiv_fftw_complex_matrix (const long nr
,
604 /*-----------------------------------------------------------------------------
606 * allocate a contiguous 2-dimensional fftw_complex matrix
611 * nc: number of columns
617 *---------------------------------------------------------------------------*/
624 * allocate pointers to rows
626 m
= (fftw_complex
**) fftw_malloc (nr
* sizeof (fftw_complex
*));
627 m
[0] = (fftw_complex
*) fftw_malloc (nr
* nc
* sizeof (fftw_complex
));
628 for (i
= 1; i
< nr
; i
++) {
629 m
[i
] = m
[0] + i
* nc
;
639 gpiv_free_fftw_complex_matrix (fftw_complex
**m
641 /*-----------------------------------------------------------------------------
643 * free a fftw_complex matrix allocated by gpiv_fftw_complex_matrix()
652 *---------------------------------------------------------------------------*/
654 g_return_if_fail (m
[0] != NULL
); /* gpiv_error ("m not allocated"); */
663 gpiv_vector (const long nl
665 /*-----------------------------------------------------------------------------
667 * Allocates memory for a 1-dimensional vector of float data
676 *---------------------------------------------------------------------------*/
681 v
= (float *)g_malloc0 ((size_t) (nl
* sizeof (float)));
682 /* v = (float *)g_malloc0 (gsize * nl * sizeof (float))); */
691 gpiv_free_vector (float *v
693 /*-----------------------------------------------------------------------------
695 * frees memory for a 1-dimensional vector of float data
698 * vector: vector of 1-dimensional float data
701 * vector: NULL pointer
704 *---------------------------------------------------------------------------*/
706 g_return_if_fail (v
!= NULL
); /* gpiv_error ("v not allocated"); */
714 gpiv_vector_index (const long nl
,
717 /*-----------------------------------------------------------------------------
719 * Allocates memory for a 1-dimensional vector of float data
720 * with subscript range v[nl..nh]
723 * nl: lowest index number
724 * nh: highest index number
730 *---------------------------------------------------------------------------*/
734 v
= (float *)g_malloc0 ((size_t) ((nh
+ 1 - nl
+ GPIV_END
)
744 gpiv_free_vector_index (float *v
,
748 /*-----------------------------------------------------------------------------
750 * frees memory for a 1-dimensional vector of float data
751 * with subscript range v[nrl..nrh][ncl..nch]
754 * vector: vector of 1-dimensional float data
755 * nl: lowest index number
756 * nh: highest index number
759 * vector: NULL pointer
762 *---------------------------------------------------------------------------*/
764 g_return_if_fail (v
!= NULL
); /* gpiv_error ("v not allocated"); */
772 gpiv_dvector (const glong nl
774 /*-----------------------------------------------------------------------------
776 * Allocates memory for a 1-dimensional vector of double data
785 *---------------------------------------------------------------------------*/
790 v
= (gdouble
*)g_malloc0 ((size_t) (nl
* sizeof (gdouble
)));
799 gpiv_free_dvector (gdouble
*v
801 /*-----------------------------------------------------------------------------
803 * frees memory for a 1-dimensional vector of double data
806 * vector: vector of 1-dimensional float data
809 * vector: NULL pointer
812 *---------------------------------------------------------------------------*/
814 g_return_if_fail (v
!= NULL
); /* gpiv_error ("v not allocated"); */
822 gpiv_dvector_index (const long nl
,
825 /*-----------------------------------------------------------------------------
827 * Allocates memory for a 1-dimensional vector of double data
828 * with subscript range v[nl..nh]
831 * nl: lowest index number
832 * nh: highest index number
838 *---------------------------------------------------------------------------*/
843 v
= (gdouble
*)g_malloc0 ((size_t) ((nh
+ 1 -nl
+ GPIV_END
) *
853 gpiv_free_dvector_index (gdouble
*v
,
857 /*-----------------------------------------------------------------------------
859 * frees memory for a 1-dimensional vector of double data
860 * with subscript range v[nrl..nrh][ncl..nch]
863 * vector: vector of 1-dimensional float data
864 * nl: lowest index number
865 * nh: highest index number
868 * vector: NULL pointer
871 *---------------------------------------------------------------------------*/
873 g_return_if_fail (v
!= NULL
); /* gpiv_error ("v not allocated"); */
881 gpiv_nulvector (const long nl
883 /*-----------------------------------------------------------------------------
885 * Allocates memory for a 1-dimensional vector of long data
894 *---------------------------------------------------------------------------*/
899 v
= (long *)g_malloc0 ((size_t) (nl
* sizeof (long)));
908 gpiv_free_nulvector (long *v
910 /*-----------------------------------------------------------------------------
912 * frees memory for a 1-dimensional vector of long data
915 * vector: vector of 1-dimensional float data
918 * vector: NULL pointer
921 *---------------------------------------------------------------------------*/
923 g_return_if_fail (v
!= NULL
); /* gpiv_error ("v not allocated"); */
931 gpiv_nulvector_index (const long nl
,
934 /*-----------------------------------------------------------------------------
936 * Allocates memory for a 1-dimensional vector of long data
937 * with subscript range v[nl..nh]
940 * nl: lowest index number
941 * nh: highest index number
947 *---------------------------------------------------------------------------*/
952 v
= (long *)g_malloc0 ((size_t) ((nh
+ 1 - nl
+ GPIV_END
) *
962 gpiv_free_nulvector_index (long *v
,
965 /*-----------------------------------------------------------------------------
967 * frees memory for a 1-dimensional vector of long data
968 * with subscript range v[nrl..nrh][ncl..nch]
971 * vector: vector of 1-dimensional float data
972 * nl: lowest index number
973 * nh: highest index number
976 * vector: NULL pointer
979 *---------------------------------------------------------------------------*/
981 g_return_if_fail (v
!= NULL
); /* gpiv_error ("v not allocated"); */
989 gpiv_ulvector (const long nl
991 /*-----------------------------------------------------------------------------
993 * Allocates memory for a 1-dimensional vector of unsigned long data
1002 *---------------------------------------------------------------------------*/
1007 v
= (unsigned long *)g_malloc0 ((size_t) (nl
* sizeof (long)));
1008 if (!v
); gpiv_error ("gpiv_ulvector: allocation failure");
1017 gpiv_free_ulvector (unsigned long *v
1019 /*-----------------------------------------------------------------------------
1021 * frees memory for a 1-dimensional vector of unsigned long data
1024 * vector: vector of 1-dimensional float data
1027 * vector: NULL pointer
1030 *---------------------------------------------------------------------------*/
1032 g_return_if_fail (v
!= NULL
); /* gpiv_error ("v not allocated"); */
1040 gpiv_ulvector_index (const long nl
,
1043 /*-----------------------------------------------------------------------------
1045 * Allocates memory for a 1-dimensional vector of unsigned long data
1046 * with subscript range v[nl..nh]
1049 * nl: lowest index number
1050 * nh: highest index number
1056 *---------------------------------------------------------------------------*/
1061 v
= (unsigned long *)g_malloc0 ((size_t) ((nh
+ 1 - nl
+ GPIV_END
) *
1063 if (!v
); gpiv_error ("gpiv_ulvector_index: allocation failure");
1072 gpiv_free_ulvector_index (unsigned long *v
,
1076 /*-----------------------------------------------------------------------------
1078 * frees memory for a 1-dimensional vector of unsigned long data
1079 * with subscript range v[nrl..nrh][ncl..nch]
1082 * vector: vector of 1-dimensional float data
1083 * nl: lowest index number
1084 * nh: highest index number
1087 * vector: NULL pointer
1090 *---------------------------------------------------------------------------*/
1092 g_return_if_fail (v
!= NULL
); /* gpiv_error ("v not allocated"); */
1100 gpiv_ivector (const long nl
1102 /*-----------------------------------------------------------------------------
1104 * Allocates memory for a 1-dimensional vector of integer data
1113 *---------------------------------------------------------------------------*/
1118 v
= (gint
*) g_malloc0 ((size_t) (nl
* sizeof (gint
)));
1119 if (!v
) gpiv_error ("gpiv_ivector: allocation failure");
1128 gpiv_free_ivector (gint
*v
1130 /*-----------------------------------------------------------------------------
1132 * frees memory for a 1-dimensional vector of integer data
1135 * vector: vector of 1-dimensional float data
1138 * vector: NULL pointer
1141 *---------------------------------------------------------------------------*/
1143 g_return_if_fail (v
!= NULL
); /* gpiv_error ("v not allocated"); */
1151 gpiv_ivector_index (const long nl
,
1154 /*-----------------------------------------------------------------------------
1156 * Allocates memory for a 1-dimensional vector of integer data
1157 * with subscript range v[nl..nh]
1160 * nl: lowest index number
1161 * nh: highest index number
1167 *---------------------------------------------------------------------------*/
1172 v
= (gint
*)g_malloc0 ((size_t) ((nh
+ 1 - nl
+ GPIV_END
)*sizeof (gint
)));
1173 if (!v
) gpiv_error ("gpiv_ivector_index: allocation failure");
1182 gpiv_free_ivector_index (gint
*v
,
1186 /*-----------------------------------------------------------------------------
1188 * frees memory for a 1-dimensional vector of integer data
1189 * with subscript range v[nrl..nrh][ncl..nch]
1192 * vector: vector of 1-dimensional float data
1193 * nl: lowest index number
1194 * nh: highest index number
1197 * vector: NULL pointer
1200 *---------------------------------------------------------------------------*/
1202 g_return_if_fail (v
!= NULL
); /* gpiv_error ("v not allocated"); */
1210 gpiv_gbolvector (const glong nl
1212 /*-----------------------------------------------------------------------------
1214 * Allocates memory for a 1-dimensional vector of gboolean data
1223 *---------------------------------------------------------------------------*/
1228 v
= (gboolean
*)g_malloc0 ((size_t) (nl
* sizeof (gboolean
)));
1237 gpiv_free_gbolvector (gboolean
*v
1239 /*-----------------------------------------------------------------------------
1241 * frees memory for a 1-dimensional vector of gboolean data
1244 * vector: vector of 1-dimensional boolean data
1247 * vector: NULL pointer
1250 *---------------------------------------------------------------------------*/
1252 g_return_if_fail (v
!= NULL
); /* gpiv_error ("v not allocated"); */