def limits(self): """FLIGHT ENVELPOE""" # summarize minimum speeds - ac in ground mode might be pushing back self.vmin = (self.phase == 1) * self.vmto + (self.phase == 2) * self.vmic + (self.phase == 3) * self.vmcr + \ (self.phase == 4) * self.vmap + (self.phase == 5) * self.vmld + (self.phase == 6) * -10. # maximum altitude: hmax/act = MIN[hmo, hmax+gt*(dtemp-ctc1)+gw*(mmax-mact)] # or hmo if hmx ==0 () # at the moment just ISA atmosphere, dtemp = 0 c1 = self.dtemp - self.ctct1 # if c1<0: c1 = 0 # values above 0 remain, values below are replaced through 0 c1m = np.array(c1 < 0) * 0.00000000000001 c1def = np.maximum(c1, c1m) self.hact = self.hmax + self.gt * c1def + self.gw * (self.mmax - self.mass) # if hmax in OPF File ==0: hmaxact = hmo, else minimum(hmo, hmact) self.hmaxact = (self.hmax == 0) * self.hmo + ( self.hmax != 0) * np.minimum(self.hmo, self.hact) # forwarding to windtools # forwarding to windtools bs.traf.limspd, \ bs.traf.limspd_flag, \ bs.traf.limalt, \ bs.traf.limalt_flag, \ bs.traf.limvs, \ bs.traf.limvs_flag = calclimits(vtas2cas(bs.traf.pilot.tas, bs.traf.alt), \ bs.traf.gs, \ self.vmto, \ self.vmin, \ self.vmo, \ self.mmo, \ bs.traf.M, \ bs.traf.alt, \ self.hmaxact, \ bs.traf.pilot.alt, \ bs.traf.pilot.vs, \ self.maxthr, \ self.Thr, \ self.D, \ bs.traf.tas, \ self.mass, \ self.ESF, \ self.phase) return
def limits(self): """FLIGHT ENVELPOE""" # summarize minimum speeds - ac in ground mode might be pushing back self.vmin = (self.phase == 1) * self.vmto + (self.phase == 2) * self.vmic + (self.phase == 3) * self.vmcr + \ (self.phase == 4) * self.vmap + (self.phase == 5) * self.vmld + (self.phase == 6) * -10. # maximum altitude: hmax/act = MIN[hmo, hmax+gt*(dtemp-ctc1)+gw*(mmax-mact)] # or hmo if hmx ==0 () # at the moment just ISA atmosphere, dtemp = 0 c1 = self.dtemp - self.ctct1 # if c1<0: c1 = 0 # values above 0 remain, values below are replaced through 0 c1m = np.array(c1<0)*0.00000000000001 c1def = np.maximum(c1, c1m) self.hact = self.hmax+self.gt*c1def+self.gw*(self.mmax-self.mass) # if hmax in OPF File ==0: hmaxact = hmo, else minimum(hmo, hmact) self.hmaxact = (self.hmax==0)*self.hmo +(self.hmax !=0)*np.minimum(self.hmo, self.hact) # forwarding to tools # forwarding to tools bs.traf.limspd, \ bs.traf.limspd_flag, \ bs.traf.limalt, \ bs.traf.limalt_flag, \ bs.traf.limvs, \ bs.traf.limvs_flag = calclimits(vtas2cas(bs.traf.pilot.tas, bs.traf.alt), \ bs.traf.gs, \ self.vmto, \ self.vmin, \ self.vmo, \ self.mmo, \ bs.traf.M, \ bs.traf.alt, \ self.hmaxact, \ bs.traf.pilot.alt, \ bs.traf.pilot.vs, \ self.maxthr, \ self.Thr, \ self.D, \ bs.traf.cas, \ self.mass, \ self.ESF, \ self.phase) return
def limits(self): """Flight envelope""" # Connect this with function limits in performance.py # combine minimum speeds and flight phases. Phases initial climb, cruise # and approach use the same CLmax and thus the same function for Vmin self.vmto = self.vm_to*np.sqrt(self.mass/bs.traf.rho) self.vmic = np.sqrt(2*self.mass*g0/(bs.traf.rho*self.clmaxcr*self.Sref)) self.vmcr = self.vmic self.vmap = self.vmic self.vmld = self.vm_ld*np.sqrt(self.mass/bs.traf.rho) # summarize and convert to cas # note: aircraft on ground may be pushed back self.vmin = (self.phase==1)*vtas2cas(self.vmto, bs.traf.alt) + \ ((self.phase==2) + (self.phase==3) + (self.phase==4))*vtas2cas(self.vmcr, bs.traf.alt) + \ (self.phase==5)*vtas2cas(self.vmld, bs.traf.alt) + (self.phase==6)*-10.0 # forwarding to tools bs.traf.limspd, \ bs.traf.limspd_flag, \ bs.traf.limalt, \ bs.traf.limalt_flag, \ bs.traf.limvs, \ bs.traf.limvs_flag = calclimits(vtas2cas(bs.traf.pilot.tas, bs.traf.alt), \ bs.traf.gs, \ self.vmto, \ self.vmin, \ self.vmo, \ self.mmo, \ bs.traf.M, \ bs.traf.alt, \ self.hmaxact, \ bs.traf.pilot.alt, \ bs.traf.pilot.vs, \ self.maxthr, \ self.Thr_pilot, \ self.D, \ bs.traf.cas, \ self.mass, \ self.ESF, \ self.phase) return
def limits(self): """Flight envelope""" # Connect this with function limits in performance.py # combine minimum speeds and flight phases. Phases initial climb, cruise # and approach use the same CLmax and thus the same function for Vmin self.vmto = self.vm_to*np.sqrt(self.mass/bs.traf.rho) self.vmic = np.sqrt(2*self.mass*g0/(bs.traf.rho*self.clmaxcr*self.Sref)) self.vmcr = self.vmic self.vmap = self.vmic self.vmld = self.vm_ld*np.sqrt(self.mass/bs.traf.rho) # summarize and convert to cas # note: aircraft on ground may be pushed back self.vmin = (self.phase==1)*vtas2cas(self.vmto, bs.traf.alt) + \ ((self.phase==2) + (self.phase==3) + (self.phase==4))*vtas2cas(self.vmcr, bs.traf.alt) + \ (self.phase==5)*vtas2cas(self.vmld, bs.traf.alt) + (self.phase==6)*-10.0 # forwarding to tools bs.traf.limspd, \ bs.traf.limspd_flag, \ bs.traf.limalt, \ bs.traf.limalt_flag, \ bs.traf.limvs, \ bs.traf.limvs_flag = calclimits(vtas2cas(bs.traf.pilot.tas, bs.traf.alt), \ bs.traf.gs, \ self.vmto, \ self.vmin, \ self.vmo, \ self.mmo, \ bs.traf.M, \ bs.traf.alt, \ self.hmaxact, \ bs.traf.pilot.alt, \ bs.traf.pilot.vs, \ self.maxthr, \ self.thrust_pilot, \ self.D, \ bs.traf.tas, \ self.mass, \ self.ESF, \ self.phase) return
def limits(self, intent_v, intent_vs, intent_h, ax): """FLIGHT ENVELPOE""" # summarize minimum speeds - ac in ground mode might be pushing back self.vmin = (self.phase == 1) * self.vmto + (self.phase == 2) * self.vmic + (self.phase == 3) * self.vmcr + \ (self.phase == 4) * self.vmap + (self.phase == 5) * self.vmld + (self.phase == 6) * -10. # maximum altitude: hmax/act = MIN[hmo, hmax+gt*(dtemp-ctc1)+gw*(mmax-mact)] # or hmo if hmx ==0 () # at the moment just ISA atmosphere, dtemp = 0 c1 = self.dtemp - self.ctct1 # if c1<0: c1 = 0 # values above 0 remain, values below are replaced through 0 c1m = np.array(c1 < 0) * 0.00000000000001 c1def = np.maximum(c1, c1m) self.hact = self.hmax + self.gt * c1def + self.gw * (self.mmax - self.mass) # if hmax in OPF File ==0: hmaxact = hmo, else minimum(hmo, hmact) self.hmaxact = (self.hmax == 0) * self.hmo + ( self.hmax != 0) * np.minimum(self.hmo, self.hact) # forwarding to tools self.limspd, self.limspd_flag, self.limalt, \ self.limalt_flag, self.limvs, self.limvs_flag = calclimits( vtas2cas(intent_v, bs.traf.alt), bs.traf.gs, self.vmto, self.vmin, self.vmo, self.mmo, bs.traf.M, bs.traf.alt, self.hmaxact, intent_h, intent_vs, self.maxthr, self.thrust, self.D, bs.traf.tas, self.mass, self.ESF, self.phase) # Update desired sates with values within the flight envelope # When CAS is limited, it needs to be converted to TAS as only this TAS is used later on! allowed_tas = np.where(self.limspd_flag, vcas2tas(self.limspd, bs.traf.alt), intent_v) # Autopilot selected altitude [m] allowed_alt = np.where(self.limalt_flag, self.limalt, intent_h) # Autopilot selected vertical speed (V/S) allowed_vs = np.where(self.limvs_flag, self.limvs, intent_vs) return allowed_tas, allowed_vs, allowed_alt
def limits(self, intent_v, intent_vs, intent_h, ax): """Flight envelope""" # Connect this with function limits in performance.py # combine minimum speeds and flight phases. Phases initial climb, cruise # and approach use the same CLmax and thus the same function for Vmin self.vmto = self.vm_to * np.sqrt(self.mass / bs.traf.rho) self.vmic = np.sqrt(2 * self.mass * g0 / (bs.traf.rho * self.clmaxcr * self.Sref)) self.vmcr = self.vmic self.vmap = self.vmic self.vmld = self.vm_ld * np.sqrt(self.mass / bs.traf.rho) # summarize and convert to cas # note: aircraft on ground may be pushed back self.vmin = (self.phase==1)*vtas2cas(self.vmto, bs.traf.alt) + \ ((self.phase==2) + (self.phase==3) + (self.phase==4))*vtas2cas(self.vmcr, bs.traf.alt) + \ (self.phase==5)*vtas2cas(self.vmld, bs.traf.alt) + (self.phase==6)*-10.0 # forwarding to tools self.limspd, self.limspd_flag, self.limalt, \ self.limalt_flag, self.limvs, self.limvs_flag = calclimits( vtas2cas(intent_v, bs.traf.alt), bs.traf.gs, \ self.vmto, self.vmin, self.vmo, self.mmo, \ bs.traf.M, bs.traf.alt, self.hmaxact, \ intent_h, intent_vs, self.maxthr, \ self.thrust_pilot, self.D, bs.traf.tas, \ self.mass, self.ESF, self.phase) # Update desired sates with values within the flight envelope # When CAS is limited, it needs to be converted to TAS as only this TAS is used later on! allowed_tas = np.where(self.limspd_flag, vcas2tas(self.limspd, bs.traf.alt), intent_v) # Autopilot selected altitude [m] allowed_alt = np.where(self.limalt_flag, self.limalt, intent_h) # Autopilot selected vertical speed (V/S) allowed_vs = np.where(self.limvs_flag, self.limvs, intent_vs) return allowed_tas, allowed_vs, allowed_alt