Exemplo n.º 1
0
        private static void CalculatePartialDerivatives(float[][] dedy, float[][] d2edy2, float[][] dds, float[][] yds, float[][] ys)
        {
            var c = 0.0f;

            Parallel.For(0, ys.Length, row =>
            {
                var slots = Vector <float> .Count;
                var accum = Vector <float> .Zero;
                var col   = row + 1;
                for (; col + slots < ys[row].Length - row; ++col)
                {
                    var v  = new Vector <float>(dds[row], col);
                    accum += v;
                }

                c += Vector.Dot(accum, Vector <float> .One);

                for (; col < ys[row].Length; ++col)
                {
                    c += dds[row][col];
                }
            });

            Parallel.For(0, ys.Length, i =>
            {
                var ysColumns = new float[ys[0].Length][];
                for (var k = 0; k < ys[0].Length; ++k)
                {
                    ysColumns[k] = JaggedArray.GetColumn(ys, k);
                }

                for (var j = 0; j < ys[i].Length; ++j)
                {
                    var slots       = Vector <float> .Count;
                    var dedyAccum   = Vector <float> .Zero;
                    var d2edy2Accum = Vector <float> .Zero;
                    var dedySum     = 0.0f;
                    var d2edy2Sum   = 0.0f;
                    var s           = 0;
                    for (; s + slots < ys.Length; s += slots)
                    {
                        var dis             = new Vector <float>(dds[i], s);
                        var disStar         = new Vector <float>(yds[i], s);
                        var yij             = new Vector <float>(ys[i][j]);
                        var ysj             = new Vector <float>(ysColumns[j], s);
                        var disMinusDisStar = dis - disStar;
                        var disMulDisStar   = dis * disStar;
                        var yijMinusYsj     = yij - ysj;
                        var one             = Vector <float> .One;

                        dedyAccum   += disMinusDisStar / disMulDisStar * yijMinusYsj;
                        d2edy2Accum += one / disMulDisStar *
                                       (
                            disMinusDisStar -
                            (yijMinusYsj * yijMinusYsj) / disStar *
                            (one + disMinusDisStar / dis)
                                       );
                    }

                    dedySum   += Vector.Dot(dedyAccum, Vector <float> .One);
                    d2edy2Sum += Vector.Dot(d2edy2Accum, Vector <float> .One);

                    for (; s < ys.Length; ++s)
                    {
                        var disMinusDisStar = dds[i][s] - yds[i][s];
                        var disMulDisStar   = dds[i][s] * yds[i][s];
                        var yijMinusYsj     = ys[i][j] - ys[s][j];
                        var one             = 1.0f;

                        dedySum += disMinusDisStar /
                                   disMulDisStar *
                                   yijMinusYsj;

                        d2edy2Sum += one / disMulDisStar *
                                     (
                            disMinusDisStar -
                            (yijMinusYsj * yijMinusYsj) / yds[i][s] *
                            (one + disMinusDisStar / dds[i][s])
                                     );
                    }

                    dedy[i][j]   = dedySum * -2.0f / c;
                    d2edy2[i][j] = d2edy2Sum * -2.0f / c;
                }
                ;
            });
        }