#include <mkl.h>
#include <stdio.h>
#include <algorithm>
#include <locale.h>
//#include <thrust/execution_policy.h>
//#include <thrust/host_vector.h>
//#include <thrust/fill.h>
//#include <thrust/scatter.h>
//#include <thrust/transform.h>
//#include <thrust/iterator/zip_iterator.h>
//#include <thrust/tuple.h>
#include <crtdbg.h>
#include "stdafx.h"
#include <sstream>
#include <iostream>
#include <fstream>

using namespace std;

// The following macros set and clear, respectively, given bits
// of the C runtime library debug flag, as specified by a bitmask.
#ifdef   _DEBUG
#define  SET_CRT_DEBUG_FIELD(a) \
	_CrtSetDbgFlag((a) | _CrtSetDbgFlag(_CRTDBG_REPORT_FLAG))
#define  CLEAR_CRT_DEBUG_FIELD(a) \
	_CrtSetDbgFlag(~(a)& _CrtSetDbgFlag(_CRTDBG_REPORT_FLAG))
#else
#define  SET_CRT_DEBUG_FIELD(a)   ((void) 0)
#define  CLEAR_CRT_DEBUG_FIELD(a) ((void) 0)
#endif

typedef struct BlockMatrix//(double a00, double a01, double a10, double a11)
{
	double f00; //= a00;
	double f01; //= a01;
	double f10;//= a10;
	double f11;/// = a11;
} Block2x2;

/*
Содержание массива _internalPtr:
0 - число уникальных адресов,
1-19 - уникальные адреса,
20 - размерность матрицы,
21 - число ненулевых элементов в матрице
22 - управление факторизацией
*/

#define SolverNPtr 10		//Кол-во используемых уникальных адресов в решателе. Корректируется вручную!
#define ConvertorNPtr 3		//Кол-во используемых уникальных адресов в конверторе формата. Корректируется вручную!	

//Функция для очистки памяти.
int Free_Memory_SuperLU_Solver2(_MKL_DSS_HANDLE_t ptr);

//Функция для вывода заголовочного сообщения.
void OutputHeading(const char * explanation);