Esempio n. 1
0
        /// <summary>
        /// Based on the commissioning graph, the power and speed coefficients of each draft between the ballast and the scanlt are obtained.
        /// </summary>
        /// <param name="shipParticular">Ship Basic Data</param>
        /// <param name="seaTrialPowerToSpeedAtBallast">Power Speed Conversion factor(ballast)</param>
        /// <param name="seaTrialPowerToSpeedAtScant">Power Speed Conversion factor(scant)</param>
        /// <returns>각 10cm 별 power speed 계수 배열</returns>
        public static List <double[]> PowerToSpeedTable(SHIP_PARTICULAR shipParticular, dynamic ballastValues, dynamic scantlingValues)
        {
            double seatrialdraftScantling = (scantlingValues.DRAFT_FORE + scantlingValues.DRAFT_AFT) * 0.5; //Draft (Scantling) Fore , Draft (Scantling) Aft
            double seaTrialdraftBallast   = (ballastValues.DRAFT_FORE + ballastValues.DRAFT_AFT) * 0.5;     //Draft (Ballast) Fore, Draft (Ballast) Aft

            List <double[]> draftTable = new List <double[]> {
            };
            double startDraft          = Math.Truncate((seaTrialdraftBallast - 7) * 10);                                                     // ref draft -2 부터 시작 (-2는 여유분)

            int numerOfDraft = (int)((Math.Truncate((seatrialdraftScantling + 7) * 10)) - (Math.Truncate((seaTrialdraftBallast - 7) * 10))); // 스캔틀링까지 소수점 한자리 까지 검색, 기준 draft보다 -2 +2 만큼 큼
            int numberOfPwer = (int)(shipParticular.ME_POWER_MCR / 200);                                                                     //ME_POWER_MCr

            double[] powerTable = new double[numberOfPwer];                                                                                  // 확인 완  200 씩 파워 간격을 띄움 --> 커브피팅 알고리즘으로 x 축 배열
            double[] speedTable = new double[numberOfPwer];                                                                                  // 확인 완  파워 간격 만큼 스피드를 계산 --> 커브피팅 알고리즘으로 y 축 배열s

            for (int i = 0; i < numerOfDraft; i++)                                                                                           // 드라프트 간격 0.1 만큼 해상도의 커프피팅 테이블을 만듦
            {
                for (int j = 0; j < numberOfPwer; j++)
                {
                    powerTable[j] = (j + 1) * 200;
                    speedTable[j] =
                        ((scantlingValues.B_POWER_TO_SPEED * Math.Pow(powerTable[j], scantlingValues.A_POWER_TO_SPEED) - ballastValues.B_POWER_TO_SPEED * Math.Pow(powerTable[j], ballastValues.A_POWER_TO_SPEED)) / // Seatrial PowerToSpeed(Scant')
                         (seatrialdraftScantling - seaTrialdraftBallast) *
                         ((i + startDraft) * 0.1 - seaTrialdraftBallast) + (ballastValues.B_POWER_TO_SPEED * Math.Pow(powerTable[j], ballastValues.A_POWER_TO_SPEED)));                                              // Seatrial PowerToSpeed(Ballast')
                }

                var curve = CurveFitting.powerRegression(powerTable, speedTable);
                draftTable.Add(curve);
            }

            return(draftTable);
        }
