Source code for itmlogic.statistics.avar

import math
import numpy as np

from itmlogic.statistics.curv import curv

[docs]def avar(zzt, zzl, zzc, prop): """ Finds the quantiles of attenuation using the output from lrprop (Section V of "The ITS Irregular Terrain Model, version 1.2.2: The Algorithm"). When in area prediction mode we need a threefold quantile of attenuation corresponding to time, locations and situations. For efficiency, avar is written as a function of the standard normal deviates corresponding to the requested fractions. Parameters ---------- zzt : float Standard normal deviate corresponding to user defined quantile. zzl : float Standard normal deviate corresponding to user defined quantile. zzc : float Standard normal deviate corresponding to user defined quantile. prop : dict Contains all input propagation parameters. Returns ------- avar1 : float Additional attenuation from the median corresponding to the user defined quantiles in time, location, and situation (Section V of "The ITS Irregular Terrain Model, version 1.2.2: The Algorithm"). prop : dict Contains all input and output propagation parameters. """ third = 1 / 3 bv1 = [ -9.67, -0.62, 1.26, -9.21, -0.62, -0.39, 3.15] bv2 = [ 12.7, 9.19, 15.5, 9.05, 9.19, 2.86, 857.9] xv1 = [ 144.9e3, 228.9e3, 262.6e3, 84.1e3, 228.9e3, 141.7e3, 2222.e3] xv2 = [ 190.3e3, 205.2e3, 185.2e3, 101.1e3, 205.2e3, 315.9e3, 164.8e3] xv3 = [ 133.8e3, 143.6e3, 99.8e3, 98.6e3, 143.6e3, 167.4e3, 116.3e3] bsm1 = [ 2.13, 2.66, 6.11, 1.98, 2.68, 6.86, 8.51] bsm2 = [ 159.5, 7.67, 6.65, 13.11, 7.16, 10.38, 169.8] xsm1 = [ 762.2e3, 100.4e3, 138.2e3, 139.1e3, 93.7e3, 187.8e3, 609.8e3] xsm2 = [ 123.6e3, 172.5e3, 242.2e3, 132.7e3, 186.8e3, 169.6e3, 119.9e3] xsm3 = [ 94.5e3, 136.4e3, 178.6e3, 193.5e3, 133.5e3, 108.9e3, 106.6e3] bsp1 = [ 2.11, 6.87, 10.08, 3.68, 4.75, 8.58, 8.43] bsp2 = [ 102.3, 15.53, 9.60, 159.3, 8.12, 13.97, 8.19] xsp1 = [ 636.9e3, 138.7e3, 165.3e3, 464.4e3, 93.2e3, 216.0e3, 136.2e3] xsp2 = [ 134.8e3, 143.7e3, 225.7e3, 93.1e3, 135.9e3, 152.0e3, 188.5e3] xsp3 = [ 95.6e3, 98.6e3, 129.7e3, 94.2e3, 113.4e3, 122.7e3, 122.9e3] bsd1 = [ 1.224, 0.801, 1.380, 1.000, 1.224, 1.518, 1.518] bzd1 = [ 1.282, 2.161, 1.282, 20., 1.282, 1.282, 1.282] bfm1 = [ 1., 1., 1., 1., 0.92, 1., 1.] bfm2 = [ 0., 0., 0., 0., 0.25, 0., 0.] bfm3 = [ 0., 0., 0., 0., 1.77, 0., 0.] bfp1 = [ 1., 0.93, 1., 0.93, 0.93, 1., 1.] bfp2 = [ 0., 0.31, 0., 0.19, 0.31, 0., 0.] bfp3 = [ 0., 2.00, 0., 1.79, 2.00, 0., 0.] rt = 7.8 rl = 24 if prop['lvar'] > 0: if prop['lvar'] > 4: if prop['klim'] <= 0 or prop['klim'] > 7: prop['klim'] = 5 prop['kwx'] = max(prop['kwx'], 2) prop['cv1'] = bv1[prop['klim'] - 1] prop['cv2'] = bv2[prop['klim'] - 1] prop['yv1'] = xv1[prop['klim'] - 1] prop['yv2'] = xv2[prop['klim'] - 1] prop['yv3'] = xv3[prop['klim'] - 1] prop['csm1'] = bsm1[prop['klim']- 1] prop['csm2'] = bsm2[prop['klim']- 1] prop['ysm1'] = xsm1[prop['klim']- 1] prop['ysm2'] = xsm2[prop['klim']- 1] prop['ysm3'] = xsm3[prop['klim']- 1] prop['csp1'] = bsp1[prop['klim']- 1] prop['csp2'] = bsp2[prop['klim']- 1] prop['ysp1'] = xsp1[prop['klim']- 1] prop['ysp2'] = xsp2[prop['klim']- 1] prop['ysp3'] = xsp3[prop['klim']- 1] prop['csd1'] = bsd1[prop['klim']- 1] prop['zd'] = bzd1[prop['klim'] - 1] prop['cfm1'] = bfm1[prop['klim'] - 1] prop['cfm2'] = bfm2[prop['klim'] - 1] prop['cfm3'] = bfm3[prop['klim'] - 1] prop['cfp1'] = bfp1[prop['klim'] - 1] prop['cfp2'] = bfp2[prop['klim'] - 1] prop['cfp3'] = bfp3[prop['klim'] - 1] if prop['lvar'] > 3: prop['kdv'] = prop['mdvar'] prop['ws'] = (prop['kdv'] >= 20) if prop['ws']: prop['kdv'] = prop['kdv'] - 20 prop['wl'] = prop['kdv'] >= 10 if prop['wl']: prop['kdv'] = prop['kdv'] - 10 if prop['kdv'] < 0 or prop['kdv'] > 3: prop['kdv'] = 0 prop['kwx'] = max(prop['kwx'], 2) if prop['lvar'] > 2: q = np.log(0.133 * prop['wn']) prop['gm'] = ( prop['cfm1'] + prop['cfm2'] / ((prop['cfm3'] * q)**2 + 1) ) prop['gp'] = ( prop['cfp1'] + prop['cfp2'] / ((prop['cfp3'] * q)**2 + 1) ) if prop['lvar'] > 1: prop['dexa'] = ( math.sqrt(18e6 * prop['he'][0]) + math.sqrt(18e6 * prop['he'][1]) + (575.7e12 / prop['wn']) ** third ) if prop['dist'] < prop['dexa']: de = 130e3 * prop['dist'] / prop['dexa'] else: de = 130e3 + prop['dist'] - prop['dexa'] prop['vmd'] = curv( prop['cv1'], prop['cv2'], prop['yv1'], prop['yv2'], prop['yv3'], de ) prop['sgtm'] = curv( prop['csm1'], prop['csm2'], prop['ysm1'], prop['ysm2'], prop['ysm3'], de) * prop['gm'] prop['sgtp'] = curv( prop['csp1'], prop['csp2'], prop['ysp1'], prop['ysp2'], prop['ysp3'], de) * prop['gp'] prop['sgtd'] = prop['sgtp'] * prop['csd1'] prop['tgtd'] = (prop['sgtp'] - prop['sgtd']) * prop['zd'] if prop['wl']: prop['sgl'] = 0 else: q = ( (1 - 0.8 * math.exp(-prop['dist'] / 50e3)) * prop['dh'] * prop['wn'] ) prop['sgl'] = 10 * q / (q + 13) if prop['ws']: prop['vs0'] = 0 else: prop['vs0'] = (5 + 3 * math.exp(-de / 100e3))**2 prop['lvar'] = 0 zt = zzt zl = zzl zc = zzc if prop['kdv'] == 0: zt = zc zl = zc elif prop['kdv'] == 1: zl = zc elif prop['kdv'] == 2: zl = zt if abs(zt) > 3.10 or abs(zl) > 3.10 or abs(zc) > 3.10: prop['kwx'] = max(prop['kwx'], 1) if zt < 0: sgt = prop['sgtm'] elif zt <= prop['zd']: sgt = prop['sgtp'] else: sgt = prop['sgtd'] + prop['tgtd'] / zt vs = ( prop['vs0'] + (sgt * zt)**2 / (rt + zc**2) + (prop['sgl'] * zl)**2 / (rl + zc**2) ) if prop['kdv'] == 0: yr = 0 sgc = math.sqrt(sgt**2 + prop['sgl']**2 + vs) elif prop['kdv'] == 1: yr = sgt * zt sgc = math.sqrt(prop['sgl']**2 + vs) elif prop['kdv'] == 2: yr = math.sqrt(sgt**2 + prop['sgl']**2) * zt sgc = math.sqrt(vs) else: yr = sgt * zt + prop['sgl'] * zl sgc = math.sqrt(vs) avar1 = prop['aref'] - prop['vmd'] - yr - sgc * zc if avar1 < 0: avar1 = avar1 * (29 - avar1) / (29 - 10 * avar1) return avar1, prop