9#include "SpecialPixel.h" 
   10#include "IException.h" 
   13  Mixed::Mixed(Pvl &pvl, PhotoModel &pmodel) : NormModel(pvl, pmodel) {
 
   14    PvlGroup &algorithm = pvl.findObject(
"NormalizationModel").findGroup(
"Algorithm", Pvl::Traverse);
 
   27    if(algorithm.hasKeyword(
"Pharef")) {
 
   28      SetNormPharef(algorithm[
"Pharef"]);
 
   31    if(algorithm.hasKeyword(
"Incref")) {
 
   32      SetNormIncref(algorithm[
"Incref"]);
 
   35    if(algorithm.hasKeyword(
"Emaref")) {
 
   36      SetNormEmaref(algorithm[
"Emaref"]);
 
   39    if(algorithm.hasKeyword(
"Incmat")) {
 
   40      SetNormIncmat(algorithm[
"Incmat"]);
 
   43    if(algorithm.hasKeyword(
"Phamat")) {
 
   44      SetNormPhamat(algorithm[
"Phamat"]);
 
   46      p_normPhamat = p_normIncmat;
 
   49    if(algorithm.hasKeyword(
"Emamat")) {
 
   50      SetNormEmamat(algorithm[
"Emamat"]);
 
   53    if(algorithm.hasKeyword(
"Thresh")) {
 
   54      SetNormThresh(algorithm[
"Thresh"]);
 
   57    if(algorithm.hasKeyword(
"Albedo")) {
 
   58      SetNormAlbedo(algorithm[
"Albedo"]);
 
   64    GetPhotoModel()->SetStandardConditions(
true);
 
   65    p_psurfref = GetPhotoModel()->CalcSurfAlbedo(p_normPharef, p_normIncref, p_normEmaref);
 
   66    double pprimeref = GetPhotoModel()->PhtTopder(p_normPharef, p_normIncref, p_normEmaref);
 
   68    if(p_psurfref == 0.0) {
 
   69      std::string err = 
"Divide by zero error";
 
   70      throw IException(IException::Unknown, err, _FILEINFO_);
 
   73      p_rhobar = p_normAlbedo / p_psurfref;
 
   77    p_psurfmatch = GetPhotoModel()->CalcSurfAlbedo(p_normPhamat, p_normIncmat, p_normEmamat);
 
   78    p_pprimematch = GetPhotoModel()->PhtTopder(p_normPhamat, p_normIncmat, p_normEmamat);
 
   82    double arg = pow(p_psurfref, 2.0) + pow(p_psurfmatch * pprimeref / std::max(1.0e-30, p_pprimematch), 2.0);
 
   83    if((arg < 1.0e-10) || (arg > 1.0e10)) {
 
   84      std::string err = 
"Bad reference state encountered";
 
   85      throw IException(IException::Unknown, err, _FILEINFO_);
 
   89    GetPhotoModel()->SetStandardConditions(
false);
 
   92  void Mixed::NormModelAlgorithm(
double phase, 
double incidence, 
double emission,
 
   93                                 double demincidence, 
double dememission, 
double dn,
 
   94                                 double &albedo, 
double &mult, 
double &base) {
 
   99    static double old_phase = -9999;
 
  100    static double old_incidence = -9999;
 
  101    static double old_emission = -9999;
 
  102    static double old_demincidence = -9999;
 
  103    static double old_dememission = -9999;
 
  105    if (old_phase != phase || old_incidence != incidence || old_emission != emission ||
 
  106        old_demincidence != demincidence || old_dememission != dememission) {
 
  109      psurf = GetPhotoModel()->CalcSurfAlbedo(phase, demincidence, dememission);
 
  110      pprime = GetPhotoModel()->PhtTopder(phase, demincidence, dememission);
 
  111      double arg = pow(psurf, 2.0) + pow(p_psurfmatch * pprime / std::max(1.0e-30, p_pprimematch), 2.0);
 
  112      aden = sqrt(std::max(1.0e-30, arg));
 
  115      old_incidence = incidence;
 
  116      old_emission = emission;
 
  117      old_demincidence = demincidence;
 
  118      old_dememission = dememission;
 
  125    if(aden > p_anum * p_normThresh) {
 
  129      albedo = dn * p_anum / aden + p_rhobar * (p_psurfref - p_anum / aden * psurf);
 
  142  void Mixed::SetNormPharef(
const double pharef) {
 
  143    if(pharef < 0.0 || pharef >= 180.0) {
 
  144      std::string msg = 
"Invalid value of normalization pharef [" +
 
  146      throw IException(IException::User, msg, _FILEINFO_);
 
  149    p_normPharef = pharef;
 
 
  161  void Mixed::SetNormIncref(
const double incref) {
 
  162    if(incref < 0.0 || incref >= 90.0) {
 
  163      std::string msg = 
"Invalid value of normalization incref [" +
 
  165      throw IException(IException::User, msg, _FILEINFO_);
 
  168    p_normIncref = incref;
 
 
  180  void Mixed::SetNormEmaref(
const double emaref) {
 
  181    if(emaref < 0.0 || emaref >= 90.0) {
 
  182      std::string msg = 
"Invalid value of normalization emaref [" +
 
  184      throw IException(IException::User, msg, _FILEINFO_);
 
  187    p_normEmaref = emaref;
 
 
  200  void Mixed::SetNormPhamat(
const double phamat) {
 
  201    if(phamat < 0.0 || phamat >= 180.0) {
 
  202      std::string msg = 
"Invalid value of normalization phamat [" +
 
  204      throw IException(IException::User, msg, _FILEINFO_);
 
  207    p_normPhamat = phamat;
 
 
  220  void Mixed::SetNormIncmat(
const double incmat) {
 
  221    if(incmat < 0.0 || incmat >= 90.0) {
 
  222      std::string msg = 
"Invalid value of normalization incmat [" +
 
  224      throw IException(IException::User, msg, _FILEINFO_);
 
  227    p_normIncmat = incmat;
 
 
  240  void Mixed::SetNormEmamat(
const double emamat) {
 
  241    if(emamat < 0.0 || emamat >= 90.0) {
 
  242      std::string msg = 
"Invalid value of normalization emamat [" +
 
  244      throw IException(IException::User, msg, _FILEINFO_);
 
  247    p_normEmamat = emamat;
 
 
  256  void Mixed::SetNormAlbedo(
const double albedo) {
 
  257    p_normAlbedo = albedo;
 
 
  274  void Mixed::SetNormThresh(
const double thresh) {
 
  275    p_normThresh = thresh;
 
 
Adds specific functionality to C++ strings.
Mixed albedo/topo normalization without atmosphere.
Container for cube-like labels.
This is free and unencumbered software released into the public domain.