8 #include "MoonAlbedo.h" 
    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")
 
   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";
 
  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";
 
  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";
 
  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";
 
  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";
 
  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";
 
  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;
 
  280       std::string msg = 
"Invalid value of normalization h [" +
 
  297       std::string msg = 
"Invalid value of normalization bsh1 [" +