/// <summary>
        /// Inherited member. Divides the simulation into threads, and begins.
        /// </summary>
        public override void Begin()
        {
            Random Rnd = new Random();

            //processorCT = UI.PachydermAc_PlugIn.Instance.ProcessorSpec();
            processorCT  = 4;
            Current_Ray  = new int[processorCT];
            Detections   = new List <int[]> [Receiver.Count, processorCT];
            SequenceList = new List <int[]> [Receiver.Count];

            T_List = new System.Threading.Thread[processorCT];

            for (int P_I = 0; P_I < processorCT; P_I++)
            {
                for (int i = 0; i < Receiver.Count; i++)
                {
                    Detections[i, P_I] = new List <int[]>();
                }

                Calc_Params T = new Calc_Params(P_I * Raycount / processorCT, (P_I + 1) * Raycount / processorCT, P_I, Rnd.Next());
                System.Threading.ParameterizedThreadStart TS = new System.Threading.ParameterizedThreadStart(delegate { Calculate(T); });
                T_List[P_I] = new System.Threading.Thread(TS);
                T_List[P_I].Start();
            }
        }
Example #2
0
        /// <summary>
        /// Inherited member. Divides the simulation into threads, and begins.
        /// </summary>
        public override void Begin()
        {
            Random Rnd = new Random();

            _processorCt = UI.PachydermAc_PlugIn.Instance.ProcessorSpec();
            _currentRay  = new int[_processorCt];
            _rayTotal    = new int[_processorCt];
            _lost        = new double[_processorCt];
            _eInit       = new double[_processorCt];
            _u           = new double[_processorCt];
            _v           = new double[_processorCt];
            _tlist       = new System.Threading.Thread[_processorCt];

            for (int P_I = 0; P_I < _processorCt; P_I++)
            {
                int start = (int)Math.Floor((double)P_I * Raycount / _processorCt);
                int end;
                if (P_I == _processorCt - 1)
                {
                    end = Raycount;
                }
                else
                {
                    end = (P_I + 1) * Raycount / _processorCt;
                }
                Calc_Params T = new Calc_Params(Room, start, end, P_I, Rnd.Next());
                System.Threading.ParameterizedThreadStart TS = new System.Threading.ParameterizedThreadStart(delegate { Calculate(T); });
                _tlist[P_I] = new System.Threading.Thread(TS);
                _tlist[P_I].Start();
            }

            System.Runtime.GCSettings.LatencyMode = System.Runtime.GCLatencyMode.Batch;
        }
        /// <summary>
        /// Inherited member. Divides the simulation into threads, and begins.
        /// </summary>
        public override void Begin()
        {
            Random Rnd = new Random();
            processorCT = UI.PachydermAc_PlugIn.Instance.ProcessorSpec();
            Current_Ray = new int[processorCT];
            Detections = new List<int[]>[Receiver.Count, processorCT];
            SequenceList = new List<int[]>[Receiver.Count];

            T_List = new System.Threading.Thread[processorCT];

            for (int P_I = 0; P_I < processorCT; P_I++)
            {
                for (int i = 0; i < Receiver.Count; i++)
                {
                    Detections[i, P_I] = new List<int[]>();
                }
                 
                Calc_Params T = new Calc_Params(P_I * Raycount / processorCT, (P_I + 1) * Raycount / processorCT, P_I, Rnd.Next());
                System.Threading.ParameterizedThreadStart TS = new System.Threading.ParameterizedThreadStart(delegate { Calculate(T); });
                T_List[P_I] = new System.Threading.Thread(TS);
                T_List[P_I].Start();
            }
        }
        /// <summary>
        /// Called by each thread from the begin method.
        /// </summary>
        /// <param name="i">the object is type "Calc_Params" which holds all the necessary information to run a portion of the simulation.</param>
        public void Calculate(object i)
        {
            Calc_Params Params = (Calc_Params)i;
            Random      RND    = new Random(Params.RandomSeed);

            ST = DateTime.Now;
            Hare.Geometry.Point Origin = Source.H_Origin();
            ///'''''''''''''Renewable Variables''''''''''''''''''
            double SumLength;
            double u = 0;
            double v = 0;

            Hare.Geometry.Point Point = new Hare.Geometry.Point();
            int ChosenIndex           = 0;
            List <Hare.Geometry.Point> Start;
            int        Reflections;
            List <int> Sequence = new List <int>();

            ///''''''''''''''''''''''''''''''''''''''''''''''''''

            for (Current_Ray[Params.ThreadID] = 0; Current_Ray[Params.ThreadID] < Params.EndIndex - Params.StartIndex; Current_Ray[Params.ThreadID]++)
            {
                BroadRay R = Source.Directions(Current_Ray[Params.ThreadID] + Params.StartIndex, Params.ThreadID, ref RND);
                SumLength   = 0;
                Reflections = 0;
                Sequence.Clear();
                List <int> code = new List <int> {
                    0
                };
                List <double> leg = new List <double> {
                    0
                };
                do
                {
                    ///Only useable with homogeneous media///
                    SumLength += leg[0];
                    R.Ray_ID   = RND.Next();
                    if (Room.shoot(R, out u, out v, out ChosenIndex, out Start, out leg, out code))
                    {
                        if (!Room.IsPlanar(ChosenIndex))
                        {
                            break;
                        }
                        Reflections++;
                        ReflectRay(ref R, ref u, ref v, ref ChosenIndex);
                        if (Reflections > ImageOrder + 1)
                        {
                            bool[] B = Receiver.SimpleCheck(R, Start[0], SumLength);
                            for (int q = 0; q < B.Length; q++)
                            {
                                if (B[q])
                                {
                                    Detections[q, Params.ThreadID].Add(Sequence.ToArray());
                                }
                            }
                        }
                    }
                    else
                    {
                        //Rhino.RhinoDoc.ActiveDoc.Objects.AddCurve(new LineCurve(Pachyderm_Acoustic.Utilities.PachTools.HPttoRPt(R.origin), Pachyderm_Acoustic.Utilities.PachTools.HPttoRPt(R.origin + R.direction) * 5));
                        break;
                    }
                    Sequence.Add(Room.PlaneID(ChosenIndex));
                    R.origin = Start[0];
                }while (SumLength < CutoffLength);
            }
        }
