//******************************************************************************
//** SCATMECH: Polarized Light Scattering C++ Class Library
//**
//** File: subbobvlieg.h
//**
//** Thomas A. Germer
//** Sensor Science Division, National Institute of Standards and Technology
//** 100 Bureau Dr. Stop 8443; Gaithersburg, MD 20899-8443
//** Phone: (301) 975-2876
//** Email: thomas.germer@nist.gov
//**
//******************************************************************************
#ifndef SCATMECH_SUBBOBVLIEG_H
#define SCATMECH_SUBBOBVLIEG_H

#include "bobvlieg.h"
#include "axipart.h"

namespace SCATMECH {

    class Subsurface_Bobbert_Vlieger_BRDF_Model : public Local_BRDF_Model
    {
        public:
            DECLARE_MODEL();
            DECLARE_PARAMETER(dielectric_function,sphere);
            DECLARE_PARAMETER(double,radius);
            DECLARE_PARAMETER(StackModel_Ptr,spherecoat);
            DECLARE_PARAMETER(StackModel_Ptr,stack);
            DECLARE_PARAMETER(double,delta);
            DECLARE_PARAMETER(int,lmax);
            DECLARE_PARAMETER(int,order);
            DECLARE_PARAMETER(int,Norm_Inc_Approx);
            DECLARE_PARAMETER(int,improve);

        public:

            COMPLEX PartialExtinctionS(double theta) {
                SETUP();
                return model.PartialExtinctionS(theta);
            }

            COMPLEX PartialExtinctionP(double theta) {
                SETUP();
                return model.PartialExtinctionP(theta);
            }

        protected:
            void setup();
            JonesMatrix jonesDSC();

        private:
            Bobbert_Vlieger_BRDF_Model model;
    };

    class Subsurface_Axisymmetric_Particle_BRDF_Model : public Local_BRDF_Model
    {
        public :
            DECLARE_MODEL();
            DECLARE_PARAMETER(Axisymmetric_Shape_Ptr,Shape);
            DECLARE_PARAMETER(dielectric_function,particle);
            DECLARE_PARAMETER(StackModel_Ptr,stack);
            DECLARE_PARAMETER(double,delta);
            DECLARE_PARAMETER(int,lmax);
            DECLARE_PARAMETER(int,mmax);
            DECLARE_PARAMETER(int,order);
            DECLARE_PARAMETER(int,Norm_Inc_Approx);
            DECLARE_PARAMETER(int,improve);

        public:
            COMPLEX PartialExtinctionS(double theta) {
                SETUP();
                return model.PartialExtinctionS(theta);
            }

            COMPLEX PartialExtinctionP(double theta) {
                SETUP();
                return model.PartialExtinctionP(theta);
            }

        protected:
            void setup();
            JonesMatrix jonesDSC();

        private:
            Axisymmetric_Particle_BRDF_Model model;
    };
}

#endif
