void ComputeChangeRate(double[] k, int jCell, BitArray AcceptedMask, SinglePhaseField Phi, VectorField <SinglePhaseField> gradPhi, IEvaluatorNonLin Evaluator)
        {
            int N   = this.LevelSetBasis.GetLength(jCell);
            int i0L = this.LevelSetMapping.LocalUniqueCoordinateIndex(0, jCell, 0);

            Debug.Assert(k.Length == N);

            if (temp == null)
            {
                temp = new double[this.LevelSetMapping.LocalLength];
            }

            gm.GradientUpdate(jCell, AcceptedMask, Phi, gradPhi);

            for (int n = 0; n < N; n++)
            {
                temp[n + i0L] = 0;
            }
#if DEBUG
            double[] oldtemp = temp.CloneAs();
#endif
            Evaluator.time           = 0.0;
            Evaluator.MPITtransceive = false;
            Evaluator.Evaluate <double[]>(1.0, 1.0, temp);

#if DEBUG
            for (int i = 0; i < oldtemp.Length; i++)
            {
                if (i < i0L && i >= (i0L + N))
                {
                    Debug.Assert(oldtemp[i] == temp[i]); // check that the locality of the operator is implemented correctly
                }
            }
#endif

            for (int n = 0; n < N; n++)
            {
                k[n] = temp[n + i0L];
            }
        }