|
GRASS Programmer's Manual
6.5.svn(2012)-r51648
|
00001 00002 /***************************************************************************** 00003 * 00004 * MODULE: Grass PDE Numerical Library 00005 * AUTHOR(S): Soeren Gebbert, Berlin (GER) Dec 2006 00006 * soerengebbert <at> gmx <dot> de 00007 * 00008 * PURPOSE: gradient management functions 00009 * part of the gpde library 00010 * 00011 * COPYRIGHT: (C) 2000 by the GRASS Development Team 00012 * 00013 * This program is free software under the GNU General Public 00014 * License (>=v2). Read the file COPYING that comes with GRASS 00015 * for details. 00016 * 00017 *****************************************************************************/ 00018 00019 #include <grass/N_pde.h> 00020 00027 N_gradient_2d *N_alloc_gradient_2d(void) 00028 { 00029 N_gradient_2d *grad; 00030 00031 grad = (N_gradient_2d *) G_calloc(1, sizeof(N_gradient_2d)); 00032 00033 return grad; 00034 } 00035 00042 void N_free_gradient_2d(N_gradient_2d * grad) 00043 { 00044 G_free(grad); 00045 grad = NULL; 00046 00047 return; 00048 } 00049 00060 N_gradient_2d *N_create_gradient_2d(double NC, double SC, double WC, 00061 double EC) 00062 { 00063 N_gradient_2d *grad; 00064 00065 G_debug(5, "N_create_gradient_2d: create N_gradient_2d"); 00066 00067 grad = N_alloc_gradient_2d(); 00068 00069 grad->NC = NC; 00070 grad->SC = SC; 00071 grad->WC = WC; 00072 grad->EC = EC; 00073 00074 return grad; 00075 } 00076 00085 int N_copy_gradient_2d(N_gradient_2d * source, N_gradient_2d * target) 00086 { 00087 G_debug(5, "N_copy_gradient_2d: copy N_gradient_2d"); 00088 00089 if (!source || !target) 00090 return 0; 00091 00092 target->NC = source->NC; 00093 target->SC = source->SC; 00094 target->WC = source->WC; 00095 target->EC = source->EC; 00096 00097 return 1; 00098 } 00099 00115 N_gradient_2d *N_get_gradient_2d(N_gradient_field_2d * field, 00116 N_gradient_2d * gradient, int col, int row) 00117 { 00118 double NC = 0, SC = 0, WC = 0, EC = 0; 00119 00120 N_gradient_2d *grad = gradient; 00121 00122 00123 NC = N_get_array_2d_d_value(field->y_array, col, row); 00124 SC = N_get_array_2d_d_value(field->y_array, col, row + 1); 00125 WC = N_get_array_2d_d_value(field->x_array, col, row); 00126 EC = N_get_array_2d_d_value(field->x_array, col + 1, row); 00127 00128 G_debug(5, 00129 "N_get_gradient_2d: calculate N_gradient_2d NC %g SC %g WC %g EC %g", 00130 NC, SC, WC, EC); 00131 00132 /*if gradient is a NULL pointer, create a new one */ 00133 if (!grad) { 00134 grad = N_create_gradient_2d(NC, SC, WC, EC); 00135 } 00136 else { 00137 grad->NC = NC; 00138 grad->SC = SC; 00139 grad->WC = WC; 00140 grad->EC = EC; 00141 } 00142 00143 return grad; 00144 } 00145 00152 N_gradient_3d *N_alloc_gradient_3d(void) 00153 { 00154 N_gradient_3d *grad; 00155 00156 grad = (N_gradient_3d *) G_calloc(1, sizeof(N_gradient_3d)); 00157 00158 return grad; 00159 } 00160 00167 void N_free_gradient_3d(N_gradient_3d * grad) 00168 { 00169 G_free(grad); 00170 grad = NULL; 00171 00172 return; 00173 } 00174 00175 00188 N_gradient_3d *N_create_gradient_3d(double NC, double SC, double WC, 00189 double EC, double TC, double BC) 00190 { 00191 N_gradient_3d *grad; 00192 00193 G_debug(5, "N_create_gradient_3d: create N_gradient_3d"); 00194 00195 grad = N_alloc_gradient_3d(); 00196 00197 grad->NC = NC; 00198 grad->SC = SC; 00199 grad->WC = WC; 00200 grad->EC = EC; 00201 grad->TC = TC; 00202 grad->BC = BC; 00203 00204 return grad; 00205 } 00206 00215 int N_copy_gradient_3d(N_gradient_3d * source, N_gradient_3d * target) 00216 { 00217 G_debug(5, "N_copy_gradient_3d: copy N_gradient_3d"); 00218 00219 if (!source || !target) 00220 return 0; 00221 00222 target->NC = source->NC; 00223 target->SC = source->SC; 00224 target->WC = source->WC; 00225 target->EC = source->EC; 00226 target->TC = source->TC; 00227 target->BC = source->BC; 00228 00229 return 1; 00230 } 00231 00232 00249 N_gradient_3d *N_get_gradient_3d(N_gradient_field_3d * field, 00250 N_gradient_3d * gradient, int col, int row, 00251 int depth) 00252 { 00253 double NC, SC, WC, EC, TC, BC; 00254 00255 N_gradient_3d *grad = gradient; 00256 00257 NC = N_get_array_3d_d_value(field->y_array, col, row, depth); 00258 SC = N_get_array_3d_d_value(field->y_array, col, row + 1, depth); 00259 WC = N_get_array_3d_d_value(field->x_array, col, row, depth); 00260 EC = N_get_array_3d_d_value(field->x_array, col + 1, row, depth); 00261 BC = N_get_array_3d_d_value(field->z_array, col, row, depth); 00262 TC = N_get_array_3d_d_value(field->z_array, col, row, depth + 1); 00263 00264 G_debug(6, 00265 "N_get_gradient_3d: calculate N_gradient_3d NC %g SC %g WC %g EC %g TC %g BC %g", 00266 NC, SC, WC, EC, TC, BC); 00267 00268 /*if gradient is a NULL pointer, create a new one */ 00269 if (!grad) { 00270 grad = N_create_gradient_3d(NC, SC, WC, EC, TC, BC); 00271 } 00272 else { 00273 grad->NC = NC; 00274 grad->SC = SC; 00275 grad->WC = WC; 00276 grad->EC = EC; 00277 grad->BC = BC; 00278 grad->TC = TC; 00279 } 00280 00281 return grad; 00282 } 00283 00292 N_gradient_neighbours_x *N_alloc_gradient_neighbours_x(void) 00293 { 00294 N_gradient_neighbours_x *grad; 00295 00296 grad = 00297 (N_gradient_neighbours_x *) G_calloc(1, 00298 sizeof(N_gradient_neighbours_x)); 00299 00300 return grad; 00301 } 00302 00309 void N_free_gradient_neighbours_x(N_gradient_neighbours_x * grad) 00310 { 00311 G_free(grad); 00312 grad = NULL; 00313 00314 return; 00315 } 00316 00317 00331 N_gradient_neighbours_x *N_create_gradient_neighbours_x(double NWN, 00332 double NEN, double WC, 00333 double EC, double SWS, 00334 double SES) 00335 { 00336 N_gradient_neighbours_x *grad; 00337 00338 G_debug(6, 00339 "N_create_gradient_neighbours_x: create N_gradient_neighbours_x"); 00340 00341 grad = N_alloc_gradient_neighbours_x(); 00342 00343 grad->NWN = NWN; 00344 grad->NEN = NEN; 00345 grad->WC = WC; 00346 grad->EC = EC; 00347 grad->SWS = SWS; 00348 grad->SES = SES; 00349 00350 return grad; 00351 } 00352 00361 int 00362 N_copy_gradient_neighbours_x(N_gradient_neighbours_x * source, 00363 N_gradient_neighbours_x * target) 00364 { 00365 G_debug(6, "N_copy_gradient_neighbours_x: copy N_gradient_neighbours_x"); 00366 00367 if (!source || !target) 00368 return 0; 00369 00370 target->NWN = source->NWN; 00371 target->NEN = source->NEN; 00372 target->WC = source->WC; 00373 target->EC = source->EC; 00374 target->SWS = source->SWS; 00375 target->SES = source->SES; 00376 00377 return 1; 00378 } 00379 00388 N_gradient_neighbours_y *N_alloc_gradient_neighbours_y(void) 00389 { 00390 N_gradient_neighbours_y *grad; 00391 00392 grad = 00393 (N_gradient_neighbours_y *) G_calloc(1, 00394 sizeof(N_gradient_neighbours_y)); 00395 00396 return grad; 00397 } 00398 00405 void N_free_gradient_neighbours_y(N_gradient_neighbours_y * grad) 00406 { 00407 G_free(grad); 00408 grad = NULL; 00409 00410 return; 00411 } 00412 00426 N_gradient_neighbours_y *N_create_gradient_neighbours_y(double NWW, 00427 double NEE, double NC, 00428 double SC, double SWW, 00429 double SEE) 00430 { 00431 N_gradient_neighbours_y *grad; 00432 00433 G_debug(6, 00434 "N_create_gradient_neighbours_y: create N_gradient_neighbours_y"); 00435 00436 grad = N_alloc_gradient_neighbours_y(); 00437 00438 grad->NWW = NWW; 00439 grad->NEE = NEE; 00440 grad->NC = NC; 00441 grad->SC = SC; 00442 grad->SWW = SWW; 00443 grad->SEE = SEE; 00444 00445 return grad; 00446 } 00447 00456 int 00457 N_copy_gradient_neighbours_y(N_gradient_neighbours_y * source, 00458 N_gradient_neighbours_y * target) 00459 { 00460 G_debug(6, "N_copy_gradient_neighbours_y: copy N_gradient_neighbours_y"); 00461 00462 if (!source || !target) 00463 return 0; 00464 00465 target->NWW = source->NWW; 00466 target->NEE = source->NEE; 00467 target->NC = source->NC; 00468 target->SC = source->SC; 00469 target->SWW = source->SWW; 00470 target->SEE = source->SEE; 00471 00472 return 1; 00473 } 00474 00483 N_gradient_neighbours_z *N_alloc_gradient_neighbours_z(void) 00484 { 00485 N_gradient_neighbours_z *grad; 00486 00487 grad = 00488 (N_gradient_neighbours_z *) G_calloc(1, 00489 sizeof(N_gradient_neighbours_z)); 00490 00491 return grad; 00492 } 00493 00500 void N_free_gradient_neighbours_z(N_gradient_neighbours_z * grad) 00501 { 00502 G_free(grad); 00503 grad = NULL; 00504 00505 return; 00506 } 00507 00524 N_gradient_neighbours_z *N_create_gradient_neighbours_z(double NWZ, double NZ, 00525 double NEZ, double WZ, 00526 double CZ, double EZ, 00527 double SWZ, double SZ, 00528 double SEZ) 00529 { 00530 N_gradient_neighbours_z *grad; 00531 00532 G_debug(6, 00533 "N_create_gradient_neighbours_z: create N_gradient_neighbours_z"); 00534 00535 grad = N_alloc_gradient_neighbours_z(); 00536 00537 grad->NWZ = NWZ; 00538 grad->NZ = NZ; 00539 grad->NEZ = NEZ; 00540 grad->WZ = WZ; 00541 grad->CZ = CZ; 00542 grad->EZ = EZ; 00543 grad->SWZ = SWZ; 00544 grad->SZ = SZ; 00545 grad->SEZ = SEZ; 00546 00547 return grad; 00548 } 00549 00558 int 00559 N_copy_gradient_neighbours_z(N_gradient_neighbours_z * source, 00560 N_gradient_neighbours_z * target) 00561 { 00562 G_debug(6, "N_copy_gradient_neighbours_z: copy N_gradient_neighbours_z"); 00563 00564 if (!source || !target) 00565 return 0; 00566 00567 target->NWZ = source->NWZ; 00568 target->NZ = source->NZ; 00569 target->NEZ = source->NEZ; 00570 target->WZ = source->WZ; 00571 target->CZ = source->CZ; 00572 target->EZ = source->EZ; 00573 target->SWZ = source->SWZ; 00574 target->SZ = source->SZ; 00575 target->SEZ = source->SEZ; 00576 00577 return 1; 00578 } 00579 00589 N_gradient_neighbours_2d *N_alloc_gradient_neighbours_2d(void) 00590 { 00591 N_gradient_neighbours_2d *grad; 00592 00593 grad = 00594 (N_gradient_neighbours_2d *) G_calloc(1, 00595 sizeof 00596 (N_gradient_neighbours_2d)); 00597 00598 grad->x = N_alloc_gradient_neighbours_x(); 00599 grad->y = N_alloc_gradient_neighbours_y(); 00600 00601 return grad; 00602 } 00603 00610 void N_free_gradient_neighbours_2d(N_gradient_neighbours_2d * grad) 00611 { 00612 00613 N_free_gradient_neighbours_x(grad->x); 00614 N_free_gradient_neighbours_y(grad->y); 00615 00616 G_free(grad); 00617 grad = NULL; 00618 00619 return; 00620 } 00621 00631 N_gradient_neighbours_2d 00632 * N_create_gradient_neighbours_2d(N_gradient_neighbours_x * x, 00633 N_gradient_neighbours_y * y) 00634 { 00635 N_gradient_neighbours_2d *grad; 00636 00637 int fail = 0; 00638 00639 G_debug(5, 00640 "N_create_gradient_neighbours_2d: create N_gradient_neighbours_2d"); 00641 00642 grad = N_alloc_gradient_neighbours_2d(); 00643 00644 if (!N_copy_gradient_neighbours_x(x, grad->x)) 00645 fail++; 00646 if (!N_copy_gradient_neighbours_y(y, grad->y)) 00647 fail++; 00648 00649 if (fail > 0) { 00650 N_free_gradient_neighbours_2d(grad); 00651 grad = NULL; 00652 } 00653 00654 return grad; 00655 } 00656 00665 int 00666 N_copy_gradient_neighbours_2d(N_gradient_neighbours_2d * source, 00667 N_gradient_neighbours_2d * target) 00668 { 00669 int fail = 0; 00670 00671 G_debug(5, 00672 "N_copy_gradient_neighbours_2d: copy N_gradient_neighbours_2d"); 00673 00674 if (!source || !target) 00675 return 0; 00676 00677 if (!(N_copy_gradient_neighbours_x(source->x, target->x))) 00678 fail++; 00679 if (!(N_copy_gradient_neighbours_y(source->y, target->y))) 00680 fail++; 00681 00682 if (fail > 0) { 00683 return 0; 00684 } 00685 00686 return 1; 00687 } 00688 00705 N_gradient_neighbours_2d *N_get_gradient_neighbours_2d(N_gradient_field_2d * 00706 field, 00707 N_gradient_neighbours_2d 00708 * gradient, int col, 00709 int row) 00710 { 00711 double NWN, NEN, WC, EC, SWS, SES; 00712 00713 double NWW, NEE, NC, SC, SWW, SEE; 00714 00715 N_gradient_neighbours_2d *grad = NULL; 00716 00717 N_gradient_neighbours_x *grad_x = NULL; 00718 00719 N_gradient_neighbours_y *grad_y = NULL; 00720 00721 00722 NWN = N_get_array_2d_d_value(field->x_array, col, row - 1); 00723 NEN = N_get_array_2d_d_value(field->x_array, col + 1, row - 1); 00724 WC = N_get_array_2d_d_value(field->x_array, col, row); 00725 EC = N_get_array_2d_d_value(field->x_array, col + 1, row); 00726 SWS = N_get_array_2d_d_value(field->x_array, col, row + 1); 00727 SES = N_get_array_2d_d_value(field->x_array, col + 1, row + 1); 00728 00729 NWW = N_get_array_2d_d_value(field->y_array, col - 1, row); 00730 NEE = N_get_array_2d_d_value(field->y_array, col + 1, row); 00731 NC = N_get_array_2d_d_value(field->y_array, col, row); 00732 SC = N_get_array_2d_d_value(field->y_array, col, row + 1); 00733 SWW = N_get_array_2d_d_value(field->y_array, col - 1, row + 1); 00734 SEE = N_get_array_2d_d_value(field->y_array, col + 1, row + 1); 00735 00736 00737 grad_x = N_create_gradient_neighbours_x(NWN, NEN, WC, EC, SWS, SES); 00738 grad_y = N_create_gradient_neighbours_y(NWW, NEE, NC, SC, SWW, SEE); 00739 00740 G_debug(5, 00741 "N_get_gradient_neighbours_2d: calculate N_gradient_neighbours_x NWN %g NEN %g WC %g EC %g SWS %g SES %g", 00742 NWN, NEN, WC, EC, SWS, SES); 00743 00744 G_debug(5, 00745 "N_get_gradient_neighbours_2d: calculate N_gradient_neighbours_y NWW %g NEE %g NC %g SC %g SWW %g SEE %g", 00746 NWW, NEE, NC, SC, SWW, SEE); 00747 00748 00749 /*if gradient is a NULL pointer, create a new one */ 00750 if (!gradient) { 00751 grad = N_create_gradient_neighbours_2d(grad_x, grad_y); 00752 gradient = grad; 00753 } 00754 else { 00755 grad = N_create_gradient_neighbours_2d(grad_x, grad_y); 00756 N_copy_gradient_neighbours_2d(grad, gradient); 00757 N_free_gradient_neighbours_2d(grad); 00758 } 00759 00760 N_free_gradient_neighbours_x(grad_x); 00761 N_free_gradient_neighbours_y(grad_y); 00762 00763 return gradient; 00764 } 00765 00766 00776 N_gradient_neighbours_3d *N_alloc_gradient_neighbours_3d(void) 00777 { 00778 N_gradient_neighbours_3d *grad; 00779 00780 grad = 00781 (N_gradient_neighbours_3d *) G_calloc(1, 00782 sizeof 00783 (N_gradient_neighbours_3d)); 00784 00785 grad->xt = N_alloc_gradient_neighbours_x(); 00786 grad->xc = N_alloc_gradient_neighbours_x(); 00787 grad->xb = N_alloc_gradient_neighbours_x(); 00788 grad->yt = N_alloc_gradient_neighbours_y(); 00789 grad->yc = N_alloc_gradient_neighbours_y(); 00790 grad->yb = N_alloc_gradient_neighbours_y(); 00791 grad->zt = N_alloc_gradient_neighbours_z(); 00792 grad->zb = N_alloc_gradient_neighbours_z(); 00793 00794 return grad; 00795 } 00796 00803 void N_free_gradient_neighbours_3d(N_gradient_neighbours_3d * grad) 00804 { 00805 00806 N_free_gradient_neighbours_x(grad->xt); 00807 N_free_gradient_neighbours_x(grad->xc); 00808 N_free_gradient_neighbours_x(grad->xb); 00809 N_free_gradient_neighbours_y(grad->yt); 00810 N_free_gradient_neighbours_y(grad->yc); 00811 N_free_gradient_neighbours_y(grad->yb); 00812 N_free_gradient_neighbours_z(grad->zt); 00813 N_free_gradient_neighbours_z(grad->zb); 00814 00815 G_free(grad); 00816 grad = NULL; 00817 00818 return; 00819 } 00820 00831 N_gradient_neighbours_3d 00832 * N_create_gradient_neighbours_3d(N_gradient_neighbours_x * xt, 00833 N_gradient_neighbours_x * xc, 00834 N_gradient_neighbours_x * xb, 00835 N_gradient_neighbours_y * yt, 00836 N_gradient_neighbours_y * yc, 00837 N_gradient_neighbours_y * yb, 00838 N_gradient_neighbours_z * zt, 00839 N_gradient_neighbours_z * zb) 00840 { 00841 N_gradient_neighbours_3d *grad; 00842 00843 int fail = 0; 00844 00845 G_debug(5, 00846 "N_create_gradient_neighbours_3d: create N_gradient_neighbours_3d"); 00847 00848 grad = N_alloc_gradient_neighbours_3d(); 00849 00850 if (!(N_copy_gradient_neighbours_x(xt, grad->xt))) 00851 fail++; 00852 if (!(N_copy_gradient_neighbours_x(xc, grad->xc))) 00853 fail++; 00854 if (!(N_copy_gradient_neighbours_x(xb, grad->xb))) 00855 fail++; 00856 if (!(N_copy_gradient_neighbours_y(yt, grad->yt))) 00857 fail++; 00858 if (!(N_copy_gradient_neighbours_y(yc, grad->yc))) 00859 fail++; 00860 if (!(N_copy_gradient_neighbours_y(yb, grad->yb))) 00861 fail++; 00862 if (!(N_copy_gradient_neighbours_z(zt, grad->zt))) 00863 fail++; 00864 if (!(N_copy_gradient_neighbours_z(zb, grad->zb))) 00865 fail++; 00866 00867 if (fail > 0) { 00868 return NULL; 00869 } 00870 00871 return grad; 00872 } 00873 00882 int 00883 N_copy_gradient_neighbours_3d(N_gradient_neighbours_3d * source, 00884 N_gradient_neighbours_3d * target) 00885 { 00886 int fail = 0; 00887 00888 G_debug(5, 00889 "N_copy_gradient_neighbours_3d: copy N_gradient_neighbours_3d"); 00890 00891 if (!source || !target) 00892 return 0; 00893 00894 if (!(N_copy_gradient_neighbours_x(source->xt, target->xt))) 00895 fail++; 00896 if (!(N_copy_gradient_neighbours_x(source->xc, target->xc))) 00897 fail++; 00898 if (!(N_copy_gradient_neighbours_x(source->xb, target->xb))) 00899 fail++; 00900 if (!(N_copy_gradient_neighbours_y(source->yt, target->yt))) 00901 fail++; 00902 if (!(N_copy_gradient_neighbours_y(source->yc, target->yc))) 00903 fail++; 00904 if (!(N_copy_gradient_neighbours_y(source->yb, target->yb))) 00905 fail++; 00906 if (!(N_copy_gradient_neighbours_z(source->zt, target->zt))) 00907 fail++; 00908 if (!(N_copy_gradient_neighbours_z(source->zb, target->zb))) 00909 fail++; 00910 00911 if (fail > 0) { 00912 return 0; 00913 } 00914 00915 return 1; 00916 } 00917 00928 N_gradient_field_2d *N_alloc_gradient_field_2d(int cols, int rows) 00929 { 00930 N_gradient_field_2d *field; 00931 00932 G_debug(5, 00933 "N_alloc_gradient_field_2d: allocate a N_gradient_field_2d struct"); 00934 00935 field = (N_gradient_field_2d *) G_calloc(1, sizeof(N_gradient_field_2d)); 00936 00937 field->x_array = N_alloc_array_2d(cols, rows, 1, DCELL_TYPE); 00938 field->y_array = N_alloc_array_2d(cols, rows, 1, DCELL_TYPE); 00939 00940 field->cols = cols; 00941 field->rows = rows; 00942 00943 return field; 00944 } 00945 00952 void N_free_gradient_field_2d(N_gradient_field_2d * field) 00953 { 00954 00955 N_free_array_2d(field->x_array); 00956 N_free_array_2d(field->y_array); 00957 00958 G_free(field); 00959 00960 field = NULL; 00961 00962 return; 00963 } 00964 00973 int 00974 N_copy_gradient_field_2d(N_gradient_field_2d * source, 00975 N_gradient_field_2d * target) 00976 { 00977 G_debug(3, "N_copy_gradient_field_2d: copy N_gradient_field_2d"); 00978 00979 if (!source || !target) 00980 return 0; 00981 00982 N_copy_array_2d(source->x_array, target->x_array); 00983 N_copy_array_2d(source->y_array, target->y_array); 00984 00985 return 1; 00986 } 00987 00994 void N_print_gradient_field_2d_info(N_gradient_field_2d * field) 00995 { 00996 fprintf(stdout, "N_gradient_field_2d \n"); 00997 fprintf(stdout, "Cols %i\n", field->cols); 00998 fprintf(stdout, "Rows: %i\n", field->rows); 00999 fprintf(stdout, "X array pointer: %p\n", field->x_array); 01000 fprintf(stdout, "Y array pointer: %p\n", field->y_array); 01001 fprintf(stdout, "Min %g\n", field->min); 01002 fprintf(stdout, "Max %g\n", field->max); 01003 fprintf(stdout, "Sum %g\n", field->sum); 01004 fprintf(stdout, "Mean %g\n", field->mean); 01005 fprintf(stdout, "Nonull %i\n", field->nonull); 01006 fprintf(stdout, "X array info \n"); 01007 N_print_array_2d_info(field->x_array); 01008 fprintf(stdout, "Y array info \n"); 01009 N_print_array_2d_info(field->y_array); 01010 01011 return; 01012 } 01013 01014 01026 N_gradient_field_3d *N_alloc_gradient_field_3d(int cols, int rows, int depths) 01027 { 01028 N_gradient_field_3d *field; 01029 01030 G_debug(5, 01031 "N_alloc_gradient_field_3d: allocate a N_gradient_field_3d struct"); 01032 01033 field = (N_gradient_field_3d *) G_calloc(1, sizeof(N_gradient_field_3d)); 01034 01035 field->x_array = N_alloc_array_3d(cols, rows, depths, 1, DCELL_TYPE); 01036 field->y_array = N_alloc_array_3d(cols, rows, depths, 1, DCELL_TYPE); 01037 field->z_array = N_alloc_array_3d(cols, rows, depths, 1, DCELL_TYPE); 01038 01039 field->cols = cols; 01040 field->rows = rows; 01041 field->depths = depths; 01042 01043 return field; 01044 } 01045 01046 01053 void N_free_gradient_field_3d(N_gradient_field_3d * field) 01054 { 01055 01056 N_free_array_3d(field->x_array); 01057 N_free_array_3d(field->y_array); 01058 N_free_array_3d(field->z_array); 01059 01060 G_free(field); 01061 01062 field = NULL; 01063 01064 return; 01065 } 01066 01067 01076 int 01077 N_copy_gradient_field_3d(N_gradient_field_3d * source, 01078 N_gradient_field_3d * target) 01079 { 01080 G_debug(3, "N_copy_gradient_field_3d: copy N_gradient_field_3d"); 01081 01082 if (!source || !target) 01083 return 0; 01084 01085 N_copy_array_3d(source->x_array, target->x_array); 01086 N_copy_array_3d(source->y_array, target->y_array); 01087 N_copy_array_3d(source->z_array, target->z_array); 01088 01089 return 1; 01090 } 01091 01098 void N_print_gradient_field_3d_info(N_gradient_field_3d * field) 01099 { 01100 01101 fprintf(stdout, "N_gradient_field_3d \n"); 01102 fprintf(stdout, "Cols %i\n", field->cols); 01103 fprintf(stdout, "Rows: %i\n", field->rows); 01104 fprintf(stdout, "Depths %i\n", field->depths); 01105 fprintf(stdout, "X array pointer: %p\n", field->x_array); 01106 fprintf(stdout, "Y array pointer: %p\n", field->y_array); 01107 fprintf(stdout, "Z array pointer: %p\n", field->z_array); 01108 fprintf(stdout, "Min %g\n", field->min); 01109 fprintf(stdout, "Max %g\n", field->max); 01110 fprintf(stdout, "Sum %g\n", field->sum); 01111 fprintf(stdout, "Mean %g\n", field->mean); 01112 fprintf(stdout, "Nonull %i\n", field->nonull); 01113 fprintf(stdout, "X array info \n"); 01114 N_print_array_3d_info(field->x_array); 01115 fprintf(stdout, "Y array info \n"); 01116 N_print_array_3d_info(field->y_array); 01117 fprintf(stdout, "Z array info \n"); 01118 N_print_array_3d_info(field->z_array); 01119 01120 return; 01121 }