Esempio n. 2
0
        /// <summary>
        /// 시운전 그래프를 기준으로 ballast와 scanlt 사이의 각 draft 별 power, speed 계수를 구하여 Json으로 리턴
        /// </summary>
        /// <param name="shipParticular">선박제원정보</param>
        /// <param name="seaTrialPowerToSpeedAtBallast">Power Speed 변환계수(ballast)</param>
        /// <param name="seaTrialPowerToSpeedAtScant">Power Speed 변환계수(scant)</param>
        /// <returns>각 10cm 별 power speed 계수를 Json 형식으로 변환</returns>

        public JObject speedPowerTableJson(SHIP_PARTICULAR_DETAIL shipParticularDetail, SHIP_PARTICULAR_DETAIL standardData)
        {
            JObject         result = new JObject();
            double          seatrialdraftScantling = (standardData.DRAFT_FORE_SCANTLING + standardData.DRAFT_AFT_SCANTLING) * 0.5; //Draft (Scantling) Fore , Draft (Scantling) Aft
            double          seaTrialdraftBallast   = (standardData.DRAFT_FORE_BALLAST + standardData.DRAFT_AFT_BALLAST) * 0.5;     //Draft (Ballast) Fore, Draft (Ballast) Aft
            List <double[]> draftTable             = new List <double[]> {
            };
            double startDraft   = Math.Truncate((seaTrialdraftBallast - 3) * 10);                                                               // ref draft -2 부터 시작 (-2는 여유분)
            int    numerOfDraft = (int)((Math.Truncate((seatrialdraftScantling + 3) * 10)) - (Math.Truncate((seaTrialdraftBallast - 3) * 10))); // 스캔틀링까지 소수점 한자리 까지 검색, 기준 draft보다 -2 +2 만큼 큼
            int    numberOfPwer = (int)(shipParticularDetail.ME_POWER_MCR / 200);                                                               //ME_POWER_MCr

            double[] powerTable   = new double[numberOfPwer];                                                                                   // 확인 완  200 씩 파워 간격을 띄움 --> 커브피팅 알고리즘으로 x 축 배열
            double[] speedTable   = new double[numberOfPwer];                                                                                   // 확인 완  파워 간격 만큼 스피드를 계산 --> 커브피팅 알고리즘으로 y 축 배열
            var      curveFitting = new CurveFitting();

            for (int i = 0; i < numerOfDraft; i++)          // 드라프트 간격 0.1 만큼 해상도의 커프피팅 테이블을 만듦
            {
                for (int j = 0; j < numberOfPwer; j++)
                {
                    powerTable[j] = (j + 1) * 200;
                    speedTable[j] =
                        ((standardData.B_SPEED_TO_POWER_SCANTLING * Math.Pow(powerTable[j], standardData.A_SPEED_TO_POWER_SCANTLING) - standardData.B_SPEED_TO_POWER_BALLAST * Math.Pow(powerTable[j], standardData.A_SPEED_TO_POWER_BALLAST)) / // Seatrial PowerToSpeed(Scant')
                         (seatrialdraftScantling - seaTrialdraftBallast) *
                         ((i + startDraft) * 0.1 - seaTrialdraftBallast) + (standardData.B_SPEED_TO_POWER_BALLAST * Math.Pow(powerTable[j], standardData.A_SPEED_TO_POWER_BALLAST)));                                                            // Seatrial PowerToSpeed(Ballast')
                }
                var curve = curveFitting.powerRegression(speedTable, powerTable);
                result.Add(((startDraft + i) / 10).ToString(), new JArray(curve[1], curve[2]));
            }
            return(result);
        }
        private void DrawFittedCurve()
        {
            var curveFitting = new CurveFitting(dataSource, fittingModel);

            points.Clear();
            points.AddRange(curveFitting.GetPoints.Select(p => new OxyPlot.DataPoint(p.X, p.Y)).ToList());
        }
Esempio n. 4
0
        public double[] IttcWindCoeff(string shipType)         //상대 풍향 풍속 --> 절대 풍향 풍속으로 변환하는 메소드
        {
            var curvefitting = new CurveFitting();

            double[] bulkDegree = new double[] { 0, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120, 130, 140, 150, 160, 170, 180 };
            double[] bulkCoeff  = new double[] { -0.86962, -0.767089, -0.63038, -0.459494, -0.33038, -0.216456, -0.136709, -0.0759494, -0.0531646, 0, 0.0683544, 0.163291, 0.273418, 0.349367, 0.451899, 0.543038, 0.592405, 0.634177, 0.618987 };

            double[] result;

            switch (shipType)
            {
            case "BULK_CARRIER":
                result = curvefitting.polynominalRegression(bulkDegree, bulkCoeff, 7);
                break;

            case "CONTAINER":
                result = curvefitting.polynominalRegression(bulkDegree, bulkCoeff, 7);
                break;

            case "CHEMICAL_CARRIER":
                result = curvefitting.polynominalRegression(bulkDegree, bulkCoeff, 7);
                break;

            default:
                result = curvefitting.polynominalRegression(bulkDegree, bulkCoeff, 7);
                break;
            }
            return(result);
        }
Esempio n. 5
0
        public static bool DataCompilation()
        {
            var functionResult = true;

            var ballastSpeedToPower = CurveFitting.powerRegression(ballastSpeedList.ToArray(), ballastPowerList.ToArray());
            var ballastPowerToSpeed = CurveFitting.powerRegression(ballastPowerList.ToArray(), ballastSpeedList.ToArray());

            var scantlingSpeedToPower = CurveFitting.powerRegression(scantlingSpeedList.ToArray(), scantlingPowerList.ToArray());
            var scantlingPowerToSpeed = CurveFitting.powerRegression(scantlingPowerList.ToArray(), scantlingSpeedList.ToArray());

            ballastValues.DRAFT_FORE = draft.BALLAST_DRAFT_FORE;
            ballastValues.DRAFT_AFT  = draft.BALLAST_DRAFT_AFT;

            ballastValues.A_POWER_TO_SPEED = ballastPowerToSpeed[2];
            ballastValues.B_POWER_TO_SPEED = ballastPowerToSpeed[1];
            ballastValues.A_SPEED_TO_POWER = ballastSpeedToPower[2];
            ballastValues.B_SPEED_TO_POWER = ballastSpeedToPower[1];


            scantlingValues.DRAFT_FORE = draft.SCANTLING_DRAFT_FORE;
            scantlingValues.DRAFT_AFT  = draft.SCANTLING_DRAFT_AFT;

            scantlingValues.A_POWER_TO_SPEED = scantlingPowerToSpeed[2];
            scantlingValues.B_POWER_TO_SPEED = scantlingPowerToSpeed[1];
            scantlingValues.A_SPEED_TO_POWER = scantlingSpeedToPower[2];
            scantlingValues.B_SPEED_TO_POWER = scantlingSpeedToPower[1];

            if (ballastValues == null || scantlingValues == null)
            {
                functionResult = false;
            }

            return(functionResult);
        }