static double JumpNorm(DGField f) { GridData grd = (GridData)f.GridDat; int D = grd.SpatialDimension; var e2cTrafo = grd.Edges.Edge2CellTrafos; f.MPIExchange(); double Unorm = 0; EdgeQuadrature.GetQuadrature( new int[] { D + 1 }, grd, (new EdgeQuadratureScheme()).Compile(grd, f.Basis.Degree * 2), delegate(int i0, int Length, QuadRule QR, MultidimensionalArray EvalResult) { // Evaluate NodeSet NS = QR.Nodes; EvalResult.Clear(); int NoOfNodes = NS.NoOfNodes; for (int j = 0; j < Length; j++) { int iEdge = j + i0; int jCell_IN = grd.Edges.CellIndices[iEdge, 0]; int jCell_OT = grd.Edges.CellIndices[iEdge, 1]; var uDiff = EvalResult.ExtractSubArrayShallow(new int[] { j, 0, 0 }, new int[] { j, NoOfNodes - 1, -1 }); if (jCell_OT >= 0) { int iTrafo_IN = grd.Edges.Edge2CellTrafoIndex[iEdge, 0]; int iTrafo_OT = grd.Edges.Edge2CellTrafoIndex[iEdge, 1]; MultidimensionalArray uIN = MultidimensionalArray.Create(1, NoOfNodes); MultidimensionalArray uOT = MultidimensionalArray.Create(1, NoOfNodes); NodeSet NS_IN = NS.GetVolumeNodeSet(grd, iTrafo_IN); NodeSet NS_OT = NS.GetVolumeNodeSet(grd, iTrafo_OT); f.Evaluate(jCell_IN, 1, NS_IN, uIN); f.Evaluate(jCell_OT, 1, NS_OT, uOT); uDiff.Acc(+1.0, uIN); uDiff.Acc(-1.0, uOT); } else { uDiff.Clear(); } } EvalResult.ApplyAll(x => x * x); }, delegate(int i0, int Length, MultidimensionalArray ResultsOfIntegration) { // SaveIntegrationResults Unorm += ResultsOfIntegration.Sum(); }).Execute(); Unorm = Unorm.MPISum(); return(Unorm.Sqrt()); }