Initial implementation of moist adiabat plotting (it sucks)
This commit is contained in:
		
							parent
							
								
									fe4b980ac9
								
							
						
					
					
						commit
						bc9a2977a5
					
				
					 1 changed files with 28 additions and 9 deletions
				
			
		| 
						 | 
				
			
			@ -4,7 +4,7 @@ import cairo
 | 
			
		|||
from typing import Callable
 | 
			
		||||
 | 
			
		||||
from xmet.sounding import Sounding
 | 
			
		||||
from xmet.thermo   import pressure_height, lapse
 | 
			
		||||
from xmet.thermo   import pressure_height, lapse, moist_lapse_rate
 | 
			
		||||
 | 
			
		||||
PRESSURE_MAX  = 1050 # millibar
 | 
			
		||||
PRESSURE_MIN  =  100
 | 
			
		||||
| 
						 | 
				
			
			@ -104,26 +104,42 @@ class SkewTGraph():
 | 
			
		|||
                     x: float,
 | 
			
		||||
                     y: float,
 | 
			
		||||
                     start_temp: float,
 | 
			
		||||
                     start_pressure: float):
 | 
			
		||||
                     start_pressure: float,
 | 
			
		||||
                     moist: bool=False):
 | 
			
		||||
        start_height = pressure_height(start_pressure)
 | 
			
		||||
        sx_last = None
 | 
			
		||||
        sy_last = None
 | 
			
		||||
        sx_last      = None
 | 
			
		||||
        sy_last      = None
 | 
			
		||||
        height_last  = None
 | 
			
		||||
 | 
			
		||||
        temp     = start_temp
 | 
			
		||||
        pressure = start_pressure
 | 
			
		||||
 | 
			
		||||
        while pressure >= PRESSURE_MIN:
 | 
			
		||||
            height   = pressure_height(pressure)
 | 
			
		||||
            temp_cur = lapse(start_temp, height - start_height)
 | 
			
		||||
            height = pressure_height(pressure)
 | 
			
		||||
 | 
			
		||||
            sx, sy = self.sample_to_screen(temp_cur, pressure)
 | 
			
		||||
            if height_last is None:
 | 
			
		||||
                height_last = height
 | 
			
		||||
 | 
			
		||||
            if moist:
 | 
			
		||||
                try:
 | 
			
		||||
                    rate = moist_lapse_rate(temp, temp, pressure)
 | 
			
		||||
                except OverflowError:
 | 
			
		||||
                    break
 | 
			
		||||
 | 
			
		||||
                temp = lapse(temp, height - height_last, rate)
 | 
			
		||||
            else:
 | 
			
		||||
                temp = lapse(start_temp, height - start_height)
 | 
			
		||||
 | 
			
		||||
            sx, sy = self.sample_to_screen(temp, pressure)
 | 
			
		||||
 | 
			
		||||
            if sx_last is not None:
 | 
			
		||||
                cr.move_to(x + sx, y + sy)
 | 
			
		||||
                cr.line_to(x + sx_last, y + sy_last)
 | 
			
		||||
                cr.stroke()
 | 
			
		||||
 | 
			
		||||
            sx_last = sx
 | 
			
		||||
            sy_last = sy
 | 
			
		||||
            sx_last     = sx
 | 
			
		||||
            sy_last     = sy
 | 
			
		||||
            height_last = height
 | 
			
		||||
 | 
			
		||||
            pressure -= 10.0
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -137,6 +153,9 @@ class SkewTGraph():
 | 
			
		|||
        for temp in range(-140, 140, 10):
 | 
			
		||||
            self.draw_adiabat(cr, x, y, temp, PRESSURE_MAX)
 | 
			
		||||
 | 
			
		||||
        for temp in range(-140, 140, 10):
 | 
			
		||||
            self.draw_adiabat(cr, x, y, temp, PRESSURE_MAX, True)
 | 
			
		||||
 | 
			
		||||
        cr.restore()
 | 
			
		||||
 | 
			
		||||
    def draw_sounding(self,
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		
		Reference in a new issue