2015-08-27 71 views
1

我編寫了這段代碼來計算一個稱爲B因子的東西。一開始一切都很好。你輸入你的壓力和溫度,B因子出來。但是,當我輸入新的壓力和溫度值時 - 應用程序似乎凍結。初始輸入後計算器凍結

我的代碼如下:

import Foundation 
class bFactorFormula { 
    var NK_VALUES:[Double] = [0.924803575275, -0.492448489428, 0.661883336938, -1.92902649201, -0.0622469309629, 0.349943957581, 0.564857472498, -1.61720005987, -0.481395031883, 0.421150636384, -0.0161962230825, 0.172100994165, 0.00735448924933, 0.0168077305479, -0.00107626664179, -0.0137318088513, 0.000635466899859, 0.00304432279419, -0.0435762336045, -0.0723174889316, 0.0389644315272, -0.021220136391, 0.00408822981509, -0.0000551990017984, -0.0462016716479, -0.00300311716011, 0.0368825891208, -0.0025585684622, 0.00896915264558, -0.0044151337035, 0.00133722924858, 0.000264832491957, 19.6688194015, -20.915560073, 0.0167788306989, 2627.67566274] 
    var IK_VALUES:[Double] = [1, 1, 2, 2, 3, 3, 1, 1, 1, 3, 3, 4, 6, 6, 7, 7, 8, 8, 1, 2, 3, 4, 5, 8, 4, 5, 5, 8, 3, 5, 6, 9, 1, 1, 3, 2] 
    var JK_VALUES:[Double] = [0.25, 0.875, 0.5, 0.875, 0.375, 0.75, 0.5, 0.75, 2, 1.25, 3.5, 1, 0.5, 3, 0, 2.75, 0.75, 2.5, 4, 6, 6, 3, 3, 6, 16, 11, 15, 12, 12, 7, 4, 16, 0, 1, 2, 3] 
    var LK_VALUES:[Double] = [0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 0, 0, 0, 0] 
    var PK_VALUES:[Double] = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 20, 15, 25] 
    var BK_VALUES:[Double] = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0325, 325, 300, 275] 
    var UK_VALUES:[Double] = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1.16, 1.16, 1.13, 1.25] 
    var R_CONST = 8.31451 
    var T_C:Double = 126.192 
    var P_C:Double = 3.3958 
    var MOLECULAR_WEIGHT:Double = 28.01348 
    var DENSITY_STP:Double = 1.1851 
    var RHO_C:Double = 11.1839 

    // DECLARE INPUT VARIABLES 
    var n2TemperatureInput:Double 
    var n2PressureInput: Double 
    var tempK:Double { 
     get { 
      return n2TemperatureInput + 273.15 
     } 
    } 
    var tempR:Double { 
     get { 
      return T_C/tempK 
     } 
    } 
    var pTarget:Double { 
     get { 
      return (n2PressureInput * 1000000) + 101325 
     } 
    } 

    init (setBFactorTemperature:Double, setBFactorPressure:Double) { 
     self.n2TemperatureInput = setBFactorTemperature 
     self.n2PressureInput = setBFactorPressure 
    } 

    var rhoCurrent:Double = 0 
    var rhoHigh:Double = 0 
    var rhoLow:Double = 0 
    var diffAggregate:Double = 0 
    var diffSegment:Double = 0 
    var iFactor:Double = 0 
    var bFactor:Double = 0 
    // 
    // kIndex defined in the while-loop 
    // var kIndex:Double = 0 
    // 
    var pCalc:Double = 0 
    var zDiff:Double = 0 
    var rhoR:Double = 0 

    func retRhoCurrent() -> Double { 

     while abs(pTarget - pCalc) > 1 { 

      // 
      // SET rhoCurrent 
      // 

      if (pTarget > pCalc) { 
       rhoLow = rhoCurrent 
       if(rhoCurrent >= rhoHigh) { 
        rhoCurrent += RHO_C 
        rhoHigh = rhoCurrent 
       } else { 
        rhoCurrent += ((rhoHigh - rhoCurrent)/2) 
       } 
      } else { 
       rhoHigh = rhoCurrent 
       rhoCurrent += ((rhoLow - rhoCurrent)/2) 
      } 

      // 
      // SET rhoR 
      // 

      rhoR = rhoCurrent/RHO_C 

      // 
      // SET DIFFERENTIAL 
      // 
      diffAggregate = 0 
      for var kIndex = 0; kIndex < NK_VALUES.count; ++kIndex { 
       diffSegment = NK_VALUES[kIndex] 
       diffSegment *= pow(rhoR, IK_VALUES[kIndex]) 
       diffSegment *= pow(tempR, JK_VALUES[kIndex]) 
       iFactor = 0 
       if LK_VALUES[kIndex] > 0 { 
        diffSegment *= exp(-1 * pow(rhoR, LK_VALUES[kIndex])) 
        iFactor = LK_VALUES[kIndex] * pow(rhoR, LK_VALUES[kIndex]) 
       } 
       if PK_VALUES[kIndex] > 0 { 
        diffSegment *= exp(-1 * PK_VALUES[kIndex] * pow(rhoR, 2) - BK_VALUES[kIndex] * pow(tempR - UK_VALUES[kIndex], 2)) 
        iFactor = 2 * rhoR * PK_VALUES[kIndex] * (rhoR - 1) 
       } 
       diffAggregate += (diffSegment * (IK_VALUES[kIndex] - iFactor)) 
      } 

      // 
      // SET pCalc 
      // 
      zDiff = 1 + diffAggregate 
      pCalc = zDiff * R_CONST * 1000 * tempK * rhoCurrent 
     } 
     return rhoCurrent 
    } 
} 

