#pragma once

#include "stdDefinitions.h"
#include <map>
#include <string>
#include "agmScalarField.h"
#include "agmVectorFieldOps.h"

#ifndef d_mfoglobaldefine
#define d_mfoglobaldefineextern extern
#else
#define d_mfoglobaldefineextern
#endif

#define LIB_STATE_LIB_NOT_INIT              0x00010000
#define LIB_STATE_NO_PARAMETER              0x00020000

//d_mfoglobaldefineextern BWndDebug *debugtrace;
//d_mfoglobaldefineextern BWndDebug *debugtrace2;

d_mfoglobaldefineextern int gstcLibraryInit
#ifdef d_mfoglobaldefine
    = 0
#endif
    ;

d_mfoglobaldefineextern std::map<std::string, int> mapInt;
d_mfoglobaldefineextern std::map<std::string, uint64_t> mapuint64_t;
d_mfoglobaldefineextern std::map<std::string, double> mapDouble;

d_mfoglobaldefineextern int WiegelmannWeightType;
d_mfoglobaldefineextern REALTYPE_A WiegelmannWeightBound;
d_mfoglobaldefineextern REALTYPE_A WiegelmannWeightDivfree;

d_mfoglobaldefineextern int WiegelmannProcTimeoutMS;

d_mfoglobaldefineextern int WiegelmannSynchronous;
d_mfoglobaldefineextern int WiegelmannShowProgress;
d_mfoglobaldefineextern REALTYPE_A WiegelmannShowProgressTimeQuant;
d_mfoglobaldefineextern int WiegelmannProtocolStep;

d_mfoglobaldefineextern int WiegelmannDerivStencil;
d_mfoglobaldefineextern REALTYPE_A WiegelmannProcStep0;
d_mfoglobaldefineextern REALTYPE_A WiegelmannProcUsePrev;
d_mfoglobaldefineextern REALTYPE_A WiegelmannProcPrevStepFactor;
d_mfoglobaldefineextern int WiegelmannProcStepMax;
d_mfoglobaldefineextern int WiegelmannProcMaxSteps;

d_mfoglobaldefineextern REALTYPE_A WiegelmannProcStepIncr;
d_mfoglobaldefineextern REALTYPE_A WiegelmannProcStepIncrInit;
d_mfoglobaldefineextern REALTYPE_A WiegelmannProcStepIncrMatr;
d_mfoglobaldefineextern REALTYPE_A WiegelmannProcStepIncrMain;

d_mfoglobaldefineextern REALTYPE_A WiegelmannProcStepDecr;
d_mfoglobaldefineextern REALTYPE_A WiegelmannProcStepDecrInit;
d_mfoglobaldefineextern REALTYPE_A WiegelmannProcStepDecrMatr;
d_mfoglobaldefineextern REALTYPE_A WiegelmannProcStepDecrMain;

d_mfoglobaldefineextern REALTYPE_A WiegelmannProcStepLim;
d_mfoglobaldefineextern REALTYPE_A WiegelmannProcStepLimInit;
d_mfoglobaldefineextern REALTYPE_A WiegelmannProcStepLimMatr;
d_mfoglobaldefineextern REALTYPE_A WiegelmannProcStepLimMain;

d_mfoglobaldefineextern REALTYPE_A WiegelmannProcdLStop;
d_mfoglobaldefineextern REALTYPE_A WiegelmannProcdLStopInit;
d_mfoglobaldefineextern REALTYPE_A WiegelmannProcdLStopMatr;
d_mfoglobaldefineextern REALTYPE_A WiegelmannProcdLStopMain;

d_mfoglobaldefineextern REALTYPE_A WiegelmannProcFunctionalLimit;
d_mfoglobaldefineextern REALTYPE_A WiegelmannProcFunctionalLimitInit;
d_mfoglobaldefineextern REALTYPE_A WiegelmannProcFunctionalLimitMatr;
d_mfoglobaldefineextern REALTYPE_A WiegelmannProcFunctionalLimitMain;

d_mfoglobaldefineextern int WiegelmannProcdLIter;
d_mfoglobaldefineextern int WiegelmannProcdLIterInit;
d_mfoglobaldefineextern int WiegelmannProcdLIterMatr;
d_mfoglobaldefineextern int WiegelmannProcdLIterMain;

d_mfoglobaldefineextern int WiegelmannProcdLStdWin;
d_mfoglobaldefineextern int WiegelmannProcdLStdWinInit;
d_mfoglobaldefineextern int WiegelmannProcdLStdWinMatr;
d_mfoglobaldefineextern int WiegelmannProcdLStdWinMain;

d_mfoglobaldefineextern REALTYPE_A WiegelmannProcdLStdVal;
d_mfoglobaldefineextern REALTYPE_A WiegelmannProcdLStdValInit;
d_mfoglobaldefineextern REALTYPE_A WiegelmannProcdLStdValMatr;
d_mfoglobaldefineextern REALTYPE_A WiegelmannProcdLStdValMain;

d_mfoglobaldefineextern int WiegelmannGetMetricsTheta;
d_mfoglobaldefineextern int WiegelmannGetMetricsDiffInit;
d_mfoglobaldefineextern int WiegelmannGetMetricsDiffPrev;

//d_mfoglobaldefineextern int WiegelmannProcChromoZUse;
//d_mfoglobaldefineextern int WiegelmannProcChromoZLevel;
//d_mfoglobaldefineextern REALTYPE_A WiegelmannProcWeightAddRegular;

d_mfoglobaldefineextern int WiegelmannMatryoshkaUse;
d_mfoglobaldefineextern int WiegelmannMatryoshkaDeepMinN;
d_mfoglobaldefineextern REALTYPE_A WiegelmannMatryoshkaFactor;
d_mfoglobaldefineextern CagmVectorFieldOps::Interpolator WiegelmannMatryoshkaInterpolator;
d_mfoglobaldefineextern REALTYPE_A WiegelmannMatryoshkaInterpolatorP1;
d_mfoglobaldefineextern REALTYPE_A WiegelmannMatryoshkaInterpolatorP2;
d_mfoglobaldefineextern REALTYPE_A WiegelmannMatryoshkaInterpolatorP3;

d_mfoglobaldefineextern int WiegelmannProcCondType;
d_mfoglobaldefineextern int WiegelmannProcCondAbs;
d_mfoglobaldefineextern int WiegelmannProcCondAbs2;
d_mfoglobaldefineextern int WiegelmannProcCondLOS2;
d_mfoglobaldefineextern int WiegelmannProcCondLOS;
d_mfoglobaldefineextern int WiegelmannProcCondBase;
d_mfoglobaldefineextern int WiegelmannProcCondBase2;

d_mfoglobaldefineextern int WiegelmannChunkSizeMax;
d_mfoglobaldefineextern int WiegelmannChunkSizeOpt;
d_mfoglobaldefineextern int WiegelmannChunkTasks;
d_mfoglobaldefineextern int WiegelmannThreadPriority;

#undef d_mfoglobaldefineextern
