Beispiel #1
0
        public async Task CustomFilterConvertersRunner_Convert_One_ArrayFilter_Converted_Test()
        {
            // Arrange
            var converter      = CreateCustomFilterConvertersRunner();
            var cloneConverter = new CloneFilterConverter <IUser>();
            var converters     = new List <IFilterConverter <IUser> > {
                cloneConverter
            };

            _MockCustomFilterConverterCollection.Setup(m => m.Converters).Returns(converters);

            Filter <IUser> filter = new ArrayFilter <IUser, int> {
                Array = new[] { 1, 2, 3, 4, 5 }
            };

            // Act
            var actual = await converter.ConvertAsync(filter);

            // Assert
            Assert.IsTrue(actual.IsArray);
            Assert.AreNotEqual(filter, actual);
            Assert.IsTrue(string.IsNullOrWhiteSpace(filter.NonFilter));
            Assert.IsTrue(actual.IsRoot);
        }
Beispiel #2
0
 public void FilterDigit_WithNull_ThrowArgumentNullException()
 => Assert.Throws <ArgumentNullException>(() => ArrayFilter.Filter(null, new DigitFilter(3)));
Beispiel #3
0
        public void IsDigitOutOfRangeTest()
        {
            int[] array = { 1, 2, 3 };

            ArrayFilter.Filter(array, new DigitFilter(10));
        }
Beispiel #4
0
 public void IsNullArrayTest()
 => ArrayFilter.Filter(null, new DigitFilter(3));
Beispiel #5
0
        /// <summary>
        /// Calculate the roughness lenght based on objects like buildings and vegetation areas
        /// </summary>
        /// <param name="ReaderClass">Program Reader Class</param>
        private static void CreateAdaptiveRoughnessLenght(ProgramReaders ReaderClass)
        {
            //read buildings into a local array
            float[][] TempArray = CreateArray <float[]>(NII + 2, () => new float[NJJ + 2]);

            if (Topo == 1)
            {
                ReaderClass.ReadBuildingsTerrain(TempArray);
            }
            else
            {
                ReaderClass.ReadBuildingsFlat(TempArray);
            }

            ArrayFilter fil = new ArrayFilter();

            //Find building outlines
            //TempArray = fil.FindOutline(TempArray);

            // Take building height into Z0
            float max = 0;

            for (int i = 0; i <= NII; i++)
            {
                for (int j = 0; j <= NJJ; j++)
                {
                    if (TempArray[i][j] > 1)
                    {
                        float val = MathF.Log10(TempArray[i][j]); //roughness from building height
                        max = MathF.Max(max, val);
                        Program.Z0Gral[i][j] = MathF.Min(AdaptiveRoughnessMax, val);
                    }
                }
            }

            max = Math.Min(max, Program.AdaptiveRoughnessMax);
            //Filter Roughness
            Program.Z0Gral = fil.LowPassGaussian(Program.Z0Gral, Program.DXK, 40, max); // scale with max

            //roughness length for building walls
            float buildingZ0 = 0.01F;

            if (File.Exists("building_roughness.txt") == true)
            {
                try
                {
                    using (StreamReader sr = new StreamReader("building_roughness.txt"))
                    {
                        buildingZ0 = Convert.ToSingle(sr.ReadLine().Replace(".", Program.Decsep));
                    }
                }
                catch
                { }
            }

            //Set Roughness within buildings to building wall value and clear TempArray
            for (int i = 0; i <= NII; i++)
            {
                for (int j = 0; j <= NJJ; j++)
                {
                    if (TempArray[i][j] > Program.Z0Gral[i][j] * 2)
                    {
                        Program.Z0Gral[i][j] = buildingZ0;
                    }
                    TempArray[i][j] = 0;
                }
            }

            // Read vegetation heigth, limit vegetation roughness to 1.3 m and combine with building roughness
            ReaderClass.ReadVegetationDomain(TempArray);
            //Limit vegetation to 1.5
            for (int i = 0; i <= NII; i++)
            {
                for (int j = 0; j <= NJJ; j++)
                {
                    TempArray[i][j] = MathF.Min(1.3F, TempArray[i][j]);
                }
            }

            // Filter vegetation array
            TempArray = fil.LowPassGaussian(TempArray, Program.DXK, 15, 0); // no scale
            fil       = null;

            for (int i = 0; i <= NII; i++)
            {
                for (int j = 0; j <= NJJ; j++)
                {
                    Program.Z0Gral[i][j] = MathF.Max(MathF.Min(1.5F, TempArray[i][j]), Program.Z0Gral[i][j]);
                }
            }

            if ((Program.Topo == 1) && (Program.LandUseAvailable == true))
            {
                float DDX1       = Program.DDX[1];
                float DDY1       = Program.DDY[1];
                int   Delta_IKOO = (int)XsiMinGral - Program.GrammWest;
                int   Delta_JKOO = (int)EtaMinGral - Program.GrammSouth;
                //With topography and LandUse File for Roughness lenght -> Compare with Z0Gramm and take larger value
                for (int i = 0; i <= NII; i++)
                {
                    for (int j = 0; j <= NJJ; j++)
                    {
                        int GrammCellX = Math.Clamp((int)((Delta_IKOO + DXK * i - DXK * 0.5) / DDX1) + 1, 1, Program.NX);
                        int GrammCellY = Math.Clamp((int)((Delta_JKOO + DYK * j - DYK * 0.5) / DDY1) + 1, 1, Program.NY);
                        Program.Z0Gral[i][j] = MathF.Max(Program.Z0Gramm[GrammCellX][GrammCellY],
                                                         MathF.Min(AdaptiveRoughnessMax, Program.Z0Gral[i][j]));
                    }
                }
            }
            else
            {
                // limit roughness between min and max
                for (int i = 0; i <= NII; i++)
                {
                    for (int j = 0; j <= NJJ; j++)
                    {
                        Program.Z0Gral[i][j] = MathF.Max(Z0, MathF.Min(AdaptiveRoughnessMax, Program.Z0Gral[i][j]));
                    }
                }
            }

            max = 0;
            float min = 20000;

            for (int i = 0; i <= NII; i++)
            {
                for (int j = 0; j <= NJJ; j++)
                {
                    max = MathF.Max(max, Program.Z0Gral[i][j]);
                    min = MathF.Min(min, Program.Z0Gral[i][j]);
                }
            }

            string Info = "Using adaptive roughness length. User minimum: " + Z0.ToString("0.00") + " m  User maximum: " + AdaptiveRoughnessMax.ToString("0.00") + " m";

            Console.WriteLine(Info);
            ProgramWriters.LogfileGralCoreWrite(Info);
            Info = "                                 Used minimum: " + min.ToString("0.00") + " m  Used maximum: " + max.ToString("0.00") + " m";
            Console.WriteLine(Info);
            ProgramWriters.LogfileGralCoreWrite(Info);

            // ProgramWriters WriteClass = new ProgramWriters();
            ProgramWriters WriteClass = new ProgramWriters();

            WriteClass.WriteBuildingHeights("RoughnessLengthsGral.txt", Program.Z0Gral, "0.00", 2, Program.GralWest, Program.GralSouth);

            WriteClass = null;
            TempArray  = null;
        }