#ifndef DArrayH #define DArrayH ////////////////////////////////////////////////////////////////////// // // DArray.h: interface for the DArray class. // ////////////////////////////////////////////////////////////////////// #include #include #include "Space.h" #include "AMView.h" #include "AlignAxis.h" #include "Block.h" #include "CommCost.h" //#include "ModelStructs.h" class AMView; class DArray : public Space { void PrepareAlign(long& TempRank, const std::vector& AAxisArray, const std::vector& ACoeffArray, const std::vector& AConstArray, std::vector& IniRule); // проверяет индексы на выход за пределы массива. // Возвращается число элементов в блоке. 0 если их нет или вышли за массив long CheckIndex(const std::vector& InitIndexArray, std::vector& LastIndexArray, const std::vector& StepArray); public: std::vector LowShdWidthArray; std::vector HiShdWidthArray; long TypeSize; // Размер в байтах одного элемента массива AMView *AM_Dis; // AMView в которую отображается DArray // Правило выравнивания на AM_Dis - ? // для чего нужен - для Pattern или еще для чего-нибудь тоже std::vector AlignRule; int Repl; // признак полностью размноженного по AM_Dis массива DArray(); DArray(const std::vector& ASizeArray, const std::vector& ALowShdWidthArray, const std::vector& AHiShdWidthArray, int ATypeSize); DArray(const DArray &); ~DArray(); DArray & operator= (const DArray &x); void AlnDA(AMView *APattern, const std::vector& AAxisArray, const std::vector& ACoeffArray, const std::vector& AConstArray); void AlnDA(DArray* APattern, const std::vector& AAxisArray, const std::vector& ACoeffArray, const std::vector& AConstArray); double RAlnDA(AMView *APattern, const std::vector& AAxisArray, const std::vector& ACoeffArray, const std::vector& AConstArray, long ANewSign); double RAlnDA(DArray* APattern, const std::vector& AAxisArray, const std::vector& ACoeffArray, const std::vector& AConstArray, long ANewSign); friend double ArrayCopy( DArray* AFromArray, const std::vector& AFromInitIndexArray, const std::vector& AFromLastIndexArray, const std::vector& AFromStepArray, DArray* AToArray, const std::vector& AToInitIndexArray, const std::vector& AToLastIndexArray, const std::vector& AToStepArray); friend double ArrayCopy(DArray* AFromArray, const std::vector& AFromInitIndexArray, const std::vector& AFromLastIndexArray, const std::vector& AFromStepArray, long ACopyRegim); // ArrCpy ? - какие параметры, что делает long GetMapDim(long arrDim, int &dir); // Функция возвращает номер // измерения VM на которое отображено указанное измерение массива // (если измерение массива размножено по всем направлениям матрицы виртуальных процессоров - 0). // в dir заносится 1 или -1 в зависимости от направления разбиения измерения массива bool IsAlign(); double RDisDA(const std::vector& AAxisArray, const std::vector& ADistrParamArray, long ANewSign); #ifdef P_DEBUG friend std::ostream& operator << (std::ostream& os, const DArray& s); #endif }; #endif