GRASS Programmer's Manual  6.5.svn(2012)-r51648
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Defines
N_gradient.c
Go to the documentation of this file.
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 }