Changeset 8569


Ignore:
Timestamp:
Sep 10, 2012, 6:47:31 PM (13 years ago)
Author:
steve
Message:

Speedup to interpolate routine in quantity_ext.c

Location:
trunk/anuga_core/source/anuga/abstract_2d_finite_volumes
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/anuga_core/source/anuga/abstract_2d_finite_volumes/quantity.py

    r8505 r8569  
    311311    # @brief Compute interpolated values at edges and centroid.
    312312    # @note vertex_values must be set before calling this.
    313     def interpolate(self):
     313    def interpolate_old(self):
    314314        """Compute interpolated values at edges and centroid
    315315        Pre-condition: vertex_values have been set
     
    337337        self.interpolate_from_vertices_to_edges()
    338338
     339
     340    ##
     341    # @brief Compute interpolated values at edges and centroid.
     342    # @note vertex_values must be set before calling this.
     343    def interpolate(self):
     344        """Compute interpolated values at edges and centroid
     345        Pre-condition: vertex_values have been set
     346        """
     347        from quantity_ext import interpolate
     348        interpolate(self)
     349
     350
    339351    def interpolate_from_vertices_to_edges(self):
    340352        # Call correct module function (either from this module or C-extension)
     353
     354        from quantity_ext import interpolate_from_vertices_to_edges
    341355        interpolate_from_vertices_to_edges(self)
    342356
    343357    def interpolate_from_edges_to_vertices(self):
    344358        # Call correct module function (either from this module or C-extension)
     359
     360        from quantity_ext import interpolate_from_edges_to_vertices
    345361        interpolate_from_edges_to_vertices(self)
    346362
  • trunk/anuga_core/source/anuga/abstract_2d_finite_volumes/quantity_ext.c

    r8123 r8569  
    663663}
    664664
     665int _interpolate(int N,
     666                 double* vertex_values,
     667                 double* edge_values,
     668                 double* centroid_values) {
     669
     670        int k, k3;
     671        double q0, q1, q2;
     672
     673
     674        for (k=0; k<N; k++) {
     675                k3 = 3*k;
     676
     677                q0 = vertex_values[k3 + 0];
     678                q1 = vertex_values[k3 + 1];
     679                q2 = vertex_values[k3 + 2];
     680
     681                centroid_values[k] = (q0+q1+q2)/3.0;
     682
     683                edge_values[k3 + 0] = 0.5*(q1+q2);
     684                edge_values[k3 + 1] = 0.5*(q0+q2);
     685                edge_values[k3 + 2] = 0.5*(q0+q1);
     686        }
     687        return 0;
     688}
     689
    665690int _interpolate_from_vertices_to_edges(int N,
    666691                                        double* vertex_values,
     
    9841009
    9851010        return Py_BuildValue("");
     1011}
     1012
     1013
     1014
     1015PyObject *interpolate(PyObject *self, PyObject *args) {
     1016        //
     1017        //Compute edge and centroid values from vertex values using linear interpolation
     1018        //
     1019
     1020        PyObject *quantity;
     1021        PyArrayObject *vertex_values, *edge_values, *centroid_values;
     1022
     1023        int N, err;
     1024
     1025        // Convert Python arguments to C
     1026        if (!PyArg_ParseTuple(args, "O", &quantity)) {
     1027          PyErr_SetString(PyExc_RuntimeError,
     1028                          "quantity_ext.c: interpolate could not parse input");
     1029          return NULL;
     1030        }
     1031
     1032        vertex_values = get_consecutive_array(quantity, "vertex_values");
     1033        edge_values = get_consecutive_array(quantity, "edge_values");
     1034        centroid_values = get_consecutive_array(quantity, "centroid_values");
     1035
     1036        N = vertex_values -> dimensions[0];
     1037
     1038        err = _interpolate(N,
     1039                           (double*) vertex_values -> data,
     1040                           (double*) edge_values -> data,
     1041                           (double*) centroid_values -> data);
     1042
     1043        if (err != 0) {
     1044          PyErr_SetString(PyExc_RuntimeError,
     1045                          "Interpolate could not be computed");
     1046          return NULL;
     1047        }
     1048
     1049        // Release and return
     1050        Py_DECREF(vertex_values);
     1051        Py_DECREF(edge_values);
     1052        Py_DECREF(centroid_values);
     1053
     1054        return Py_BuildValue("");
     1055
    9861056}
    9871057
     
    21932263        {"saxpy_centroid_values", saxpy_centroid_values, METH_VARARGS, "Print out"},
    21942264        {"compute_gradients", compute_gradients, METH_VARARGS, "Print out"},
    2195     {"compute_local_gradients", compute_gradients, METH_VARARGS, "Print out"},
     2265        {"compute_local_gradients", compute_gradients, METH_VARARGS, "Print out"},
    21962266        {"extrapolate_from_gradient", extrapolate_from_gradient,
    21972267                METH_VARARGS, "Print out"},
     
    22062276                interpolate_from_edges_to_vertices,
    22072277                METH_VARARGS, "Print out"},
     2278        {"interpolate", interpolate, METH_VARARGS, "Print out"},
    22082279        {"average_vertex_values", average_vertex_values, METH_VARARGS, "Print out"},           
    22092280        {NULL, NULL, 0, NULL}   // sentinel
Note: See TracChangeset for help on using the changeset viewer.