VR-Vantage 2.7 API Documentation
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
ssAtmosphericTable.h
Go to the documentation of this file.
1 
3 // Copyright JRM Enterprises, Inc. 2004
4 // All rights reserved.
5 //
6 // This code is the intellectual property of JRM Enterprises, Inc.
7 // It may not be used or released as source or compiled binary form
8 // without the prior written consent of JRM Enterprises, Inc.
9 //
10 // Original Author: Ken George Date: July 2004
12 
13 #ifndef _ssAtmosphericTable_
14 #define _ssAtmosphericTable_
15 
16 
17 #include "ssSensor.h"
18 #include "ssBuffer.h"
19 
21 // class: ssAtmosphericTable
22 //
23 // description: class for the sensor atmospheric maps
24 // Note all spectral values are defined by a sensor resolution or metin
25 // This class is not part of the API and is accessed thru ssEnvironment.
26 //
28 {
29 public:
30 
31 
33  // ssAtmosphericTable
38 
40  //~ssAtmosphericTable
45 
47  //initializeAtm
54  bool initializeAtm(METIN *metin, ssSensor *sensor);
55 
56 
58  //setATMflags
70  void setATMflags(bool useSun, bool useBothSunMoon, double sensorAltitude, bool spectralMode, bool atmEnable, bool scatterEnable,
71  bool multiScatterEnable, bool roundEarthEnable);
72 
74  //makeSensorAtmosphericData
79 
81  //makeLightSourceData
85  void makeLightSourceData();
86 
88  //makeLightSourceDataSigSim
93 
95  //updateSunDiskRadiance
100  void updateSunDiskRadiance();
101 
103  //updateMoonDiskRadiance
108  void updateMoonDiskRadiance();
109 
111  //updateManMadeLightData
118  void updateManMadeLightData();
119 
121  //getAtmospherics
129  void getAtmospherics(double sensorAltitude, double objAltitude, double objRange, bool transOnly = false);
130 
132  //getNumberWavelengths
137  unsigned int getNumberWavelengths();
138 
140  //getNumberMetinWavelengths
145  unsigned int getNumberMetinWavelengths();
146 
148  //getNumberLayers
153  unsigned int getNumberLayers();
154 
156  //setNumberLayers
161  void setNumberLayers(unsigned int layers);
162 
164  //getNumberObjectAltitudes
169  unsigned int getNumberObjectAltitudes();
170 
172  //setNumberObjectAltitudes
177  void setNumberObjectAltitudes(unsigned int alts);
178 
180  //getNumberObjectAngles
185  unsigned int getNumberObjectAngles();
186 
188  //setNumberObjectAngles
193  void setNumberObjectAngles(unsigned int angles);
194 
196  //getNumberSensorAltitudes
201  unsigned int getNumberSensorAltitudes();
202 
204  //setNumberSensorAltitudes
209  void setNumberSensorAltitudes(unsigned int alts);
210 
212  //getNumberSamplesPerLayer
217  unsigned int getNumberSamplesPerLayer();
218 
220  //setNumberSamplesPerLayer
225  void setNumberSamplesPerLayer(unsigned int alts);
226 
228  //getNumberScatAngles
233  unsigned int getNumberScatAngles();
234 
236  //setNumberScatAngles
241  void setNumberScatAngles(unsigned int angles);
242 
244  //getMaxAltitude
249  double getMaxAltitude();
250 
252  //setMaxAltitude
257  void setMaxAltitude(double max);
258 
260  //getNumberTextureRanges
265  unsigned int getNumberTextureRanges();
266 
268  //setNumberTextureRanges
273  void setNumberTextureRanges(unsigned int ranges);
274 
276  //getMaxRange
281  double getMaxRange();
282 
284  //setMaxRange
289  void setMaxRange(double max);
290 
292  //getNumberComponents
297  unsigned int getNumberComponents();
298 
300  //setUseSun
307  void setUseSun(bool flag) ;
308 
310  //getUseSun
317  bool getUseSun();
318 
320  //setUseBothSunMoon
326  void setUseBothSunMoon(bool flag) ;
327 
329  //getUseBothSunMoon
335  bool getUseBothSunMoon();
336 
338  //getSensorAltitude
343  double getSensorAltitude();
344 
346  //setSensorAltitude
352  void setSensorAltitude(double alt);
353 
355  //getSpectralMode
360  bool getSpectralMode();
361 
363  //getScatterEnable
368  bool getScatterEnable();
369 
371  //getAtmEnable
376  bool getAtmEnable();
377 
379  //getMultiScatterEnable
384  bool getMultiScatterEnable();
385 
387  //getRoundEarth
392  bool getRoundEarth();
393 
395  //getMaxRadiance
400  double getMaxRadiance();
401 
403  //getUpdateTime
409 
411  //setUpdateTime
416  void setUpdateTime(JRMTIME time);
417 
419  //timeChanged
425  bool timeChanged(JRMTIME time);
426 
428  //*getAltitudePtr
433  double *getAltitudePtr();
434 
436  //*getObjAltPtr
441  double *getObjAltPtr();
442 
444  //*getSensAltPtr
449  double *getSensAltPtr();
450 
452  //*getRangePtr
457  double *getRangePtr();
458 
460  //*getScatAnglePtr
465  double *getScatAnglePtr();
466 
468  //*getMetinAtmosphericsData
473  void getMetinAtmosphericsData(double **Trans, double **AbsorbTrans, double **PathRad, double **ScatRad, double **MScatRad);
474 
476  //*getSensorAtmosphericsData
481  void getSensorAtmosphericsData(double **Trans, double **AbsorbTrans, double **PathRad, double **ScatRad, double **MScatRad);
482 
484  //*getObjectScatData
489  double *getObjectScatData();
490 
492  //*getObjectAmbientUpwelling
497  double *getObjectAmbientUpwelling();
498 
500  //*getObjAmbientDownwelling
505  double *getObjectAmbientDownwelling();
506 
508  //*getAtmosphericData
514  float *getAtmosphericData(bool spectralMode);
515 
517  //makeScatteringData
521  void makeScatteringData(bool useSun = true, bool includeStars = true);
522 
524  //makeScatteringDataSigSim
528  int makeScatteringDataSigSim(bool useSun = true, bool includeStars = true);
529 
531  //*getAmbientLightSourceData
537  double *getAmbientLightSourceData(unsigned int altitude = 0);
538 
540  //*getDownwellLightSourceData
546  double *getDownwellLightSourceData(unsigned int altitude = 0);
547 
549  //*getUpwellLightSourceData
555  double *getUpwellLightSourceData(unsigned int altitude = 0);
556 
558  //*getDiffuseLightSourceData
564  double *getDiffuseLightSourceData(unsigned int altitude = 0);
565 
567  //*getLightSourceData
572  float *getLightSourceData();
573 
575  //getSunDiskRadiance
581  float *getSunDiskRadiance();
582 
584  //getMoonDiskRadiance
590  float *getMoonDiskRadiance();
591 
593  // getNumberManMadeLights
594  // description: gets the number of man-made light sources
596 
598  //getManMadeLightData
606  float *getManMadeLightData();
607 
609  //getIrradiance
616  void getIrradiance(double altitude, double *downwellIrradiance, double *upwellIrradiance, double *directIrradiance, bool useSun=true, bool includeSky=true, bool includeEarth=true, bool includeAmbient=true);
617 
619  //computeDiffuseIrradiance
624  void computeDiffuseIrradiance(double altitude, bool includeSky, bool includeSunMoon);
625 
626 
628  //computeDiffuseSolarLunar
633  void computeDiffuseSolarLunar(double altitude);
634 
635  void computeDiffuseLightSigSim(double altitude, bool includeSun, bool includeMoon, bool includeSky, bool includeEarth, long startindex, long endindex);
636 
638  //computeDiffuseSky
643  void computeDiffuseSky(double altitude);
644 
646  //setAtmExtinctionScale
651  void setAtmExtinctionScale(float scale);
652 
654  //getAtmExtinctionScale
659  float getAtmExtinctionScale();
660 
662  //setAtmAmbientLightScale
667  void setAtmAmbientLightScale(float scale);
668 
670  //getAtmAmbientLightScale
675  float getAtmAmbientLightScale();
676 
678  //setAtmSkyScale
683  void setAtmSkyScale(float scale);
684 
686  //getAtmSkyScale
691  float getAtmSkyScale();
692 
694  //isDirty
699  bool isDirty();
700 
702  //setDirty
706  void setDirty();
707 
709  //clrDirty
713  void clrDirty();
714 
715 
716  /* ------------------------------------- START MODIFIED BRUNETON & NEYRET ATM LUT CODE ------------------------------ */
717 
719  // ssAtmosphericTable::BNgetUr
720  //
721  // description: Converts alt[m] to unitless Ur index.
722  //
723  // int n increases sampling at low altitude
724  //
725  double BNgetUr(double alt_m, double n);
726 
728  // ssAtmosphericTable::BNgetAlt
729  //
730  // description: Converts unitless Ur parameter to alt[m].
731  //
732  // int n increases sampling at low altitude
733  //
734  double BNgetAlt(double Ur, double n);
735 
736 
738  // ssAtmosphericTable::BNgetUmu
739  //
740  // description: Converts {alt[m], mu[unitless]} to unitless Umu index.
741  //
742  // int n increases sampling away from horizon
743  //
744  double BNgetUmu(double alt_m, double mu, double n);
745 
747  // ssAtmosphericTable::BNgetMu
748  //
749  // description: Converts {alt[m], Umu[unitless]} to Mu[unitless] dot product of zenith and look angle.
750  //
751  // int n increases sampling away from horizon
752  //
753  double BNgetMu(double alt_m, double Umu, double n);
754 
755 
757  // ssAtmosphericTable::BNgetUmus
758  //
759  // description: Converts mu_s[unitless] to unitless Umus index.
760  //
761  //
762  //
763  double BNgetUmus(double mu_s);
764 
766  // ssAtmosphericTable::BNgetMus
767  //
768  // description: Converts unitless Umus parameter to mu_s[unitless] dot product of zenith and sun vec.
769  //
770  //
771  //
772  double BNgetMus(double Umus);
773 
774 #if 0 // These versions assume v = dot(source, view). Shader must correspond!
775 
776  // ssAtmosphericTable::BNgetUv
777  //
778  // description: Converts v[unitless] to unitless Uv index.
779  //
780  // int n increases sampling around v=1
781  //
782  double BNgetUv(double v, double mu, double mus, int n);
783 
785  // ssAtmosphericTable::BNgetV
786  //
787  // description: Converts unitless Uv parameter to v[unitless] dot product of look dir and sun vec.
788  //
789  // int n increases sampling around v=1
790  //
791  double BNgetV(double Uv, double mu, double mus, int n);
792 
793 #else // These versions assume v = dot(source_xy_projection, view_xy_projection). Shader must correspond!
794 
795  // ssAtmosphericTable::BNgetUv
796  //
797  // description: Converts v[unitless] to unitless Uv index.
798  //
799  // int n increases sampling around v=1
800  //
801  double BNgetUv(double v, double n);
802 
804  // ssAtmosphericTable::BNgetV
805  //
806  // description: Converts unitless Uv parameter to v[unitless] dot product of (look dir)_xy and (sun vec)_xy.
807  //
808  // int n increases sampling around v=1
809  //
810  double BNgetV(double Uv, double n);
811 #endif
812 
814  // ssAtmosphericTable::BNgetLook
815  //
816  // description: Computes look direction from {sourcevec, viewdotsource, viewdotup}.
817  //
818  //
819  //
820  VECTOR BNgetLook(VECTOR source, double viewdotsource, double viewdotup);
821 
823  // ssAtmosphericTable::makePolarATMLUTs
824  //
825  // description: Creates the following tables:
826  // polarXmitData indexed by {sensorAlt, objAngle, wavelength_index} = transmission to maxrange.
827  // polarPradData indexed by {sensorAlt, objAngle, wavelength_index} = thermal and MS path radiance to maxrange.
828  // polarScatData indexed by {sensorAlt, objAngle, viewSourceAzimuth, wavelength_index} = solar + lunar single-scattering radiance to maxrange.
829  // polarMradData indexed by {sensorAlt, objAngle, wavelength_index} = solar + lunar multiple-scattering radiance to maxrange.
830  // sourceAngles and Main Source type (sun, moon) are computed from METIN ephemeris.
831  //
832  //
833  void makePolarATMLUTs();
834 
836  //*getXmitData
841  float *getXmitData();
842 
844  //*getPradData
849  float *getPradData();
850 
852  //*getSradData
857  float *getSradData();
858 
860  //*getMradData
865  float *getMradData();
866 
868  //*getMaxOptDepth
873  float *getMaxOptDepth();
874 
876  //setOriginalCode
880  void setOriginalCode(bool onoff);
881 
883  //getOriginalCode
887  bool getOriginalCode();
888 
890  //setMBNATM
894  void setMBNATM(bool onoff);
895 
897  //getMBNATM
901  bool getMBNATM();
902 
903  /* ------------------------------------- END MODIFIED BRUNETON & NEYRET ATM LUT CODE ------------------------------ */
904 
905 
906 private:
907 
908  void FreeArrays();
909 
910 
912  //getLayer
918  int getLayer(double alt);
919 
921  //getAltitudeSample
928  double getAltitudeSample(int layer, int sample);
929 
931  //getDataIndex
938  void getDataIndex(double alt, int layer, unsigned int &index);
939 
941  //getDataIndexFract
949  void getDataIndexFract(double alt, int layer, unsigned int &index, double &fract);
950 
951 
953  //makeSensorAltAtmData
960  void makeSensorAltAtmData(double sensorAlt, float*AtmData, double *polarData);
961 
963  //initAtmosphericData
967  void initAtmosphericData();
968 
970  //convertMetinToSensor
974  void convertMetinToSensor();
975 
977  //getSingleScattering
985  void getSingleScattering(double objAltitude, double *sourceTOA, double *scatData);
986 
988  // ssAtmosphericTable::fillMultipleScattering
989  //
990  // description: get the array of multiple scattering irradiance
991  //
992  // source VECTOR
993  // sourceTOA [W/m2/um]
994  // rangeFactor [unitless]
995  // sourceRange [m]
996  // sourceAlt [m]
997  // downwell, upwell [W/m2/um] : pointers to metin arrays to hold total scattered irradiances for the irradiance LUTs. We add the MS contribution to them here.
998  void fillMultipleScattering(VECTOR source, double *sourceTOA, double rangeFactor, double sourceRange, double sourceAlt, bool includeStars);
999 
1001  //getAmbientScattering
1010  void getAmbientScattering(double objAltitude, VECTOR source, double *objMultiScatData, double *metinAmbientDownwelling, double *metinAmbientUpwelling);
1011 
1017  unsigned int m_numberLayers;
1019  unsigned int m_numSamplesPerLayer;
1021  unsigned int m_numObjectAngles;
1023  unsigned int m_numObjectAltitudes;
1025  unsigned int m_numSensorAltitudes;
1029  unsigned int m_numberScatAngles;
1030 
1032  double m_maxAltitude; // [m]
1034  double m_maxRange; // [m]
1035 
1037  float *m_spectralAtmosphericData; // comp0 = [1/m^(1/2)] the sqrt of density, comp1 = [unitless] scaled pathrad, comp2 = [unitless] scaled scatrad difference, comp3 = [unitless] log-scaled scatrad midvalue.
1039  ssBuffer<float> m_passbandAtmosphericData; // // comp0 = [1/m^(1/2)] the sqrt of density, comp1 = [unitless] scaled pathrad, comp2 = [unitless] scaled scatrad difference, comp3 = [unitless] log-scaled scatrad midvalue.
1042  double *m_ambientLightSource; // [W/cm2/sr] Sum of downwell & upwell diffuse. index < m_numSensorWaveLengths * m_numObjectAltitudes
1043  double *m_downwellLightSource; // [W/cm2/sr] Downwelling diffuse. index < m_numSensorWaveLengths * m_numObjectAltitudes
1044  double *m_upwellLightSource; // [W/cm2/sr] Upwelling diffuse. index < m_numSensorWaveLengths * m_numObjectAltitudes
1045  double *m_diffuseLightSource; // [W/cm2/sr] Really Direct, not diffuse. index < m_numSensorWaveLengths * m_numObjectAltitudes
1046 
1048  ssBuffer<float> m_lightSourceData; // [W/cm2/sr] : comp0 = [unitless] scaled ambient radiance, comp1 = [unitless] scaled directional diffuse radiance, comp2 = scaled directional radiance, comp3 = scaled upwelling earthshine radiance, comp4 = [unitless] scaled downwelling radiance
1049 
1052 
1053 /* ------START MODIFIED BRUNETON & NEYRET ATM LUT ----*/
1054  float *m_xmitData; // [unitless] Modified B&N transmission : index = m_numSensorWaveLengths * (objectAngleIndex + m_numObjectAngles * sensorAltIndex) + sensorWavelengthIndex;
1055  float *m_pradData; // [unitless] Modified B&N pathrad+MS : index = m_numSensorWaveLengths * (objectAngleIndex + m_numObjectAngles * sensorAltIndex) + sensorWavelengthIndex;
1056  float *m_sradData; // [unitless] Modified B&N singlescatrad : index = m_numSensorWaveLengths * (scatAngleIndex + m_numberScatAngles * (objectAngleIndex + m_numObjectAngles * sensorAltIndex)) + sensorWavelengthIndex;
1057  float *m_mradData; // [unitless] Modified B&N singlescatrad : index = m_numSensorWaveLengths * (scatAngleIndex + m_numberScatAngles * (objectAngleIndex + m_numObjectAngles * sensorAltIndex)) + sensorWavelengthIndex;
1058  float *m_maxOptDepth; // [unitless] Max optical depth encountered while building the ATM LUT. : index = sensorWavelengthIndex.
1059 /* ------END MODIFIED BRUNETON & NEYRET ATM LUT ----*/
1060 
1062  double *m_objAlt;
1063  double *m_sensAlt;
1064  double *m_range;
1065 
1067  bool m_useSun;
1071  double m_sensorAltitude; // [m]
1083  double m_maxRadiance; // [W/cm2/sr] according to ssSensor::recomputeMinMaxRadiance()
1086 
1091 
1093  double *m_metinTrans; // [unitless]
1094  double *m_metinAbsorbTrans; // [unitless]
1095  double *m_metinPathRad; // [W/cm2/sr/um]
1096  double *m_metinScatter; // [W/cm2/sr/um] index < m_numMetinWavelengths * m_numberScatAngles
1097  double *m_metinMultiScat; // [W/cm2/sr/um]
1098 
1099  // sensor-specific atmospherics : index < m_numSensorWavelengths
1100  double *m_sensorTrans; // [unitless]
1101  double *m_sensorAbsorbTrans; // [unitless]
1102  double *m_sensorPathRad; // [W/cm2/sr/um]
1103  double *m_sensorScatter; // [W/cm2/sr/um] index < m_numSensorWavelengths * m_numberScatAngles
1104  double *m_sensorMultiScat; // [W/cm2/sr/um]
1105 
1107  double *m_altitude; // [m] according to ssAtmosphericTable::initializeAtm
1109  double *m_scatAngles; // [unitless cosine]
1111  double *m_objectScatData; // [W/m3/sr/um] index = scatangleindex + (m_numberScatAngles * (wavelengthindex + m_numMetinWaveLengths * objaltindex))
1113  double *m_objAmbientUpwelling; // [W/m2/um]
1115  double *m_objAmbientDownwelling; // [W/m2/um] according to ssAtmosphericTable::makeScatteringData
1117  ssBuffer<float> m_mmLightData; // [unitless] scaled sensor spectral radiance
1119  float *m_sunDiskData; // [unitless] scaled sensor spectral radiance
1121  float *m_moonDiskData; // [unitless] scaled sensor spectral radiance
1122 
1128  double m_ax; // [um]
1130  double m_bx; // [um]
1131 
1133  float m_atmExtinctionScale; // [unitless]
1134 
1136  float m_atmAmbientLightScale; // [unitless] according to getAmbientScattering
1137 
1139  float m_atmSkyScale; // [unitless]
1140 
1142  double m_fogRatio; // [unitless]
1143 
1144  // flag to indicate that incremental paths are being traversed.
1146 
1148  bool m_dirty;
1149 
1150 
1151  bool m_OriginalCode; // Reproduces code as of Sept. 2012
1152  bool m_MBNATM; // if(m_OriginalCode==false), this flag turns on the Modified B&N atmospheric LUT processing.
1153 };
1154 
1155 
1156 #endif
1157 


Copyright © 2005-2021 MAK Technologies. All Rights Reserved (www.mak.com)