Source code for test_solarFlux

#
#  ISC License
#
#  Copyright (c) 2016, Autonomous Vehicle Systems Lab, University of Colorado at Boulder
#
#  Permission to use, copy, modify, and/or distribute this software for any
#  purpose with or without fee is hereby granted, provided that the above
#  copyright notice and this permission notice appear in all copies.
#
#  THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
#  WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
#  MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
#  ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
#  WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
#  ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
#  OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
#


import numpy as np
import pytest
from Basilisk.architecture import messaging
from Basilisk.simulation import solarFlux
from Basilisk.utilities import SimulationBaseClass
from Basilisk.utilities import orbitalMotion as om


[docs]@pytest.mark.parametrize("positionFactor, shadowFactor, eclipseMsgName, relTol", [(np.sqrt(2), 0.5, "eclipse_data_0", 1e-8), (np.sqrt(2), 0.5, "", 1e-8)]) def test_solarFlux(show_plots, positionFactor, shadowFactor, eclipseMsgName, relTol): """ **Test Description** Test that solar flux is appropriately modified depending on spacecraft distance from the sun. To test this, the module is asked to write the solar flux at 1 AU. Then it is asked to write the flux at ``positionFactor*AU`` and the flux is checked to be ``positionFactor**2`` of that at 1 AU to within a relative tolerance of relTol. The application of the shadowFactor is also checked as a multiple of the un-shadowed flux. Args: positionFactor (float): positive, a factor by which to multiply the original s/c position to check flux at a new position shadowFactor (float): between 0 and 1, the eclipse factor by which to multiple the solar flux at a position relTol (float): positive, the relative tolerance to which the result is checked. """ sim = SimulationBaseClass.SimBaseClass() proc = sim.CreateNewProcess("proc") task = sim.CreateNewTask("task", int(1e9)) proc.addTask(task) sunPositionMessage = messaging.SpicePlanetStateMsgPayload() sunPositionMessage.PositionVector = [0., 0., 0.] sunMsg = messaging.SpicePlanetStateMsg().write(sunPositionMessage) scPositionMessage = messaging.SCStatesMsgPayload() scPositionMessage.r_BN_N = [0., 0., om.AU*1000] scMsg = messaging.SCStatesMsg().write(scPositionMessage) eclipseMessage = messaging.EclipseMsgPayload() eclipseMessage.shadowFactor = shadowFactor eclMsg = messaging.EclipseMsg().write(eclipseMessage) sf = solarFlux.SolarFlux() sim.AddModelToTask(task.Name, sf) sf.sunPositionInMsg.subscribeTo(sunMsg) sf.spacecraftStateInMsg.subscribeTo(scMsg) sf.eclipseInMsg.subscribeTo(eclMsg) dataLog = sf.solarFluxOutMsg.recorder() sim.AddModelToTask(task.Name, dataLog) sim.InitializeSimulation() sim.TotalSim.SingleStepProcesses() fluxOutEarth = dataLog.flux scPositionMessage.r_BN_N = [0., 0., positionFactor * om.AU*1000] scMsg.write(scPositionMessage) sim.TotalSim.SingleStepProcesses() fluxOutFurther = dataLog.flux assert fluxOutFurther[1] == pytest.approx(fluxOutEarth[0] / shadowFactor / (positionFactor**2) * shadowFactor, rel=relTol)
if __name__ == "__main__": test_solarFlux(False, np.sqrt(2.0), 0.5, "eclipse_data_0", 1e-8)