Source code for geodepy.survey

#!/usr/bin/env python3

"""
Geoscience Australia - Python Geodesy Package
Survey Module
"""

from math import sqrt, sin, cos, atan, radians, degrees, exp
from statistics import mean, stdev
from geodepy.convert import rect2polar, polar2rect


[docs] def first_vel_params(wavelength, frequency, n_REF=None, unit_length=None): """ Calculates the constant First Velocity Correction Parameters C and D for a given set of standard instrument settings Reference Rueger, J.M., 2012, Electronic Distance Measurement: An Introduction, 4rd edition, Springer, Berlin :param wavelength: Instrument Carrier Wavelength (Micrometers) - Mandatory :param frequency: Instrument modulation frequency (Hz) - Optional :param n_REF: manufacturers reference refractive index - Recommended :param unit_length: unit length of instrument - Optional :return: First Velocity Correction Parameters C and D """ if not n_REF: if not unit_length: raise ValueError("Error - n_REF and unit_length cannot both be None") if not frequency: raise ValueError("Error - n_REF and frequency cannot both be None") # Rueger eq 6.3 n_REF = 299792458 / (2 * unit_length * frequency) # Rueger eq 6.12 param_c = (n_REF - 1) * 10**6 # Rueger eq 5.12 # https://office.iag-aig.org/doc/5d7b8fda0c032.pdf Resolution 3 nG_1_10_6 = 287.6155 + (4.8866 / wavelength**2) + (0.068 / wavelength**4) # Rueger eq 6.13 param_d = (273.15 / 1013.25) * nG_1_10_6 return param_c, param_d
[docs] def part_h2o_vap_press(dry_temp, pressure, rel_humidity=None, wet_temp=None): """ Reference Rueger, J.M., 2012, Electronic Distance Measurement: An Introduction, 4rd edition, Springer, Berlin :param dry_temp: Observed Dry Temperature (degrees Celsius) :param pressure: Observed Pressure (hectopascals or millibars) :param rel_humidity: Observed Relative Humidity (percentage) - Optional if wet_temp supplied :param wet_temp: Observed Wet Temperature (degrees Celsius) - Optional if rel_humidity supplied :return: Partial water vapour pressure """ if not rel_humidity and not wet_temp: raise ValueError("Error - rel_humidity and wet_temp cannot both be None") if rel_humidity: wet_temp = dry_temp # Rueger eq 5.27 E_w = ( (1.0007 + ((3.46 * pressure) * (10**-6))) * 6.1121 * exp((17.502 * wet_temp) / (240.94 + wet_temp)) ) if rel_humidity: # Rueger eq 5.29 e = (E_w * rel_humidity) / 100 else: e = E_w - 0.000662 * pressure * (dry_temp - wet_temp) return e
[docs] def first_vel_corrn( dist, first_vel_param, temp, pressure, rel_humidity=None, wet_temp=None, CO2_ppm=None, wavelength=None, ): """ Carries out First Velocity Correction of Electronic Distance Measurement, given correction parameters and atmospheric observations :param dist: Uncorrected Observed Slope Distance :param first_vel_param: Tuple of First Velocity Parameters C and D (see function first_vel_params) :param temp: Observed Temperature (degrees Celsius) :param pressure: Observed Pressure (hectopascals or millibars) :param rel_humidity: Observed Relative Humidity (percentage) :return: First Velocity Correction """ param_c = first_vel_param[0] if not CO2_ppm: param_d = first_vel_param[1] e = part_h2o_vap_press(temp, pressure, rel_humidity, wet_temp) # Rueger eq 6.11 t_273_15 = temp + 273.15 first_vel_corrn_ppm = ( param_c - ((param_d * pressure) / t_273_15) + ((11.27 * e) / t_273_15) ) first_vel_corrn_metres = dist * first_vel_corrn_ppm * (10**-6) else: if all([temp, pressure, rel_humidity, wavelength]): e = humidity2part_water_vapour_press(rel_humidity, temp) NPROPG_1 = group_refractivity(wavelength, temp, pressure, e, CO2_ppm) else: raise ValueError( "Error - temp, pressure, rel_humidity and wavelength " + "are all mandatory when CO2_ppm is not None" ) n_ref = 1 + (param_c / 1.0e6) n_g = 1 + (NPROPG_1 / 1.0e8) first_vel_corrn_metres = ((n_ref / n_g) - 1) * dist return first_vel_corrn_metres
[docs] def mets_partial_differentials( group_ref_Index=1.00028, temp=15, pressure=1013.25, rel_humidity=60 ): """ Calculates the sensitivity coefficients for temp, pressure and humidity in ppm :param group_ref_Index: manufacturers group refractive index of light :param temp: Observed Dry Temperature (degrees Celsius) :param pressure: Observed Pressure (hectopascals or millibars) :param rel_humidity: Observed Relative Humidity (percentage) - Optional if wet_temp supplied :return: Sensitivity Coefficients K, L and M in ppm """ ng_1 = group_ref_Index - 1 t_273_15 = temp + 273.15 e = part_h2o_vap_press(temp, pressure, rel_humidity) param_k = ( (((ng_1 * 273.15 * pressure) / 1013.25) - (11.27 * e * 10**-6)) / t_273_15**2 ) * (10**6) param_l = 0.26957809 * (ng_1 / t_273_15) * (10**6) param_m = ((11.27 * 10**-6) / t_273_15) * (10**6) return param_k, param_l, param_m
def precise_inst_ht(vert_list, spacing, offset): """ Uses a set of Vertical Angle Observations taken to a levelling staff at regular intervals to determine the height of the instrument above a reference mark :param vert_list: List of Vertical (Zenith) Angle Observations (minimum of 3) in Decimal Degrees format :param spacing: Distance in metres between each vertical angle observation :param offset: Lowest observed height above reference mark :return: Instrument Height above reference mark and its standard deviation """ if len(vert_list) < 3: raise ValueError("ValueError: 3 or more vertical angles required") vert_list.sort(reverse=True) vert_pairs = [(va1, va2) for va1, va2 in zip(vert_list, vert_list[1:])] base_ht = [] height_comp = [] for num, pair in enumerate(vert_pairs): base_ht_pair = offset + num * spacing base_ht.append(base_ht_pair) dist_a = sin(radians(pair[1])) * (spacing / (sin(radians(pair[0] - pair[1])))) delta_ht = dist_a * (sin(radians(pair[0] - 90))) height_comp.append(delta_ht + base_ht[num]) return round(mean(height_comp), 5), round(stdev(height_comp), 5)
[docs] def joins(east1, north1, east2, north2): """ Calculates the bearing and distance from point 1 to point 2 :param east1: Easting of Point 1 :param north1: Northing of Point 1 :param east2: Easting of Point 2 :param north2: Northing of Point 2 :return: Distance and Bearing from Point 1 to Point 2 """ return rect2polar(east2 - east1, north2 - north1)
[docs] def radiations(east1, north1, brg1to2, dist, rotation=0, psf=1): """ Calculates the coordinates of Point 2 given Point 1, bearing and distance :param east1: Easting of Point 1 :param north1: Northing of Point 1 :param brg1to2: Bearing from Point 1 to Point 2 (decimal degrees) :param dist: Distance from Point 1 to Point 2 (metres) :param rotation: Rotation to be applied to bearing (decimal degrees) - Optional :param psf: Prism Scale Factor to be applied to distance - Optional :return: Easting and Northing of Point 2 """ delta_east, delta_north = polar2rect(dist * psf, brg1to2 + rotation) return east1 + delta_east, north1 + delta_north
[docs] def va_conv(zenith_angle, slope_dist, height_inst=0, height_tgt=0): """ Function to convert vertical angles (zenith distances) and slope distances into horizontal distances and changes in height. Instrument and Target heights can be entered to allow computation of zenith and slope distances between ground points. :param zenith_angle: Zenith Angle from Instrument to Target, expressed in decimal degrees :param slope_dist: Slope Distance from Instrument to Target in metres :param height_inst: Height of Instrument. Optional - Default Value of 0m :param height_tgt: Height of Target. Optional - Default Value of 0m :return: - vert_angle_pt - Vertical Angle between Ground Points, expressed in decimal degrees - slope_dist_pt - Slope Distance between Ground Points in metres - hz_dist - Horizontal Distance - delta_ht - Change in height between Ground Points in metres """ # Convert Zenith Angle to Vertical Angle try: if zenith_angle == 0 or zenith_angle == 180: raise ValueError elif 0 < zenith_angle < 180: zenith_angle = radians(90 - zenith_angle) elif 180 < zenith_angle < 360: zenith_angle = radians(270 - zenith_angle) else: raise ValueError except ValueError: raise ValueError("ValueError: Vertical Angle Invalid") # Calculate Horizontal Dist and Delta Height hz_dist = slope_dist * cos(zenith_angle) delta_ht = slope_dist * sin(zenith_angle) # Account for Target and Instrument Heights delta_ht = height_inst + delta_ht - height_tgt slope_dist_pt = sqrt(delta_ht**2 + hz_dist**2) vert_angle_pt = atan(delta_ht / hz_dist) vert_angle_pt = degrees(vert_angle_pt) return vert_angle_pt, slope_dist_pt, hz_dist, delta_ht
""" The following has been translated from UNSW FORTRAN code """ """ PROGRAM RINDEX ----------------------------------------------------------------- Date : 6 July 1995 Version 4.0 with CF = 1.022 This program calculates the phase and group refractive index using equations for the visible and near infrared developed by P.E. Ciddor of the National Measurement Laboratory, CSIRO, Division of the Applied Physics, Australia. (see reference below) Program originally written by S.K. Johnson and J.M. R?eger of the School of Geomatic Engineering, University of New South Wales, Australia. Program converted from FORTRAN to python by Kent Wheeler of Landgate. Main References: P.E. Ciddor, 1996, Refractive Index of Air: New Equations for the Visible and Near Infrared, Applied Optics (Lasers, Phototonics, and Environmental optics), 35(9): 1566-73. R.S. Davies, 1992, Equations for Determination of the Density of Moist Air (1981/91), Metrologia, 29: 67-70. P. Giacomo, 1982, Equation for Determination of the Density of Moist Air, Metrologia, 18: 33-40. E.P. Peck and K. Reeder, 1972, Dispersion of Air, Journal of the Optical Society of America, 62(8): 958-962. J.C. Owens, 1967, Optical Refractive Index of Air: Dependence on Pressure, Temperature and Composition, Applied Optics, 6(1): 51-59 K.P Birch and M.J. Downs, 1994, Correction to the updated Edlen Equation for the Refractive Index of Air, Metrologia, 31: 315-316. K.P. Birch and M.J. Downs, 1993, An Updated Edlen Equation for the Refractive Index of Air, Metrologia, 30: 155-162. Variables used: A,B,C,D = constants used to calculate SVP A0,A1,A2,B0,B1,C0,C1,DLC,E = constants used to calculate Z ALPHA, BETA, GAMMA = constants to calculate enhancement factor of water vapour in air CF = correction factor CTERM = reference refractivity DIST_UC = uncorrected distance (m) DIST_CO = corrected distance (m) F = enhanvement factor of water vapour in air H = humidity (%) K0,K1,K2,K3 = constants used to calculate NASX LAMDA = wavelength (micrometre) MA = molar mass of dry air containing a fraction XC of Carbon Dioxide (kg/mol) MV = molar mass of water vapour (kg/mol) NAS_1 = refractivity of standard air with 450 ppm = (NAS-1)10E8 NASX_1 = refractivity of standard air with XC ppm = (NASX-1)10E8 NPROPG_1 = group refractivity = (NPROPgroup-1)10E8 NPROPP_1 = phase refractivity = (NPROPphase-1)10E8 NWS_1 = refractivity of water vapour at standard conditions = (NWS-1)10E8 P = pressure (hPa) PV = partial water vapour pressure (Pa) RHOA = density of dry air (kg per cubic metre) RHOASX = density of standard air (kg per cubic metre) RHOW = density of pure water vapour (kg per cubic metre) RHOWS = density of standard water vapour (kg per cubic metre) SIGMA = wavenumber (1/micrometre) SVP = saturation vapour pressure of water vapour (Pa) in air at temperature (TK) TC = temperature (degrees Celcius) TK = temperature (Kelvin) W0,W1,W2,W3 = constants used to calculate NWS XC = carbon dioxide content (ppm) Z = compressibility of air ZA = compressibility of dry air ZWV = compressibility of water vapour ----------------------------------------------------------------- """
[docs] def refractivity_constants(): """ :return: Refractivity constants used in the refractivity calculations. """ # PECK & REEDER (1972) AS AMMENDED BY CIDDOR # (DRY AIR REFRACTIVITY) (K0, K1, K2, K3) = (238.0185, 5792105.0, 57.362, 167917.0) # OWENS (1967) WATER VAPOUR REFRACTIVITY (W0, W1, W2, W3) = (295.235, 2.6422, -0.032380, 0.004028) # ENHANCEMENT FACTOR (DAVIES, 1992) (ALPHA, BETA, GAMMA) = (1.00062, 3.14e-8, 5.6e-7) # COMPRESSIBILITY (DAVIES 1992) (A0, A1, A2, B0, B1, C0, C1, DLC, E) = ( 1.58123e-6, -2.9331e-8, 1.1043e-10, 5.707e-6, -2.051e-8, 1.9898e-4, -2.376e-6, 1.83e-11, -0.765e-8, ) # CIDDOR 1995 AND DAVIES 1992. NEW CF ON 28/06/95 (CF, R, MV) = (1.022, 8.314510, 0.018015) # STANDARD CONDITION DRY AIR (PECK & REEDER 1972) (TCSTDAIR, TKSTDAIR, PSTDAIR) = (15.0, 288.15, 101325.0) (TCSTDWV, TKSTDWV, PSTDWV) = (20.0, 293.15, 1333.0) return ( (K0, K1, K2, K3), (W0, W1, W2, W3), (ALPHA, BETA, GAMMA), (A0, A1, A2, B0, B1, C0, C1, DLC, E), (CF, R, MV), (TCSTDAIR, TKSTDAIR, PSTDAIR), (TCSTDWV, TKSTDWV, PSTDWV), )
[docs] def phase_refractivity(LAMDA, TC, P, PV, XC=420): """ Calculates the phase refractivity of moist air using Ciddor's equations :param LAMDA: wavelength (micrometre) :param TC: temperature (degrees Celcius) :param P: pressure (hPa) :param PV: partial water vapour pressure (Pa) :param XC: carbon dioxide content (ppm) :return: NPROPP_1 - phase refractivity = (NPROPphase-1)10E8 """ ( (K0, K1, K2, K3), (W0, W1, W2, W3), (ALPHA, BETA, GAMMA), (A0, A1, A2, B0, B1, C0, C1, DLC, E), (CF, R, MV), (TCSTDAIR, TKSTDAIR, PSTDAIR), (TCSTDWV, TKSTDWV, PSTDWV), ) = refractivity_constants() # CONVERT LAMDA TO SIGMA, THE PRESSURE UNITS TO PASCAL AND CREATE TC AND PP SIGMA = 1.0 / LAMDA # CONVERSION FROM hPa TO Pa AND C TO K P = P * 100.0 PV = PV * 100.0 TK = TC + 273.15 # CALCULATE REFRACTIVITY OF STANDARD AIR (TC=15, P=101325) TEMP1 = SIGMA * SIGMA # CIDDOR EQ.(1) NAS_1 = (K1 / (K0 - TEMP1)) + (K3 / (K2 - TEMP1)) # CIDDOR EQ.(2) FOR AMBIENT C02 CONTENT (XC) NASX_1 = NAS_1 * (1 + 0.534e-6 * (XC - 450.0)) STD_AIR = {"(Nas-1)10E8": NAS_1, "(Nasx-1)10E8": NASX_1} # USING EQ. 2, CALCULATE REFRACTIVITY OF WATER VAPOUR AT STANDARD CONDITIONS # (TC=20, P=1333) TEMP2 = TEMP1 * TEMP1 TEMP3 = TEMP1 * TEMP2 # FOLLOWING OWENS (1967) AS AMENDED TO FIT BIRCH & DOWNS (1988) NWS_1 = CF * (W0 + W1 * TEMP1 + W2 * TEMP2 + W3 * TEMP3) STD_WATER_VAPOUR = {"(Nws-1)10E8": NWS_1} # CALCULATE THE DENSITY OF STANDARD AIR (XV=0, TC=15, P=101325) # EQ.(2) DAVIS (1992) XC = MOLECULAR FRACTION OF C02 # XC IN CIDDOR'S FORMULA IS IN PPM, CONVERTED TO A FRACTION MA = (28.9635 + 12.011e-6 * (XC - 400.0)) * 1.0e-3 # USING CIDDOR EQ.(A1) WITH XV = 0 : DRY AIR COMPRESSIBILITY ZA = ( 1.0 - (PSTDAIR / TKSTDAIR) * (A0 + (A1 * TCSTDAIR) + (A2 * TCSTDAIR * TCSTDAIR)) + ((PSTDAIR / TKSTDAIR) * (PSTDAIR / TKSTDAIR) * DLC) ) # USING EQ. 3 FOR DRY AIR RHOASX = (PSTDAIR * MA) / (ZA * R * TKSTDAIR) DENSITY_OF_STD_AIR = {"Ma": MA, "Z_(DRY AIR)": ZA, "RHOasx": RHOASX} # CALCULATE THE DENSITY OF WATER VAPOUR AT STANDARD CONDITIONS # (XV=1, TC=20, P=1333) # USING CIDDOR EQUATION A1 WITH XV = 1 AND PARTIAL # WATER VAPOUR PRESSURE ZWV = ( 1.0 - (PSTDWV / TKSTDWV) * ( A0 + (A1 * TCSTDWV) + (A2 * TCSTDWV * TCSTDWV) + (B0 + B1 * TCSTDWV) + (C0 + C1 * TCSTDWV) ) + ((PSTDWV / TKSTDWV) * (PSTDWV / TKSTDWV) * (DLC + E)) ) # USING EQ. 3 RHOWS = (PSTDWV * MV) / (ZWV * R * TKSTDWV) DENSITY_OF_STD_WATER_VAPOUR = {"Z_(WATER VAPOUR)": ZWV, "RHOws": RHOWS} # CALCULATE THE DENSITY OF DRY AMBIENT AIR (TC= USER, P=USER) F = ALPHA + (BETA * P) + (GAMMA * TC * TC) XV = F * PV / P # USING CIDDOR EQUATION A1 Z = ( 1.0 - (P / TK) * ( A0 + (A1 * TC) + (A2 * TC * TC) + ((B0 + B1 * TC) * XV) + ((C0 + C1 * TC) * XV * XV) ) + ((P / TK) * (P / TK) * (DLC + (E * XV * XV))) ) RHOA = (P * MA * (1.0 - XV)) / (Z * R * TK) DENSITY_OF_DRY_AMBIENT_AIR = {"f": F, "Xv": XV, "Z_(AMB. AIR)": Z, "RHOa": RHOA} # CALCULATE THE DENSITY OF AMBIENT WATER VAPOUR # USING EQ. 3 RHOW = (P * MV * XV) / (Z * R * TK) # CALCULATE THE PHASE REFRACTIVITY OF MOIST AIR FROM CIDDOR EQ.(4) TEMP1 = RHOA / RHOASX TEMP2 = RHOW / RHOWS DENSITY_OF_AMBIENT_WATER_VAPOUR = {"RHOw": RHOW, "Da": TEMP1, "Dv": TEMP2} TEMP1 = TEMP1 * NASX_1 TEMP2 = TEMP2 * NWS_1 DENSITY_OF_AMBIENT_WATER_VAPOUR["DaNasx"] = TEMP1 DENSITY_OF_AMBIENT_WATER_VAPOUR["DvNvs"] = TEMP2 NPROPP_1 = TEMP1 + TEMP2 REFRACTIVITY_OF_MOIST_AIR = {"(NpropP-1)10E8": NPROPP_1} return NPROPP_1
[docs] def group_refractivity(LAMDA, TC, P, PV, XC=420): """ Calculates the group refractivity of moist air using Ciddor's equations :param LAMDA: wavelength (micrometre) :param TC: temperature (degrees Celcius) :param P: pressure (hPa) :param PV: partial water vapour pressure (Pa) :param XC: carbon dioxide content (ppm) :return: NPROPG_1 - group refractivity = (NPROPgroup-1)10E8 """ ( (K0, K1, K2, K3), (W0, W1, W2, W3), (ALPHA, BETA, GAMMA), (A0, A1, A2, B0, B1, C0, C1, DLC, E), (CF, R, MV), (TCSTDAIR, TKSTDAIR, PSTDAIR), (TCSTDWV, TKSTDWV, PSTDWV), ) = refractivity_constants() # CONVERT LAMDA TO SIGMA, THE PRESSURE UNITS TO PASCAL AND CREATE TC AND PP SIGMA = 1.0 / LAMDA # CONVERSION FROM hPa TO Pa AND C TO K P = P * 100.0 PV = PV * 100.0 TK = TC + 273.15 # CALCULATE REFRACTIVITY OF STANDARD AIR (TC=15, P=101325) TEMP1 = SIGMA * SIGMA # CIDDOR EQ.(9) NGAS_1 = K1 * ((K0 + TEMP1) / ((K0 - TEMP1) * (K0 - TEMP1))) + K3 * ( (K2 + TEMP1) / ((K2 - TEMP1) * (K2 - TEMP1)) ) # CIDDOR EQ.(2) FOR AMBIENT C02 CONTENT (XC) NGASX_1 = NGAS_1 * (1 + 0.534e-6 * (XC - 450.0)) STD_AIR = {"(Ngas-1)10E8": NGAS_1, "(Ngasx-1)10E8": NGASX_1} # USING EQ. 2, CALCULATE REFRACTIVITY OF WATER VAPOUR AT STANDARD CONDITIONS # (TC=20, P=1333) TEMP2 = TEMP1 * TEMP1 TEMP3 = TEMP1 * TEMP2 # FOLLOWING OWENS (1967) AS AMENDED TO FIT BIRCH & DOWNS (1988) NGWS_1 = CF * (W0 + 3.0 * W1 * TEMP1 + 5.0 * W2 * TEMP2 + 7.0 * W3 * TEMP3) STD_WATER_VAPOUR = {"(Ngws-1)10E8": NGWS_1} # CALCULATE THE DENSITY OF STANDARD AIR (XV=0, TC=15, P=101325) # EQ.(2) DAVIS (1992) XC = MOLECULAR FRACTION OF C02 # XC IN CIDDOR'S FORMULA IS IN PPM, CONVERTED TO A FRACTION MA = (28.9635 + 12.011e-6 * (XC - 400.0)) * 1.0e-3 # USING CIDDOR EQ.(A1) WITH XV = 0 : DRY AIR COMPRESSIBILITY ZA = ( 1.0 - (PSTDAIR / TKSTDAIR) * (A0 + (A1 * TCSTDAIR) + (A2 * TCSTDAIR * TCSTDAIR)) + ((PSTDAIR / TKSTDAIR) * (PSTDAIR / TKSTDAIR) * DLC) ) # USING EQ. 3 FOR DRY AIR RHOASX = (PSTDAIR * MA) / (ZA * R * TKSTDAIR) DENSITY_OF_STD_AIR = {"Ma": MA, "Z_(DRY AIR)": ZA, "RHOasx": RHOASX} # CALCULATE THE DENSITY OF WATER VAPOUR AT STANDARD CONDITIONS # (XV=1, TC=20, P=1333) # USING CIDDOR EQUATION A1 WITH XV = 1 AND PARTIAL # WATER VAPOUR PRESSURE ZWV = ( 1.0 - (PSTDWV / TKSTDWV) * ( A0 + (A1 * TCSTDWV) + (A2 * TCSTDWV * TCSTDWV) + (B0 + B1 * TCSTDWV) + (C0 + C1 * TCSTDWV) ) + ((PSTDWV / TKSTDWV) * (PSTDWV / TKSTDWV) * (DLC + E)) ) # USING EQ. 3 RHOWS = (PSTDWV * MV) / (ZWV * R * TKSTDWV) DENSITY_OF_STD_WATER_VAPOUR = {"Z_(WATER VAPOUR)": ZWV, "RHOws": RHOWS} # CALCULATE THE DENSITY OF DRY AMBIENT AIR (TC= USER, P=USER) F = ALPHA + (BETA * P) + (GAMMA * TC * TC) XV = F * PV / P # USING CIDDOR EQUATION A1 Z = ( 1.0 - (P / TK) * ( A0 + (A1 * TC) + (A2 * TC * TC) + ((B0 + B1 * TC) * XV) + ((C0 + C1 * TC) * XV * XV) ) + ((P / TK) * (P / TK) * (DLC + (E * XV * XV))) ) # USING EQ. 3 RHOA = (P * MA * (1.0 - XV)) / (Z * R * TK) DENSITY_OF_DRY_AMBIENT_AIR = {"f": F, "Xv": XV, "Z_(AMB. AIR)": Z, "RHOa": RHOA} # CALCULATE THE DENSITY OF AMBIENT WATER VAPOUR # USING EQ. 3 RHOW = (P * MV * XV) / (Z * R * TK) # CALCULATE THE GROUP REFRACTIVITY OF MOIST AIR FROM CIDDOR EQ.(4) TEMP1 = RHOA / RHOASX TEMP2 = RHOW / RHOWS DENSITY_OF_AMBIENT_WATER_VAPOUR = {"RHOw": RHOW, "Da": TEMP1, "Dv": TEMP2} TEMP1 = TEMP1 * NGASX_1 TEMP2 = TEMP2 * NGWS_1 DENSITY_OF_AMBIENT_WATER_VAPOUR["DaNgasx"] = TEMP1 DENSITY_OF_AMBIENT_WATER_VAPOUR["DvNgvs"] = TEMP2 NPROPG_1 = TEMP1 + TEMP2 REFRACTIVITY_OF_MOIST_AIR = {"(NpropG-1)10E8": NPROPG_1} return NPROPG_1
[docs] def humidity2part_water_vapour_press(H, TC): """ Calculates the partial water vapour pressure from relative humidity and temperature :param H: humidity (%) :param TC: temperature (degrees Celcius) :return: PV - partial water vapour pressure (Pa) """ (A, B, C, D) = (1.2378847e-5, -1.9121316e-2, 33.93711047, -6.3431645e3) TK = TC + 273.15 # NOW CONVERT THE RELATIVE HUMIDITY TO PATIAL WATER VAPOUR PRESSURE (hPa) # SEE EQ.(22) GIACOMO 1982 SVP = exp(A * TK * TK + B * TK + C + D / TK) PV = (H / 100.0) * SVP PV = PV / 100.0 return PV