9#include "SpecialPixel.h" 
   10#include "IException.h" 
   12#define MIN(x,y) (((x) < (y)) ? (x) : (y)) 
   13#define MAX(x,y) (((x) > (y)) ? (x) : (y)) 
   16  MoonAlbedo::MoonAlbedo(Pvl &pvl, PhotoModel &pmodel) :
 
   17    NormModel(pvl, pmodel) {
 
   18    PvlGroup &algo = pvl.findObject(
"NormalizationModel")
 
   19                     .findGroup(
"Algorithm", Pvl::Traverse);
 
   26    SetNormWl(p_normWavelength);
 
   33    if(algo.hasKeyword(
"D")) {
 
   37    if(algo.hasKeyword(
"Wl")) {
 
   38      SetNormWl(algo[
"Wl"]);
 
   41    if(algo.hasKeyword(
"E")) {
 
   46        p_normE = -0.3575 * p_normWl - 0.0607;
 
   53    if(algo.hasKeyword(
"F")) {
 
   57    if(algo.hasKeyword(
"G2")) {
 
   58      SetNormG2(algo[
"G2"]);
 
   62        p_normG2 = -0.9585 * p_normWl + 0.98;
 
   69    if(algo.hasKeyword(
"Xmul")) {
 
   70      SetNormXmul(algo[
"Xmul"]);
 
   73    if(algo.hasKeyword(
"H")) {
 
   77    if(algo.hasKeyword(
"Bsh1")) {
 
   78      SetNormBsh1(algo[
"Bsh1"]);
 
   81      p_normBsh1 = 19.89 - 59.58 * p_normWl + 59.86 * pow(p_normWl, 2) -
 
   82                   20.09 * pow(p_normWl, 3);
 
   83      if(p_normBsh1 < 0.0) {
 
   88    if(algo.hasKeyword(
"Xb1")) {
 
   89      SetNormXb1(algo[
"Xb1"]);
 
   92    if(algo.hasKeyword(
"Xb2")) {
 
   93      SetNormXb2(algo[
"Xb2"]);
 
   98    p_normF1 = 1.0 - p_normF;
 
   99    double g1 = p_normD * 0.1 + p_normE;
 
  100    double g1sq = g1 * g1;
 
  101    p_normG2sq = p_normG2 * p_normG2;
 
  102    double c30 = cos(30.0 * 
Isis::PI / 180.0);
 
  103    if(1.0 + g1sq + 2.0 * g1 *c30 <= 0.0) {
 
  104      std::string msg = 
"Error while initializing Buratti function";
 
  105      throw IException(IException::Unknown, msg, _FILEINFO_);
 
  107    double pg130 = p_normF1 * (1.0 - g1sq) / (pow((1.0 + g1sq + 2.0 * g1 * c30), 1.5));
 
  108    if(1.0 + p_normG2sq + 2.0 * p_normG2 *c30 <= 0.0) {
 
  109      std::string msg = 
"Error while initializing Buratti function";
 
  110      throw IException(IException::Unknown, msg, _FILEINFO_);
 
  112    double pg230 = p_normF * (1.0 - p_normG2sq) / (pow((1.0 + p_normG2sq + 2.0 * p_normG2 * c30), 1.5));
 
  113    if(p_normBsh1 < 0.0) p_normBsh1 = 0.0;
 
  114    if(1.0 + tan(15.0 * 
Isis::PI / 180.0) / p_normH == 0.0) {
 
  115      std::string msg = 
"Error while initializing Buratti function";
 
  116      throw IException(IException::Unknown, msg, _FILEINFO_);
 
  118    double bshad30 = 1.0 + p_normBsh1 / (1.0 + tan(15.0 * 
Isis::PI / 180.0) / p_normH);
 
  119    p_normPg30 = (pg130 + pg230) * bshad30;
 
  120    p_normBc1 = p_normXb1 + p_normXb2 * p_normWl;
 
  121    p_normFbc3 = 1.0 + p_normBc1 * 2.0;
 
  122    if(p_normFbc3 == 0.0) {
 
  123      std::string msg = 
"Error while initializing Buratti function";
 
  124      throw IException(IException::Unknown, msg, _FILEINFO_);
 
  126    p_normC3 = cos(2.0 * 
Isis::PI / 180.0);
 
  127    if(1.0 + p_normG2sq + 2.0 * p_normG2 *p_normC3 <= 0.0) {
 
  128      std::string msg = 
"Error while initializing Buratti function";
 
  129      throw IException(IException::Unknown, msg, _FILEINFO_);
 
  131    p_normPg32 = p_normF * (1.0 - p_normG2sq) / (pow((1.0 + p_normG2sq + 2.0 * p_normG2 * p_normC3), 1.5));
 
  132    if(1.0 + tan(
Isis::PI / 180.0) / p_normH == 0.0) {
 
  133      std::string msg = 
"Error while initializing Buratti function";
 
  134      throw IException(IException::Unknown, msg, _FILEINFO_);
 
  136    p_normBshad3 = 1.0 + p_normBsh1 / (1.0 + tan(
Isis::PI / 180.0) / p_normH);
 
  139  void MoonAlbedo::NormModelAlgorithm(
double phase, 
double incidence, 
double emission,
 
  140                                      double demincidence, 
double dememission, 
double dn,
 
  141                                      double &albedo, 
double &mult, 
double &base) {
 
  155    a = GetPhotoModel()->CalcSurfAlbedo(phase, demincidence, dememission);
 
  158      cosa = cos(phase * 
Isis::PI / 180.0);
 
  159      if(1.0 + p_normG2sq + 2.0 * p_normG2 *cosa <= 0.0) {
 
  163      pg2 = p_normF * (1.0 - p_normG2sq) / (pow((1.0 + p_normG2sq + 2.0 * p_normG2 * cosa), 1.5));
 
  164      if(1.0 + tan(phase * .5 * 
Isis::PI / 180.0) / p_normH == 0.0) {
 
  168      bshad = 1.0 + p_normBsh1 / (1.0 + tan(phase * .5 * 
Isis::PI / 180.0) / p_normH);
 
  172      for(
int i = 0; i < 6; i++) {
 
  173        g1 = p_normD * albedo + p_normE;
 
  175        if(1.0 + g1sq + 2.0 * g1 *cosa <= 0.0) {
 
  179        pg1 = p_normF1 * (1.0 - g1sq) / (pow((1.0 + g1sq + 2.0 * g1 * cosa), 1.5));
 
  180        pg = (pg1 + pg2) * bshad;
 
  182          fbc = 1.0 + p_normBc1 * phase;
 
  183          if(1.0 + g1sq + 2.0 * g1 *p_normC3 <= 0.0) {
 
  187          pg31 = p_normF1 * (1.0 - g1sq) / (pow((1.0 + g1sq + 2.0 * g1 * p_normC3), 1.5));
 
  188          pg3 = (pg31 + p_normPg32) * p_normBshad3;
 
  189          pg = fbc * (pg3 / p_normFbc3);
 
  195        albedo = r * a * p_normPg30 / pg;
 
  211  void MoonAlbedo::SetNormD(
const double d) {
 
 
  223  void MoonAlbedo::SetNormWl(
const double wl) {
 
 
  234  void MoonAlbedo::SetNormE(
const double e) {
 
 
  245  void MoonAlbedo::SetNormF(
const double f) {
 
 
  256  void MoonAlbedo::SetNormG2(
const double g2) {
 
 
  267  void MoonAlbedo::SetNormXmul(
const double xmul) {
 
 
  278  void MoonAlbedo::SetNormH(
const double h) {
 
  280      std::string msg = 
"Invalid value of normalization h [" +
 
  282      throw IException(IException::User, msg, _FILEINFO_);
 
 
  295  void MoonAlbedo::SetNormBsh1(
const double bsh1) {
 
  297      std::string msg = 
"Invalid value of normalization bsh1 [" +
 
  299      throw IException(IException::User, msg, _FILEINFO_);
 
 
  312  void MoonAlbedo::SetNormXb1(
const double xb1) {
 
 
  323  void MoonAlbedo::SetNormXb2(
const double xb2) {
 
 
Adds specific functionality to C++ strings.
 
Albedo dependent phase function normalization for the Moon.
 
Container for cube-like labels.
 
This is free and unencumbered software released into the public domain.
 
const double PI
The mathematical constant PI.