public bool Evaluate(AgAsLightReflectionResultEval ResultEval)
        {
            try
            {
                if (m_MsgCntr % m_MsgInterval == 0)
                {
                    Debug.WriteLine("--> Entered", m_Name + ".Evaluate( " + m_MsgCntr + " )");
                }

                if (m_Enabled)
                {
                    // Get value of Cr from STK/ODTK

                    double cr = ResultEval.ParameterValue(m_CrIndex);

                    if (m_RefFrame == "Body")
                    {
                        m_Enabled = setSphericalReflectanceInBody(ResultEval, cr);
                    }
                    else
                    {
                        m_Enabled = setSphericalReflectanceUsingFrame(ResultEval, cr, (AgEUtFrame)m_refFrameNames.IndexOf(m_RefFrame));
                    }
                }

                return(m_Enabled);
            }
            catch (Exception ex)
            {
                m_Enabled = false;

                Message(AgEUtLogMsgType.eUtLogMsgAlarm, m_Name + ".Evaluate(): Exception Message( " + ex.Message + " )");
                Message(AgEUtLogMsgType.eUtLogMsgAlarm, m_Name + ".Evaluate(): Exception StackTr( " + ex.StackTrace + " )");

                Debug.WriteLine("Exception Message( " + ex.Message + " )", m_Name + ".Evaluate()");
                Debug.WriteLine("Exception StackTr( " + ex.StackTrace + " )", m_Name + ".Evaluate()");
            }
            finally
            {
                if (m_MsgCntr % m_MsgInterval == 0)
                {
                    Debug.WriteLine("<-- Exited", m_Name + ".Evaluate()");
                }
            }

            return(m_Enabled);
        }
        private bool setSphericalReflectanceUsingFrame(AgAsLightReflectionResultEval ResultEval, double cr, AgEUtFrame frame)
        {
            double reflectanceMag;

            Tuple3 incidentVec = new Tuple3();

            ResultEval.IncidentDirection((AgEUtFrame)frame, ref incidentVec.x, ref incidentVec.y, ref incidentVec.z);

            // reflectance is positive along the incident direction

            incidentVec.scaleBy(m_SRPArea);

            if (m_CrIndex > -1)
            {
                ResultEval.SetReflectanceParamPartials(m_CrIndex, frame, incidentVec.x, incidentVec.y, incidentVec.z);
            }

            incidentVec.scaleBy(cr);

            ResultEval.SetReflectance((AgEUtFrame)frame, incidentVec.x, incidentVec.y, incidentVec.z);

            double[,] incidentDirPosPartials, posPartials;

            incidentDirPosPartials = new double[3, 3];
            posPartials            = new double[3, 3];

            ResultEval.IncidentDirectionCompPosPartials((AgEUtFrame)frame,
                                                        ref incidentDirPosPartials[0, 0], ref incidentDirPosPartials[0, 1], ref incidentDirPosPartials[0, 2],
                                                        ref incidentDirPosPartials[1, 0], ref incidentDirPosPartials[1, 1], ref incidentDirPosPartials[1, 2],
                                                        ref incidentDirPosPartials[2, 0], ref incidentDirPosPartials[2, 1], ref incidentDirPosPartials[2, 2]);

            reflectanceMag = cr * m_SRPArea;

            posPartials[0, 0] = reflectanceMag * incidentDirPosPartials[0, 0];
            posPartials[0, 1] = reflectanceMag * incidentDirPosPartials[0, 1];
            posPartials[0, 2] = reflectanceMag * incidentDirPosPartials[0, 2];

            posPartials[1, 0] = reflectanceMag * incidentDirPosPartials[1, 0];
            posPartials[1, 1] = reflectanceMag * incidentDirPosPartials[1, 1];
            posPartials[1, 2] = reflectanceMag * incidentDirPosPartials[1, 2];

            posPartials[2, 0] = reflectanceMag * incidentDirPosPartials[2, 0];
            posPartials[2, 1] = reflectanceMag * incidentDirPosPartials[2, 1];
            posPartials[2, 2] = reflectanceMag * incidentDirPosPartials[2, 2];

            ResultEval.SetReflectanceCompPosPartials((AgEUtFrame)frame,
                                                     posPartials[0, 0], posPartials[0, 1], posPartials[0, 2],
                                                     posPartials[1, 0], posPartials[1, 1], posPartials[1, 2],
                                                     posPartials[2, 0], posPartials[2, 1], posPartials[2, 2]);

            // VelPartials are zero in inertial - we'll set this anyway to test it

            bool doVelPartials = true;

            if (doVelPartials)
            {
                double[,] incidentDirVelPartials, velPartials;

                incidentDirVelPartials = new double[3, 3];
                velPartials            = new double[3, 3];;

                ResultEval.IncidentDirectionCompVelPartials((AgEUtFrame)frame,
                                                            ref incidentDirVelPartials[0, 0], ref incidentDirVelPartials[0, 1], ref incidentDirVelPartials[0, 2],
                                                            ref incidentDirVelPartials[1, 0], ref incidentDirVelPartials[1, 1], ref incidentDirVelPartials[1, 2],
                                                            ref incidentDirVelPartials[2, 0], ref incidentDirVelPartials[2, 1], ref incidentDirVelPartials[2, 2]);

                velPartials[0, 0] = reflectanceMag * incidentDirVelPartials[0, 0];
                velPartials[0, 1] = reflectanceMag * incidentDirVelPartials[0, 1];
                velPartials[0, 2] = reflectanceMag * incidentDirVelPartials[0, 2];

                velPartials[1, 0] = reflectanceMag * incidentDirVelPartials[1, 0];
                velPartials[1, 1] = reflectanceMag * incidentDirVelPartials[1, 1];
                velPartials[1, 2] = reflectanceMag * incidentDirVelPartials[1, 2];

                velPartials[2, 0] = reflectanceMag * incidentDirVelPartials[2, 0];
                velPartials[2, 1] = reflectanceMag * incidentDirVelPartials[2, 1];
                velPartials[2, 2] = reflectanceMag * incidentDirVelPartials[2, 2];

                ResultEval.SetReflectanceCompVelPartials((AgEUtFrame)frame,
                                                         velPartials[0, 0], velPartials[0, 1], velPartials[0, 2],
                                                         velPartials[1, 0], velPartials[1, 1], velPartials[1, 2],
                                                         velPartials[2, 0], velPartials[2, 1], velPartials[2, 2]);
            }

            Debug.WriteLine(m_MsgCntr + " " + cr + " : frame = Body : (" + incidentVec.x + "," + incidentVec.y + "," + incidentVec.z + ")");

            return(true);
        }