Posmag.hh 7.6 KB
/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

/* 
 * File:   Posmag.hh
 * Author: hacene
 *
 * Created on July 21, 2020, 3:42 PM
 */

#ifndef POSMAG_HH
#define POSMAG_HH
#include "MaglibWarpper.hh"

#include "Parameter.hh"
#include "ParamData.hh"
#include "DataTypeMath.hh"
#include "Operation.hh"
#include "SpiceKernelMgr.hh"
#include <vector>

namespace AMDA {
    namespace Parameters {

        template<typename DataType, class TOutputParamData>
        class Posmag : public Operation {
        public:

            /**
             * @brief Constructor.
             * @details Create the ParamData type of the input ParamData.
             */
            Posmag(Process& pProcess, ParamDataSpec<vector<DataType> >&paramInput, int isatex, int magout) :
            Operation(pProcess),
            _paramInput(paramInput),
            _paramOutput(new TOutputParamData()),
            _isatex(isatex),
            _magout(magout) {
                _paramDataOutput = _paramOutput;
            };

            /**
             * @brief Constructor.
             * @details Create the ParamData type of the input ParamData.
             */
            Posmag(Process& pProcess, ParamDataSpec<vector<DataType> >&paramInput) :
            Operation(pProcess),
            _paramInput(paramInput),
            _paramOutput(new TOutputParamData()),
            _isatex(0),
            _magout(2) {
                _paramDataOutput = _paramOutput;
            }

            virtual ~Posmag() {
            }

            /**
             * @overload Operation::write(ParamDataIndexInfo &pParamDataIndexInfo)
             */
            void write(ParamDataIndexInfo &pParamDataIndexInfo) {
                for (unsigned int _index = pParamDataIndexInfo._startIndex;
                        _index < pParamDataIndexInfo._startIndex + pParamDataIndexInfo._nbDataToProcess;
                        ++_index) {

                    vector<DataType> in = _paramInput.getDataList()[_index];
                    double crtTime = _paramInput.getTime(_index);
                    ime_t timestamp = crtTime;
                    struct tm *tmp;
                    tmp = gmtime(&timestamp);
                    float i_rrmag = in[0];
                    float i_thetr = in[1];
                    float i_phir = in[2];
                    /*
                    PAR xgsm   (O) : coordonnee solaire magnetospherique en x (rayons terrestres)
                    PAR ygsm   (O) : coordonnee solaire magnetospherique en y (rayons terrestres)
                    PAR zgsm   (O) : coordonnee solaire magnetospherique en z (rayons terrestres)

                    PAR xgse   (O) : coordonnee solaire ecliptique en x (rayons terrestres)
                    PAR ygse   (O) : coordonnee solaire ecliptique en y (rayons terrestres)
                    PAR zgse   (O) : coordonnee solaire ecliptique en z (rayons terrestres)

                    PAR tgl    (O) : temps geomagnetique local du satellite
                                   : (heures fractionnaires)
                    PAR flg    (O) : parametre L de Galperin
                    PAR xlamb  (O) : latitude invariante (radians)

                    PAR tglc   (O) : temps geomagnetique local du point conjugue
                                   : (heures fractionnaires)

                    PAR hsl    (O) : hauteur de l'ombre (kilometres)

                    PAR clatgm (O) : latitude geomagnetique  (radians)
                    PAR clongm (O) : longitude geomagnetique (radians)
                    PAR iposmg (O) : tableau (dim=15) des indicateurs de positions

                    PAR ier    (O) : code de retour
                     */

                    float xgsm, ygsm, zgsm, xgse, ygse, zgse, tgl,
                            flg, xlambr, tglc, hsl, fclatgmr, clongmr,
                            tgl, flg, xlambr, tglc, hsl, clatgmr, clongmr, xlamb, clatgm, clongm;
                    int ifail;
                    int iposmg[15];

                    /**
                                     static void getPosmag(int iyear, int imonth, int iday, int ihour, int imin, int isec, float* rrmag, float* thetr, float* phir, 
                        int* isatex, int* magout, float* xgsm, float*  ygsm, float* zgsm, float* xgse, float* ygse, float* zgse, float* tgl, 
                        float* flg, float* xlambr, float* tglc, float* hsl, float* clatgmr, float* clongmr, float * iposmg[15], int* ifai) 
                     */

                    maglib::maglibWarpper::getPosmag(1900 + tmp->tm_year, 1 + tmp->tm_yday, tmp->tm_hour,
                            tmp->tm_min, tmp->tm_sec, i_rrmag, i_thetr, i_phir, _isatex, _magout, xgsm, ygsm, zgsm, xgse, ygse, zgse, tgl,
                            flg, xlambr, tglc, hsl, fclatgmr, clongmr, iposmg, ifail);
                    
                    DataType tgl_res = (DataType) tgl;
                    DataType xlamb_res = (DataType) xlamb;
                    DataType flg_res = (DataType) flg;
                     _paramOutput->pushTime(crtTime);
                    pushData(tgl_res, xlamb_res, flg_res);
                }


            }
            virtual void pushData(DataType tgl, DataType xlamb, DataType flg) = 0;

        protected:
            int _isatex;
            int _magout;
            private:
                ParamDataSpec<std::vector<DataType> >& _paramInput;
                ParamDataSpec<DataType>* _paramOutput;
        };
       
        /**
         * Ecriture de temps geomagnetique local du satellite (heure fractionnée)
         */
        template<typename DataType>
        class MLT : public Posmag<DataType, ParamDataSpec < DataType > >{
            
               MLT(Process& pProcess, ParamDataSpec<vector<DataType> >& paramInput, int isatex, int magout):
                Posmag<DataType, ParamDataSpec < DataType > > :: Posmag(pProcess, paramInput, isatex, magout){
                }
            
            void pushData(DataType tgl, DataType /*xlamb*/, DataType /*flg*/){
                
                Posmag<DataType, ParamDataSpec < DataType > > :: _paramDataOutput.getDataList().push_back(tgl);
                }
        };
        
                /**
         * Ecriture de invariant latitude 
         */
        template<typename DataType>
        class InvLat : public Posmag<DataType, ParamDataSpec < DataType > >{
            
               InvLat(Process& pProcess, ParamDataSpec<vector<DataType> >& paramInput, int isatex, int magout):
                Posmag<DataType, ParamDataSpec < DataType > > :: Posmag(pProcess, paramInput, isatex, magout){
                }
            
            void pushData(DataType /*tgl*/, DataType xlamb, DataType /*flg*/){
                
                Posmag<DataType, ParamDataSpec < DataType > > :: _paramDataOutput.getDataList().push_back(xlamb);
                }
        };
        
                        /**
         * Ecriture du parametre L
         */
        template<typename DataType>
        class Lparam : public Posmag<DataType, ParamDataSpec < DataType > >{
            
               Lparam(Process& pProcess, ParamDataSpec<vector<DataType> >& paramInput, int isatex, int magout):
                Posmag<DataType, ParamDataSpec < DataType > > :: Posmag(pProcess, paramInput, isatex, magout){
                }
            
            void pushData(DataType /*tgl*/, DataType /*xlamb*/, DataType flg){
                
                Posmag<DataType, ParamDataSpec < DataType > > :: _paramDataOutput.getDataList().push_back(flg);
                }
        };
        
    }
    
}


#endif /* POSMAG_HH */