Skip to content

Instantly share code, notes, and snippets.

@MrPanch
Created May 20, 2020 17:24
Show Gist options
  • Save MrPanch/5f67b40738b30bbfc557d4f325993a9c to your computer and use it in GitHub Desktop.
Save MrPanch/5f67b40738b30bbfc557d4f325993a9c to your computer and use it in GitHub Desktop.

Revisions

  1. MrPanch created this gist May 20, 2020.
    101 changes: 101 additions & 0 deletions gistfile1.txt
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,101 @@
    #include <iostream>
    #include <fstream>
    #include <sstream>
    #include <math.h>
    #include <thread>
    #include <future>
    #include "parallel_thread.h"
    #include "Sole.hpp"
    #include "file_write.h"


    struct InitialSCalculation {
    size_t task_number;
    Sole* sole;
    int proc_num; // количество процессов
    size_t size;
    std::vector<std::vector<double>>& Rs;
    std::vector<std::vector<double>>& S;
    };


    double First_part(InitialSCalculation task) {
    int k_min = task.size/task.proc_num * task.task_number;
    int k_max = task.size/task.proc_num * (task.task_number + 1);
    if (task.task_number == task.proc_num - 1) k_max = task.size - 1;
    // Считаем R для каждой строчки
    for ( int i = k_min; i < k_max; ++i){
    if (i == k_min){
    task.Rs[i][0] = task.sole->GetA(i);
    task.Rs[i][2] = 1;
    continue; // ЧЕКНИ ЗДЕСЬ ПЛЗ. Я ЖЕ НЕ ЕБУСЬ В ГЛАЗА
    }
    task.Rs[i][0] = task.sole->GetA(i);
    task.Rs[i][2] = 1;
    task.Rs[i][1] = -task.sole->GetB(i)*task.sole->GetC(i-1);
    }
    // Считаем S для данного набора строчке
    task.S[task.task_number][0] = task.Rs[k_max-1][0];
    task.S[task.task_number][1] = task.Rs[k_max-1][1];
    task.S[task.task_number][2] = task.Rs[k_max-1][2];
    task.S[task.task_number][3] = task.Rs[k_max-1][3];
    for (int i = k_max-2; i >= k_min; --i){
    task.S[task.task_number] = matrix_mult(task.S[task.task_number], task.Rs[i]);
    }
    }

    struct FinalCalculation{
    size_t task_number;
    int proc_num; // количество процессов
    size_t size;
    std::vector<double> final_S;
    std::vector<std::vector<double>>& Rs; // с предыдущего шага без зименений
    std::vector<std::future<double>>& d;
    std::vector<std::future<double>>& l;
    };


    double Second_part(FinalCalculation task){
    int k_min = task.size/task.proc_num * task.task_number;
    int k_max = task.size/task.proc_num * (task.task_number + 1);
    if (task.task_number == task.proc_num - 1) k_max = task.size - 1;

    for (int i = k_min; i < k_max; ++i){
    task.final_S = matrix_mult(task.final_S, task.Rs[i]); // если понадобится то создам копию
    task.d[i] = (task.final_S[0] + task.final_S[1]) / (task.final_S[2] + task.final_S[3]); // в чём ошибка?
    }



    }

    int main(int argc, char** argv) {
    Sole sole(40);
    int n = 8; // количество потоков
    std::vector<std::future<double>> d_global(sole.GetHeight());
    std::vector<std::future<double>> l_global(sole.GetHeight());
    std::vector<std::future<double>> y_global(sole.GetHeight());
    std::vector<std::future<double>> x_global(sole.GetHeight());
    std::vector<double> final_S;
    std::vector<std::vector<double>> Rs_global(sole.GetHeight(), std::vector<double>(4, 0));
    std::vector<std::vector<double>> S_global(n, std::vector<double>(4, 0));
    std::vector<std::future<double>> first_iteration(n);
    std::vector<std::future<double>> second_iteration(n);
    for (size_t i = 0; i < n; ++i) { //А разве size_t может принимать значения меньше еденицы?
    InitialSCalculation task_data{i, &sole , n,sole.GetHeight(), Rs_global, S_global /*d_global, l_global, y_global, x_global*/};


    }


    for (size_t i = 0; i < n; ++i){
    FinalCalculation task2_data{i, n, sole.GetHeight(),final_S, Rs_global, d_global, l_global };


    }
    return 0;
    }

    /*
    * to test Thomas A = 2 -1 0 5 4 2 0 1 -3 , f = 3 6 2
    * */