KT17.hh 5.17 KB
/*
 * File:   KT17.hh
 * Author: Furkan - AKKA I&S
 *
 * Created on January 19, 2022, 4:14 PM
 */
#ifndef KT17_HH
#define KT17_HH

#include "libkt/libkt.h" // If we name it this way

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

using namespace std;

namespace AMDA
{
    namespace Parameters
    {
        template <typename DataType, class TOutputParamData>
        class KT17 : public Operation
        {
        public:
            KT17(Process &pProcess, ParamDataSpec<vector<DataType>> &paramInput, string outputCoord)
                : Operation(pProcess), _paramInput(paramInput), _outputCoord(outputCoord),
                  _paramOutput(new TOutputParamData())
            {
                _paramDataOutput = _paramOutput;
            }

            virtual ~KT17()
            {
            }
            void write(ParamDataIndexInfo &pParamDataIndexInfo)
            {
                for (unsigned int _index = pParamDataIndexInfo._startIndex;
                     _index < pParamDataIndexInfo._startIndex + pParamDataIndexInfo._nbDataToProcess;
                     ++_index)
                {
                    vector<DataType> in = _paramInput.getDataList()[_index];
                    if (in[0] == 0)
                        in[0] = 1e-31;
                    double crtTime = _paramInput.getTime(_index);
                    vector<DataType> outputBxyz, outputBrtp;
                    outputBxyz.resize(3);
                    outputBrtp.resize(3);
                    DataType outputBm;
                    /* Creation of the output vectors */
                    if (_outputCoord == "proc")
                    {
                        cout << "HOLLA" << endl;
                        //GetJupiterField(in, true, outputBxyz);
                    }

                    outputBm = sqrt(outputBrtp[0] * outputBrtp[0] + outputBrtp[1] * outputBrtp[1] + outputBrtp[2] * outputBrtp[2]);

                    _paramOutput->pushTime(crtTime);
                    pushResult(outputBrtp, outputBm, outputBxyz);
                }
            }
            // int GetJupiterField(vector<DataType> &inputCartCoord, bool SetCartOut, vector<DataType> &outputB) // To change ofc
            // {
            //     /* set the model */
            //     _internalModel.SetModel(_modelname.c_str());

            //     /* set intput and output coordinates */
            //     _internalModel.SetCartIn(true);
            //     _internalModel.SetCartOut(SetCartOut);

            //     /* output field */
            //     double Br, Bt, Bp;
            //     _internalModel.Field(inputCartCoord[0], inputCartCoord[1], inputCartCoord[2], &Br, &Bt, &Bp);

            //     /* Con2020 calculation to add if necessary */
            //     double Be0, Be1, Be2;
            //     if (_addCon2020 > 0)
            //     {
            //         _con2020.SetCartIn(true);
            //         _con2020.SetCartOut(SetCartOut);
            //         switch (_addCon2020)
            //         {
            //         case 1:
            //             _con2020.SetEqType("analytic");  // Fast
            //             break;
            //         case 2:
            //             _con2020.SetEqType("integral");  // Slow
            //             break;
            //         case 3:
            //             _con2020.SetEqType("hybrid");    // In between
            //             break;

            //         default:
            //             _con2020.SetEqType("analytic");
            //             break;
            //         }
            //         _con2020.Field(inputCartCoord[0], inputCartCoord[1], inputCartCoord[2], &Be0, &Be1, &Be2);
            //     }
            //     else
            //     {
            //         Be0 = 0.0;
            //         Be1 = 0.0;
            //         Be2 = 0.0;
            //     }

            //     outputB[0] = Br + Be0;
            //     outputB[1] = Bt + Be1;
            //     outputB[2] = Bp + Be2;

            //     return true;
            // }

        protected:
            virtual void
            pushResult(vector<DataType> field_pol, DataType magnitude_, vector<DataType> field_cart) = 0;
            ParamDataSpec<std::vector<DataType>> &_paramInput;
            string _outputCoord;
            TOutputParamData *_paramOutput;
            
        };

        template <typename DataType>
        class KT17Proc : public KT17<DataType, ParamDataSpec<vector<DataType>>>
        {
        public:
            /**
             * @brief Constructor.
             * @details Create the ParamData type of the input ParamData.
             */
            KT17Proc(Process &pProcess, ParamDataSpec<vector<DataType>> &paramInput) : KT17<DataType, ParamDataSpec<vector<DataType>>>(pProcess, paramInput, "proc")
            {
            }

            virtual ~KT17Proc()
            {
            }

        protected:
            virtual void pushResult(vector<DataType> /*_fieldPol*/, DataType /*magnitude_*/, vector<DataType> _fieldCart)
            {
                KT17<DataType, ParamDataSpec<vector<DataType>>>::_paramOutput->getDataList().push_back(_fieldCart);
            }
        };
    }
}
#endif /* KT17.hh */