/// <summary> /// Update the actual sensor field /// </summary> public void Update(DGField fieldToTest) { sensorField.Clear(); fieldToTestRestricted.Clear(); fieldToTestRestricted.AccLaidBack(1.0, fieldToTest); DGField difference = fieldToTestRestricted - fieldToTest; foreach (Chunk chunk in CellMask.GetFullMask(fieldToTest.GridDat)) { for (int i = 0; i < chunk.Len; i++) { int cell = i + chunk.i0; CellMask singleCellMask = new CellMask(fieldToTest.GridDat, Chunk.GetSingleElementChunk(cell)); CellQuadratureScheme scheme = new CellQuadratureScheme(domain: singleCellMask); var rule = scheme.SaveCompile(fieldToTest.GridDat, 2 * fieldToTest.Basis.Degree); double[] a = difference.LocalLxError((ScalarFunction)null, null, rule); double[] b = fieldToTest.LocalLxError((ScalarFunction)null, null, rule); double mySensorValue = a[0] / b[0]; // not using L2-norm, but rather only the scalar product mySensorValue = mySensorValue * mySensorValue; if (double.IsNaN(mySensorValue)) { mySensorValue = 0.0; } sensorField.SetMeanValue(cell, mySensorValue); } } }