我想我可能需要某種「刷新」命令,但我不知道怎麼走這條路,如果是做正確的事。

此外 - 我想告訴你們我的ViewController,看看我是如何做到這一點來執行其操作。

import UIKit 

extension Double { 
func format(f: String) -> String { 
    return NSString(format: "%\(f)f", self) as String 
} 
} 

class NitrogenViewController: UIViewController { 

@IBOutlet weak var bFactorPressureInput: UITextField! 
@IBOutlet weak var bFactorTemperatureInput: UITextField! 
@IBOutlet weak var bFactorResults: UILabel! 

var calcBFactor = bFactorFormula(setBFactorTemperature: 10, setBFactorPressure: 10) 

override func viewDidLoad() { 
    super.viewDidLoad() 

    // Do any additional setup after loading the view. 
} 

override func didReceiveMemoryWarning() { 
    super.didReceiveMemoryWarning() 
    // Dispose of any resources that can be recreated. 
} 

@IBAction func bFactorButton(sender: AnyObject) { 

    calcBFactor.n2PressureInput = Double((bFactorPressureInput.text as NSString).doubleValue) 
    calcBFactor.n2TemperatureInput = Double((bFactorTemperatureInput.text as NSString).doubleValue) 
    var rhoCurrentReturned = calcBFactor.retRhoCurrent() 
    var bFactorResult = rhoCurrentReturned * (28.01348/1.1851) 
    var bFactorResultFormat = "0.2" 
    bFactorResults.text = "The B-Factor is \(bFactorResult.format(bFactorResultFormat)) scm/m3" 
} 

我在想它與我的視圖控制器代碼有關。有任何想法嗎?

+0

什麼是錯誤? – Aggressor

+0

它停止(CPU爲0%)還是鎖定(CPU爲100%)? –

+0

您需要添加使用此類的代碼。這個測試在沒有任何問題的情況下執行兩次:'let x = bFactorFormula(setBFactorTemperature:10.0,setBFactorPressure:10.0)' 'let y = x.retRhoCurrent()' 'print(y)' 'print(y)'輸出: 4.31804172998667 4.31804172998667 – zaph

回答

1

看起來像是在bFactorFormula類被初始化時將pCalc初始化爲0。沒關係。但在第一次運行後,pCalc爲10101321.0261427,並且當您再次運行計算時,永遠不會退出while循環。

因此,您可以爲IBAction代碼中的每次運行創建一個新的bFactorForumula對象,或者您可以在retRhoCurrent的頂部設置pCalc = 0。

+0

我已經嘗試在retRhoCurrent的頂部設置pCalc = 0,但無濟於事。只是爲了澄清,當你說在頂部設置pCalc = 0時,你的意思是在while循環開始之前的那一行嗎? – Matty

+0

除了設置pCalc = 0之外,我還將zDiff和rhoCurrent設置爲0。現在它的工作!謝謝丹的幫助。 – Matty