Example #5
0
        /// <summary>
        /// Called by each thread from the begin method.
        /// </summary>
        /// <param name="i">the object is type "Calc_Params" which holds all the necessary information to run a portion of the simulation.</param>
        public void Calculate(object i)
        {
            ///Homogeneous media only...
            Calc_Params Params = (Calc_Params)i;
            Random      Rnd    = new Random(Params.RandomSeed);

            _st = DateTime.Now;
            Point             Origin = Source.H_Origin();
            int               Dir_ID = Params.StartIndex;
            List <Point>      Start;
            List <double>     leg;
            List <int>        code;
            Queue <OctaveRay> Rays = new Queue <OctaveRay>();
            BroadRay          R;
            int               order;

            double Threshold_Power_1 = 0;

            double[] Threshold_Power_2 = new double[8];
            double[] Threshold_Power_3 = new double[8];
            for (_currentRay[Params.ThreadID] = 0; _currentRay[Params.ThreadID] < Params.EndIndex - Params.StartIndex; _currentRay[Params.ThreadID]++)
            {
                R = Source.Directions(_currentRay[Params.ThreadID] + Params.StartIndex, Params.ThreadID, ref Rnd, _octaves);
                for (int oct = 0; oct < 8; oct++)
                {
                    R.Energy[oct] /= Raycount;
                }
                for (int j = 0; j < 8; j++)
                {
                    _eInit[Params.ThreadID] += R.Energy[j];
                }
                Threshold_Power_1 = R.Energy[h_oct] * 1E-2;
                foreach (int o in _octaves)
                {
                    Threshold_Power_2[o] = R.Energy[o] * 1E-4;  //Cease splitting at 0.0001 sound intensity, or 40 dB down.
                    Threshold_Power_3[o] = R.Energy[o] * 1E-10; //Finish 16 digits (double Precision) under 60 dB of decay.
                }
                order = 0;
                double u = 0, v = 0;
                do
                {
                    R.Ray_ID = Rnd.Next();
                    if (!Params.Room.shoot(R, out u, out v, out R.Surf_ID, out Start, out leg, out code))
                    {
                        //Ray is lost... move on...
                        for (int j = 0; j < 8; j++)
                        {
                            _lost[Params.ThreadID] += R.Energy[j];
                        }
                        goto Do_Scattered;
                    }

                    if (order > IS_Order)
                    {
                        //Specular ray order exceeds order of image source calculation. Start logging specular part.
                        RecMain.CheckBroadbandRay(R, Start[0]);
                    }
                    R.Energy[0] *= Math.Pow(10, -.1 * Room.Attenuation(code[0])[0] * leg[0]);
                    R.Energy[1] *= Math.Pow(10, -.1 * Room.Attenuation(code[0])[1] * leg[0]);
                    R.Energy[2] *= Math.Pow(10, -.1 * Room.Attenuation(code[0])[2] * leg[0]);
                    R.Energy[3] *= Math.Pow(10, -.1 * Room.Attenuation(code[0])[3] * leg[0]);
                    R.Energy[4] *= Math.Pow(10, -.1 * Room.Attenuation(code[0])[4] * leg[0]);
                    R.Energy[5] *= Math.Pow(10, -.1 * Room.Attenuation(code[0])[5] * leg[0]);
                    R.Energy[6] *= Math.Pow(10, -.1 * Room.Attenuation(code[0])[6] * leg[0]);
                    R.Energy[7] *= Math.Pow(10, -.1 * Room.Attenuation(code[0])[7] * leg[0]);
                    R.AddLeg(leg[0] / Room.Sound_speed(code[0]));
                    R.origin = Start[0];

                    order++;

                    ///////////////////////////////////////////////////////////////
                    //The Split Case : Specular and Diffuse Explicit
                    ///Standard Energy Conservation Routine-
                    // 1. Multiply by Reflection energy. (1 - Absorption)
                    double cos_theta;
                    Room.Absorb(ref R, out cos_theta, u, v);
                    // 2. Apply Transmission (if any).
                    //// a. Create new source for transmitted energy (E * Transmission).
                    //// b. Modify E (E * 1 - Transmission).
                    foreach (int oct in _octaves)
                    {
                        if (Params.Room.TransmissionValue[R.Surf_ID][oct] > 0.0)
                        {
                            Rays.Enqueue(R.SplitRay(oct, Params.Room.TransmissionValue[R.Surf_ID][oct]));
                        }
                    }
                    //3. Apply Scattering
                    Room.Scatter_Early(ref R, ref Rays, ref Rnd, cos_theta, u, v);
                    ///////////////////////////////////////////////////////////////

                    //Utilities.PachTools.Ray_Acoustics.SpecularReflection(ref R.direction, ref Room, ref _u[Params.ThreadID], ref _v[Params.ThreadID], ref R.Surf_ID);
                } while (R.Energy[h_oct] > Threshold_Power_1);

                foreach (int o in _octaves)
                {
                    Rays.Enqueue(R.SplitRay(o));                        //Split all rays into individual octaves.
                }
Do_Scattered:

                if (Rays.Count > 0)
                {
                    do
                    {
                        OctaveRay OR = Rays.Dequeue();
                        _rayTotal[Params.ThreadID]++;
                        do
                        {
                            OR.Ray_ID = Rnd.Next();
                            if (!Params.Room.shoot(OR, out u, out v, out OR.Surf_ID, out Start, out leg, out code))
                            {
                                _lost[Params.ThreadID] += OR.Intensity;
                                goto Do_Scattered;
                            }
                            RecMain.CheckRay(OR, Start[0]);

                            OR.Intensity *= Math.Pow(10, -.1 * Room.Attenuation(code[0])[OR.Octave] * leg[0]);
                            OR.AddLeg(leg[0] / Room.Sound_speed(code[0]));
                            OR.origin = Start[0];

                            ///Standard Energy Conservation Routine-
                            // 1. Multiply by Reflection energy. (1 - Absorption)
                            double cos_theta;
                            Room.Absorb(ref OR, out cos_theta, u, v);

                            // 2. Apply Transmission (if any).
                            if (Params.Room.TransmissionValue[OR.Surf_ID][OR.Octave] > 0.0)
                            {
                                //_rayTotal[Params.ThreadID]++;
                                //// a. Create new source for transmitted energy (E * Transmission).
                                //// b. Modify E (E * 1 - Transmission).
                                if (Rnd.NextDouble() < Params.Room.TransmissionValue[OR.Surf_ID][OR.Octave])
                                {
                                    OR.direction *= -1;
                                    Utilities.PachTools.Ray_Acoustics.SpecularReflection(ref OR.direction, ref Room, ref _u[OR.ThreadID], ref _v[OR.ThreadID], ref OR.Surf_ID);
                                }
                            }

                            // 3. Apply Scattering.
                            Room.Scatter_Late(ref OR, ref Rays, ref Rnd, cos_theta, u, v);
                        }while (OR.t_sum < COTime && OR.Intensity > Threshold_Power_2[OR.Octave]);

                        do
                        {
                            OR.Ray_ID = Rnd.Next();
                            if (!Params.Room.shoot(OR, out u, out v, out OR.Surf_ID, out Start, out leg, out code))
                            {
                                _lost[OR.ThreadID] += OR.Intensity;
                                goto Do_Scattered;
                            }

                            RecMain.CheckRay(OR, Start[0]);
                            //OctChecks.Enqueue(new object[] { OR.Clone(), new Hare.Geometry.Point(Start[0].x, Start[0].y, Start[0].z) });
                            OR.Intensity *= Math.Pow(10, -.1 * Room.Attenuation(code[0])[OR.Octave] * leg[0]);
                            OR.AddLeg(leg[0] / Room.Sound_speed(code[0]));
                            OR.origin = Start[0];

                            ///Standard Energy Conservation Routine-
                            // 1. Multiply by Reflection energy. (1 - Absorption)
                            double cos_theta;
                            Room.Absorb(ref OR, out cos_theta, u, v);

                            // 2. Apply Transmission (if any).
                            if (Params.Room.TransmissionValue[OR.Surf_ID][OR.Octave] > 0.0)
                            {
                                //// a. Create new source for transmitted energy (E * Transmission).
                                //// b. Modify E (E * 1 - Transmission).
                                if (Rnd.NextDouble() < Params.Room.TransmissionValue[OR.Surf_ID][OR.Octave])
                                {
                                    OR.direction *= -1;
                                    Utilities.PachTools.Ray_Acoustics.SpecularReflection(ref OR.direction, ref Params.Room, ref _u[OR.ThreadID], ref _v[OR.ThreadID], ref OR.Surf_ID);
                                }
                            }

                            // 3. Apply Scattering.
                            Room.Scatter_Simple(ref OR, ref Rnd, cos_theta, u, v);
                        }while (OR.t_sum < COTime && OR.Intensity > Threshold_Power_3[OR.Octave]);
                    }while (Rays.Count > 0);
                }
            }
            _ts = DateTime.Now - _st;
        }
        /// <summary>
        /// Inherited member. Divides the simulation into threads, and begins.
        /// </summary>
        public override void Begin()
        {
            Random Rnd = new Random();
            _processorCt = UI.PachydermAc_PlugIn.Instance.ProcessorSpec();
            _currentRay = new int[_processorCt];
            _rayTotal = new int[_processorCt];
            _lost = new double[_processorCt];
            _eInit = new double[_processorCt];
            _u = new double[_processorCt];
            _v = new double[_processorCt];
            _tlist = new System.Threading.Thread[_processorCt];
            
            for (int P_I = 0; P_I < _processorCt; P_I++)
            {
                int start = (int)Math.Floor((double)P_I * Raycount / _processorCt);
                int end;
                if (P_I == _processorCt - 1) end = Raycount;
                else end = (P_I + 1) * Raycount / _processorCt;
                Calc_Params T = new Calc_Params(Room, start, end, P_I, Rnd.Next());
                System.Threading.ParameterizedThreadStart TS = new System.Threading.ParameterizedThreadStart(delegate { Calculate(T); });
                _tlist[P_I] = new System.Threading.Thread(TS);
                _tlist[P_I].Start();
            }

            System.Runtime.GCSettings.LatencyMode = System.Runtime.GCLatencyMode.Batch;
        }
        /// <summary>
        /// Used by specular raytracer.
        /// </summary>
        /// <param name="Sequences">List of surface index sequences to try.</param>
        public void Lookup_Sequences(List<int[]>[] Sequences)
        {
            processorCT = UI.PachydermAc_PlugIn.Instance.ProcessorSpec();
            ThreadPaths = new List<Deterministic_Reflection>[Rec.Length,processorCT];
            int SrfCT = Room.PlaneCount;
            CurrentSrf = new int[processorCT];
            Random R = new Random();
            T_List = new System.Threading.Thread[processorCT];
            for (int p = 0; p < Rec.Length; p++)
            {
                for (int P_I = 0; P_I < processorCT; P_I++)
                {
                    ThreadPaths[p, P_I] = new List<Deterministic_Reflection>();
                    Calc_Params T = new Calc_Params(P_I * Sequences[p].Count / processorCT, (P_I + 1) * Sequences[p].Count / processorCT, P_I, R.Next());
                    System.Threading.ParameterizedThreadStart TS = new System.Threading.ParameterizedThreadStart(delegate
                    {
                        for (int i = T.StartIndex; i < T.EndIndex; i++)
                        {
                            ProcessPath(Sequences[p][i], T.ThreadID, p);
                        }
                    });
                    T_List[P_I] = new System.Threading.Thread(TS);
                    T_List[P_I].Start();
                }
                do
                {
                    System.Threading.Thread.Sleep(1000);
                    if (ThreadState() != System.Threading.ThreadState.Running) break;
                } while (true);

                for (int t = 0; t < processorCT; t++)
                {
                    ValidPaths[p].AddRange(ThreadPaths[p, t]);
                }
            }
        }
        /// <summary>
        /// Inherited member. Divides the simulation into threads, and begins.
        /// </summary>
        public override void Begin()
        {
            processorCT = UI.PachydermAc_PlugIn.Instance.ProcessorSpec();
            ThreadPaths = new List<Deterministic_Reflection>[Rec.Length, processorCT];
            int SrfCT = Room.PlaneCount;
            CurrentSrf = new int[processorCT];
            CurrentEdge = new int[processorCT];
            Rnd = new Random[processorCT];
            T_List = new System.Threading.Thread[processorCT];
            elementCt = Room.PlaneCount + ((this.Diffraction) ? Room.EdgeCount : 0);

            for (int P_I = 0; P_I < processorCT; P_I++)
            {
                for (int i = 0; i < Rec.Length; i++)
                {
                    ThreadPaths[i,P_I] = new List<Deterministic_Reflection>();
                    ValidPaths[i] = new List<Deterministic_Reflection>();
                }
                int start = (int)Math.Floor((double)P_I * SrfCT / processorCT);
                int end;
                if (P_I == processorCT - 1) end = SrfCT;
                else end = (P_I + 1) * SrfCT / processorCT;
                
                Calc_Params T = new Calc_Params(start, end, P_I, Room.R_Seed.Next());
                System.Threading.ParameterizedThreadStart TS = new System.Threading.ParameterizedThreadStart(delegate { Calculate(T); });
                T_List[P_I] = new System.Threading.Thread(TS);
                T_List[P_I].Start();
            }
        }