def testIRTAM(self): # Top level manager config managerConfig = ConfigValues.TICSConfig() # Tell the datacontroller to use giro and roam to use irtam managerConfig.dataControllerConfig.sources = ['giro'] managerConfig.roamConfig.backgroundModel = ['irtam'] manager = Manager(managerConfig) manager.queryIonoState(37.2321, 256.2323, datetime(2015, 10, 20))
def testRIPE(self): # Top level manager config managerConfig = ConfigValues.TICSConfig() # Tell the datacontroller to use noaa and roam to use ripe managerConfig.dataControllerConfig.sources = ['noaa'] managerConfig.roamConfig.backgroundModel = ['ripe'] manager = Manager(managerConfig) manager.queryIonoState(37.2321, 256.2323, datetime(2015, 10, 20))
def test_CalcIonoState_IRTAM(self): import IonoModelEngine.Config.ConfigValues as ConfigValues from numpy.testing import assert_approx_equal logger.info("test_CalcIonoState_IRTAM") directory = os.path.dirname( os.path.realpath(__file__)) + "/UnitTestData/" # Setup the input into ROAM listOfFiles = {} listOfFiles['giro'] = [directory + 'IRTAM_foF2_COEFFS_20151020_0000.ASC', \ directory + 'IRTAM_hmF2_COEFFS_20151020_0000.ASC', \ directory + 'IRTAM_B0_COEFFS_20151020_0000.ASC', \ directory + 'IRTAM_B1_COEFFS_20151020_0000.ASC'] listOfFiles['noaa'] = [] listOfFiles['localDigisonde'] = [] # First construct a config file for ROAM self.config = ConfigValues.ROAMConfig() # Tell roam to use IRTAM self.config.backgroundModel = 'irtam' # instantiate ROAM self.roam = ROAM(self.config, self.irtamHandle, self.pharlapHandle) # G10 receiver location lat = 32.4824 lon = -106.3809 UT = numpy.array([2015, 10, 20, 0, 0]) DT = datetime(UT[0], UT[1], UT[2], UT[3], UT[4], 0) #self.roam.background_model = 2 # force use of IRTAM #self.roam.noaaConfig = [] # force use of IRTAM state = self.roam.CalcIonoState(lat, lon, DT, listOfFiles) logger.info( "ROAM foF2={:.4f} hmF2={:.4f} foF1={:.4f} foE={:.4f} hmE={:.4f} B0={:.4f} B1={:.4f} foEs={:.4f} hmEs={:.4f} beta_lat={:.4f} beta_lon={:.4f}". \ format(state[0], state[1], state[2], state[3], state[4], state[5], \ state[6], state[7], state[8], state[9], state[10])) # Output from ROAM.py running IRTAM # [ROAM.py:176] IRTAM data: foF2=8.7484 hmF2=252.7329 B0=59.5018 B1=3.1669 # [ROAM.py:734] ROAM foF2=8.7484 hmF2=252.7329 foF1=-1.0000 foE=1.8131 hmE=110.0000 B0=59.5018 B1=3.1669 ... # foEs=0.0000 hmEs=110.0000 beta_lat=-0.0085 beta_lon=-0.0116 assert_approx_equal(state[0], 8.7484, significant=3) # foF2 assert_approx_equal(state[1], 252.7329, significant=3) # hmF2 assert_approx_equal(state[2], -1.0, significant=3) # foF1 assert_approx_equal(state[3], 1.8131, significant=3) # foE assert_approx_equal(state[5], 59.5018, significant=3) # B0 assert_approx_equal(state[6], 3.1669, significant=3) # B1 assert_approx_equal(state[9], -0.0085, significant=3) # gradLat assert_approx_equal(state[10], -0.0116, significant=3) # gradLon return
def test_CalcIonoState_RIPE(self): import IonoModelEngine.Config.ConfigValues as ConfigValues from numpy.testing import assert_approx_equal logger.info("test_CalcIonoState_RIPE") # Location of test files directory = os.path.dirname(os.path.realpath(__file__)) + "/../RIPE" # Setup the input into ROAM listOfFiles = {} listOfFiles['noaa'] = [directory + '/TestFiles/AU930_NOAA.TXT', \ directory + '/TestFiles/BC840_NOAA.TXT', \ directory + '/TestFiles/EG931_NOAA.TXT'] listOfFiles['giro'] = [] listOfFiles['localDigisonde'] = [] # First construct a config file for ROAM self.config = ConfigValues.ROAMConfig() # Tell roam to use RIPE self.config.backgroundModel = 'ripe' # instantiate ROAM self.roam = ROAM(self.config, self.irtamHandle, self.pharlapHandle) self.roam.refreshIRI = 0 # G10 receiver location lat = 32.4824 lon = -106.3809 UT = numpy.array([2015, 10, 20, 0, 0]) DT = datetime(UT[0], UT[1], UT[2], UT[3], UT[4], 0) state = self.roam.CalcIonoState(lat, lon, DT, listOfFiles) logger.info( "ROAM foF2={:.4f} hmF2={:.4f} foF1={:.4f} foE={:.4f} hmE={:.4f} B0={:.4f} B1={:.4f} foEs={:.4f} hmEs={:.4f} beta_lat={:.4f} beta_lon={:.4f}". \ format(state[0], state[1], state[2], state[3], state[4], state[5], \ state[6], state[7], state[8], state[9], state[10])) # Output from Matlab run of roam_using_ripe_testfiles_20151020.m followed by roam_using_ripe.m # YEAR MON DAY HR MIN foF2 hmF2 foF1 foE B0 B1 gradLat gradLon ... Ref_lat Ref_lon AoAErr # 2015 10 20 00 00 9.2822 257.5859 -1.0000 1.8131 61.7588 2.5061 -0.0144 -0.0038 32.4824 -106.3809 0.0000 assert_approx_equal(state[0], 9.2822, significant=3) # foF2 assert_approx_equal(state[1], 257.5859, significant=3) # hmF2 assert_approx_equal(state[2], -1.0, significant=3) # foF1 assert_approx_equal(state[3], 1.8131, significant=3) # foE assert_approx_equal(state[5], 61.7588, significant=1) # B0 assert_approx_equal(state[6], 2.5061, significant=2) # B1 assert_approx_equal(state[9], -0.0144, significant=3) # gradLat assert_approx_equal(state[10], -0.0038, significant=3) # gradLon return
def test(self): # Setup the configurations config = ConfigValues.GIROConfig() # Remove the test dir to reset # if os.path.isdir(config.giroStore): # shutil.rmtree(config.giroStore) # Need to stand this up ionoPyToCHandle = IonoPyIface.Pharlap() giroManager = GIRODataManager(config, ionoPyToCHandle) # Perform test donwload listOfOutputFiles = giroManager.process(datetime(2015, 10, 20)) self.assertEqual(len(listOfOutputFiles),4)
def testNOAA(self): # Setup the configuration for the DataController dataControllerConfig = ConfigValues.DataControllerConfig() # Use only noaa dataControllerConfig.sources = ['noaa'] # Need to stand this up, usually the Manager has it saoReaderHandle = SaoPyIface() pharlapHandle = Pharlap() # Create an instance of DataController and let it go dataController = DataController(dataControllerConfig, saoReaderHandle=saoReaderHandle, pharlapHandle=pharlapHandle) listOfOutputFiles = dataController.process(datetime(2015, 10, 20)) self.assertEqual(len(listOfOutputFiles['noaa']), 4)
def testGIRO(self): # Setup the configuration for the DataController dataControllerConfig = ConfigValues.DataControllerConfig() # Use only giro dataControllerConfig.sources = ['giro'] # Need to stand this up, usually the Manager has it pharlapHandle = Pharlap() irtamHandle = IrtamPyIface() # Create an instance of DataController and let it go dataController = DataController(dataControllerConfig, irtamHandle=irtamHandle, pharlapHandle=pharlapHandle) listOfOutputFiles = dataController.process(datetime(2015, 10, 20)) self.assertEqual(len(listOfOutputFiles['giro']), 4)
def test_CalcIonoState_RIPEwithIRTAM(self): import IonoModelEngine.Config.ConfigValues as ConfigValues from numpy.testing import assert_approx_equal logger.info("test_CalcIonoState_RIPEwithIRTAM") # Location of test files directory = os.path.dirname(os.path.realpath(__file__)) + '/' # Setup the input into ROAM listOfFiles = {} listOfFiles['noaa'] = [directory + '../RIPE/TestFiles/AU930_NOAA.TXT', \ directory + '../RIPE/TestFiles/BC840_NOAA.TXT', \ directory + '../RIPE/TestFiles/EG931_NOAA.TXT'] listOfFiles['giro'] = [directory + '../IRTAM/UnitTestData/IRTAM_foF2_COEFFS_20151020_0000.ASC', \ directory + '../IRTAM/UnitTestData/IRTAM_hmF2_COEFFS_20151020_0000.ASC', \ directory + '../IRTAM/UnitTestData/IRTAM_B0_COEFFS_20151020_0000.ASC', \ directory + '../IRTAM/UnitTestData/IRTAM_B1_COEFFS_20151020_0000.ASC'] listOfFiles['localDigisonde'] = [] # First construct a config file for ROAM self.config = ConfigValues.ROAMConfig() # Tell roam to use RIPE with IRTAM self.config.backgroundModel = 'ripe-irtam' #self.config.synopticTilt = 0 # instantiate ROAM self.roam = ROAM(self.config, self.irtamHandle, self.pharlapHandle) self.roam.refreshIRI = 0 # G10 receiver location lat = 32.4824 lon = -106.3809 UT = numpy.array([2015, 10, 20, 0, 0]) DT = datetime(UT[0], UT[1], UT[2], UT[3], UT[4], 0) state = self.roam.CalcIonoState(lat, lon, DT, listOfFiles) logger.info( "ROAM foF2={:.4f} hmF2={:.4f} foF1={:.4f} foE={:.4f} hmE={:.4f} B0={:.4f} B1={:.4f} foEs={:.4f} hmEs={:.4f} beta_lat={:.5f} beta_lon={:.5f}". \ format(state[0], state[1], state[2], state[3], state[4], state[5], \ state[6], state[7], state[8], state[9], state[10])) # Output from Matlab run of roam_using_ripe_testfiles_20151020.m followed by roam_using_ripe.m # YEAR MON DAY HR MIN foF2 hmF2 foF1 foE B0 B1 gradLat gradLon ... Ref_lat Ref_lon AoAErr # 2015 10 20 00 00 9.2822 257.5859 -1.0000 1.8131 61.7588 2.5061 -0.0144 -0.0038 32.4824 -106.3809 0.0000 # foF2, hmF2, B0, B1 in this unit test are from RIPE.py using ripe-irtam option # [RIPE.py: 666] RIPE foF2 = 9.5167 hmF2 = 259.2598 B0 = 69.4209 B1 = 2.3416 # [ROAM.py:759] ROAM foF2 = 9.5167 hmF2 = 259.2598 foF1 = -1.0000 foE = 1.8131 hmE = 110.0000 B0 = 69.4209 B1 = 2.3416 \ # foEs = 0.0000 hmEs = 110.0000 beta_lat=-0.01840 beta_lon=-0.00578 assert_approx_equal(state[0], 9.5167, significant=3) # foF2 assert_approx_equal(state[1], 259.2598, significant=3) # hmF2 assert_approx_equal(state[2], -1.0, significant=3) # foF1 assert_approx_equal(state[3], 1.8131, significant=3) # foE assert_approx_equal(state[5], 69.4209, significant=1) # B0 assert_approx_equal(state[6], 2.3416, significant=2) # B1 assert_approx_equal(state[9], -0.01840, significant=3) # gradLat assert_approx_equal(state[10], -0.00578, significant=3) # gradLon return
def PharlapRayProcessorConfig(pharlap=None): pharlapRayProcessorConfig = ConfigDef.PharlapRayProcessorConfig() # The footprints of the voxel grids are squares with an incribed circle with this radius. (Meter) pharlapRayProcessorConfig.grids.radiusMeter = 900e3 # The electron density grid's increment in latitude (degrees) pharlapRayProcessorConfig.grids.latInc = numpy.deg2rad(0.10048) # The electron density grid's increment in longitude (degrees) pharlapRayProcessorConfig.grids.lonInc = numpy.deg2rad(0.10048) # The electron density grid's lowest height (km) pharlapRayProcessorConfig.grids.htStart = 60e3 # The electron density grid's increment in height (km) pharlapRayProcessorConfig.grids.htInc = 2e3 # The electron density grid's number of voxels in height pharlapRayProcessorConfig.grids.numHt = 201 # The geomagnetic field grid's increment in latitude (degrees) pharlapRayProcessorConfig.grids.bLatInc = numpy.deg2rad(0.2) # The geomagnetic field grid's increment in longitude (degrees) pharlapRayProcessorConfig.grids.bLonInc = numpy.deg2rad(0.2) # The geomagnetic field grid's lowest height (km) pharlapRayProcessorConfig.grids.bHtStart = 60e3 # The geomagnetic field grid's increment in height (km) pharlapRayProcessorConfig.grids.bHtInc = 10e3 # The geomagnetic field grid's number of voxels in height pharlapRayProcessorConfig.grids.bNumHt = 41 # Parameters of PHaRLAP pharlapRayProcessorConfig.pharlap.tolPharlapMin = numpy.array( [1e-7, 0.01, 1]) # Root solver for ray homing elLimits = numpy.array([0, 90.0]) elSpan = 180.0 azSpan = 30.0 # 1D Ray Shooting options1d = {"fatol": 1e-2, "maxNumIter": 10, "nfev": 50} elLimits = pharlapRayProcessorConfig.elLimits pharlapRayProcessorConfig.elMaxSolver = RayData.genRootSolver( "rayShooting1d", option=options1d, elLimits=elLimits) #pharlapRayProcessorConfig.solver = RayData.genRootSolver("minimize") #pharlapRayProcessorConfig.solver = RayData.genRootSolver("krylov", options={"fatol": 1.0e-3}) # 2D Bisectioning #solverOptions = {"fatol": 20, "maxNumIter": 100, "func1d": pharlapRayProcessorConfig.elMaxSolver} # pharlapRayProcessorConfig.solver = RayData.genRootSolver("bisect2d", options=solverOptions, # elLimits=elLimits, elSpan=elSpan, azSpan=azSpan) # 2D Ray Shooting solverOptions = { "fatol": 10000, "maxNumIter": 50, "nfev": 100, "nInit": 200 } pharlapRayProcessorConfig.solver = RayData.genRootSolver( "rayShooting2d", options=solverOptions, elLimits=elLimits, elSpan=elSpan, azSpan=azSpan) # If no Pharlap object is provided, construct a new one. if not isinstance(pharlap, Pharlap): pharlap = Pharlap() # Construct a ROAM object roamConfig = IonoConfig.ROAMConfig() roam = ROAM(roamConfig, pharlapHandle=pharlap) # Set the model to IRI roam.background_model = 0 pharlapRayProcessorConfig.raytrace_3d = pharlap.raytrace_3d pharlapRayProcessorConfig.genGeoMagGrid = GeoMagGrid.genGridIGRF12 pharlapRayProcessorConfig.genElectronDensityGridROAM = roam.genElectronDensityGridROAM # Number of days as the threshold to trigger the regeneration of geomagnetic fields. pharlapRayProcessorConfig.deltaDaysRegenGeomagGrid = datetime.timedelta( 90 ) # Regenerate the geomagnetic fields if it is outdated by more than 90 days. return pharlapRayProcessorConfig