16#include <IJK_Finite_Difference_One_Dimensional_Matrix_Assembler.h>
21static std::vector<int> arg_sort(DoubleVect matrix_column_indices)
23 const int n = matrix_column_indices.
size();
25 std::vector<int> indices(n);
26 for (
int j=0; j<n; j++)
28 std::sort(indices.begin(), indices.end(), [&matrix_column_indices](
int i,
int j) {return matrix_column_indices[i] < matrix_column_indices[j];});
35 auto& non_zero_coeff_per_line = sparse_matrix.
get_set_tab1();
36 auto& matrix_column_indices = sparse_matrix.
get_set_tab2();
37 for (
int i = 0; i + 1 < non_zero_coeff_per_line.size_array(); i++)
39 const int index_ini = non_zero_coeff_per_line[i] - FORTRAN_INDEX_INI;
40 const int index_end = non_zero_coeff_per_line[i+1] - FORTRAN_INDEX_INI;
41 int n = index_end - index_ini;
42 DoubleVect matrix_column_indices_local(n);
43 DoubleVect matrix_values_local(n);
44 for (
int j=0; j<n; j++)
46 matrix_column_indices_local(j) = matrix_column_indices(j + index_ini);
47 matrix_values_local(j) = matrix_values(j + index_ini);
49 std::vector<int> indices;
50 indices = arg_sort(matrix_column_indices_local);
51 for (
int j=0; j<n; j++)
53 matrix_values[j + index_ini] = matrix_values_local[indices[j]];
57IJK_Finite_Difference_One_Dimensional_Matrix_Assembler::IJK_Finite_Difference_One_Dimensional_Matrix_Assembler()
74 for(
int i=0; i<MAX_ORDER_DERIVATIVE; i++)
86 Nom front_space =
" ";
90 os << front_space <<
"{" << escape;
92 os << front_space <<
" reduce_side_precision" << escape;
93 os << front_space <<
" precision_order" << end_space <<
precision_order_ << escape;
94 os << front_space <<
"}" << escape;
105 param.lire_avec_accolades(is);
106 Cout <<
"IJK_Thermal_base::readOn : Parameters summary. " << finl;
121 for(i=0; i<MAX_ORDER_DERIVATIVE; i++)
123 const int fd_operator_size = (int) fd_operator_vector[i].size();
124 fd_operator[i][0] = DoubleVect(fd_operator_size);
125 fd_operator[i][1] = DoubleVect(fd_operator_size);
126 for (j=0; j<fd_operator_size; j++)
127 fd_operator[i][1](j) = fd_operator_vector[i][j];
133 const int& fd_coefficient_type)
137 switch (fd_coefficient_type)
140 for(i=0; i<MAX_ORDER_DERIVATIVE; i++)
141 for (j=0; j < fd_operator[i][0].size(); j++)
142 fd_operator[i][0](j) = j;
145 for(i=0; i<MAX_ORDER_DERIVATIVE; i++)
147 const int fd_operator_size = fd_operator[i][0].size();
148 const int offset = (int) (fd_operator_size/2);
149 for (j=0; j < fd_operator_size; j++)
150 fd_operator[i][0](j) = j-offset;
154 for(i=0; i<MAX_ORDER_DERIVATIVE; i++)
155 for (j=0; j < fd_operator[i][0].size(); j++)
156 fd_operator[i][0](j) = -j;
159 for(i=0; i<MAX_ORDER_DERIVATIVE; i++)
161 const int fd_operator_size = fd_operator[i][0].size();
162 const int offset = (int) (fd_operator_size/2);
163 for (j=0; j < fd_operator_size; j++)
164 fd_operator[i][0](j) = j-offset;
172 int non_zero_elem = 0;
174 for (
int i=0; i<stencil_width; i++)
177 return non_zero_elem;
182 int (&stencil_left_offset) [3],
int (&stencil_right_offset) [3])
184 std::vector<int> indices_op;
185 const int stencil_width_conv = fd_operator_conv[
precision_order_-1][0].size();
186 const int stencil_width_diff = fd_operator_diff[
precision_order_-1][0].size();
191 int min_identity = 0;
192 int max_identity = 0;
194 for (i=0; i<stencil_width_conv; i++)
197 min_conv = std::min(min_conv, (
int) fd_operator_conv[
precision_order_-1][0](i));
198 max_conv = std::max(max_conv, (
int) fd_operator_conv[
precision_order_-1][0](i));
199 if (std::find(indices_op.begin(), indices_op.end(), index) == indices_op.end())
200 indices_op.push_back(index);
202 for (i=0; i<stencil_width_diff; i++)
205 min_diff = std::min(min_diff, (
int) fd_operator_diff[
precision_order_-1][0](i));
206 max_diff = std::max(max_diff, (
int) fd_operator_diff[
precision_order_-1][0](i));
207 if (std::find(indices_op.begin(), indices_op.end(), index) == indices_op.end())
208 indices_op.push_back(index);
210 const int min_conv_diff_identity = std::min(std::min(min_conv, min_diff), min_identity);
211 const int max_conv_diff_identity = std::max(std::max(max_conv, max_diff), max_identity);
213 const int left_offset_conv = (int) fabs(min_conv-min_conv_diff_identity);
214 const int right_offset_conv = (int) fabs(max_conv-max_conv_diff_identity);
215 const int left_offset_diff = (int) fabs(min_diff-min_conv_diff_identity);
216 const int right_offset_diff = (int) fabs(max_diff-max_conv_diff_identity);
217 const int left_offset_identity = (int) fabs(min_identity-min_conv_diff_identity);
218 const int right_offset_identity = (int) fabs(max_identity-max_conv_diff_identity);
220 stencil_left_offset[0] = left_offset_conv;
221 stencil_left_offset[1] = left_offset_diff;
222 stencil_left_offset[2] = left_offset_identity;
223 stencil_right_offset[0] = right_offset_conv;
224 stencil_right_offset[1] = right_offset_diff;
225 stencil_right_offset[2] = right_offset_identity;
227 int non_zero_elem = (int) indices_op.size();
228 return non_zero_elem;
232 int& non_zero_elem_max,
233 int& stencil_forward_max,
234 int& stencil_centred_max,
235 int& stencil_backward_max)
237 int stencil_forward_size = 0;
238 int stencil_centred_size = 0;
239 int stencil_backward_size = 0;
258 stencil_forward_max = stencil_forward_size;
259 stencil_centred_max = stencil_centred_size;
260 stencil_backward_max = stencil_backward_size;
261 const int core_lines = (nb_elem - 2);
262 non_zero_elem_max = stencil_forward_max + stencil_backward_max + stencil_centred_max * core_lines;
288 switch(derivative_order)
313 matrix.typer(
"Matrice_Morse");
318 auto& non_zero_coeff_per_line = sparse_matrix.
get_set_tab1();
319 auto& matrix_column_indices = sparse_matrix.
get_set_tab2();
321 Cerr << matrix_values[0] << finl;
322 Cerr << non_zero_coeff_per_line[0] << finl;
323 Cerr << matrix_column_indices[0] << finl;
329 int derivative_offset = derivative_order;
331 derivative_offset = 2;
339 const int core_lines = (nb_elem - 2);
340 int non_zero_values_counter = 0;
346 const int forward_derivative_size = (*forward_derivative)[
precision_order_-1][0].size();
349 for (
int i=0; i < forward_left_offset; i++)
351 matrix_column_indices[non_zero_values_counter] = i + FORTRAN_INDEX_INI;
352 non_zero_values_counter++;
354 for (
int i=0; i < forward_derivative_size; i++)
358 matrix_column_indices[non_zero_values_counter] = indices + forward_left_offset + FORTRAN_INDEX_INI;
359 matrix_values[non_zero_values_counter] = fd_coeff;
360 non_zero_values_counter++;
362 for (
int i=0; i < forward_right_offset; i++)
364 matrix_column_indices[non_zero_values_counter] = i + (forward_left_offset + forward_derivative_size) + FORTRAN_INDEX_INI;
365 non_zero_values_counter++;
367 non_zero_coeff_per_line[1] = non_zero_values_counter + FORTRAN_INDEX_INI;
373 const int centred_derivative_size = (*centred_derivative)[
precision_order_-1][0].size();
376 for (
int j=1; j<(core_lines+1); j++)
378 for (
int i=0; i < centred_left_offset; i++)
381 matrix_column_indices[non_zero_values_counter] = i + j + FORTRAN_INDEX_INI - centred_left_offset;
382 non_zero_values_counter++;
384 for (
int i=0; i < centred_derivative_size; i++)
389 matrix_column_indices[non_zero_values_counter] = indices + j + FORTRAN_INDEX_INI;
390 matrix_values[non_zero_values_counter] = fd_coeff;
391 non_zero_values_counter++;
393 for (
int i=0; i < centred_right_offset; i++)
396 matrix_column_indices[non_zero_values_counter] = i + j + centred_derivative_size + FORTRAN_INDEX_INI;
397 non_zero_values_counter++;
399 non_zero_coeff_per_line[j + 1] = non_zero_values_counter + FORTRAN_INDEX_INI;
407 const int backward_derivative_size = (*backward_derivative)[
precision_order_-1][0].size();
410 int end_counter = non_zero_values_counter - 1 + backward_derivative_size + backward_left_offset + backward_right_offset;
411 const int last_column = (nb_elem - 1);
412 for (
int i=0; i < backward_right_offset; i++)
414 matrix_column_indices[end_counter] = last_column -i + FORTRAN_INDEX_INI;
416 non_zero_values_counter++;
418 for (
int i=0; i < backward_derivative_size; i++)
422 matrix_column_indices[end_counter] = last_column + indices + FORTRAN_INDEX_INI;
423 matrix_values[end_counter] = fd_coeff;
425 non_zero_values_counter++;
428 for (
int i=0; i < backward_left_offset; i++)
430 matrix_column_indices[end_counter] = last_column - i - (backward_right_offset + backward_derivative_size) + FORTRAN_INDEX_INI;
432 non_zero_values_counter++;
434 non_zero_coeff_per_line[last_column + 1] = non_zero_values_counter + FORTRAN_INDEX_INI;
445 int non_zero_elem = 0;
446 int stencil_forward = 0;
447 int stencil_centred = 0;
448 int stencil_backward = 0;
452 switch(derivative_order)
484 const int core_lines = (nb_elem - 2);
485 non_zero_elem = stencil_forward + stencil_backward + stencil_centred * (nb_elem - 2);
487 matrix.typer(
"Matrice_Morse");
489 sparse_matrix.
dimensionner(nb_elem, nb_elem, non_zero_elem);
492 auto& non_zero_coeff_per_line = sparse_matrix.
get_set_tab1();
493 auto& matrix_column_indices = sparse_matrix.
get_set_tab2();
495 int non_zero_values_counter = 0;
501 const int forward_derivative_size = (*forward_derivative)[
precision_order_-1][0].size();
502 for (
int i=0; i < forward_derivative_size; i++)
508 matrix_column_indices[non_zero_values_counter] = indices + FORTRAN_INDEX_INI;
509 matrix_values[non_zero_values_counter] = fd_coeff;
510 non_zero_values_counter++;
513 non_zero_coeff_per_line[1] = non_zero_values_counter + FORTRAN_INDEX_INI;
519 const int centred_derivative_size = (*centred_derivative)[
precision_order_-1][0].size();
520 for (
int j=1; j<(core_lines+1); j++)
522 for (
int i=0; i < centred_derivative_size; i++)
528 matrix_column_indices[non_zero_values_counter] = indices + j + FORTRAN_INDEX_INI;
529 matrix_values[non_zero_values_counter] = fd_coeff;
530 non_zero_values_counter++;
533 non_zero_coeff_per_line[j + 1] = non_zero_values_counter + FORTRAN_INDEX_INI;
541 const int backward_derivative_size = (*backward_derivative)[
precision_order_-1][0].size();
542 int end_counter = non_zero_values_counter - 1 + stencil_backward;
543 const int last_column = (nb_elem - 1);
544 for (
int i=0; i < backward_derivative_size; i++)
550 matrix_column_indices[end_counter] = last_column + indices + FORTRAN_INDEX_INI;
551 matrix_values[end_counter] = fd_coeff;
553 non_zero_values_counter++;
556 non_zero_coeff_per_line[last_column + 1] = non_zero_values_counter + FORTRAN_INDEX_INI;
560 return non_zero_elem;
564 const int& use_sparse_matrix,
567 if (use_sparse_matrix)
578 sparse_matrix_A += sparse_matrix_B;
582 const auto& tab1 = sparse_matrix_A.
get_tab1();
583 Cerr <<
"tab1[tab1.size_array() - 1]" << tab1[tab1.size_array() - 1] << finl;
589 sort_stencil(sparse_matrix_A);
598 const int dim = block_matrix_A.
dim(0);
599 for (
int i=0; i<dim ; i++)
603 sparse_matrix_A += sparse_matrix_B;
608 sort_stencil(sparse_matrix_A);
619 sparse_matrix_A += sparse_matrix_B;
624 const int& max_subproblems_predicted)
626 matrix_subproblems.typer(
"Matrice_Bloc");
628 block_matrix_subproblems.
dimensionner(max_subproblems_predicted,max_subproblems_predicted);
632 for (
int i=0; i<max_subproblems_predicted; i++)
634 for (
int j=0; j<max_subproblems_predicted; j++)
638 block_matrix_subproblems.
get_bloc(i,j).typer(
"Matrice_Morse");
643 block_matrix_subproblems.
get_bloc(i,i).typer(
"Matrice_Morse");
651 const int& max_subproblems)
654 const int nb_rows = (fd_operator_sparse.
nb_lignes()) * max_subproblems;
655 const int nb_column = (fd_operator_sparse.
nb_colonnes()) * max_subproblems;
656 const int nb_coeff = (fd_operator_sparse.
nb_coeff()) * max_subproblems;
658 matrix_subproblems.typer(
"Matrice_Morse");
660 sparse_matrix_subproblems.
dimensionner(nb_rows, nb_column, nb_coeff);
667 const int& empty_problem_start_index,
668 const int& empty_problem_end_index)
672 const auto& coeff = fd_operator_morse.
get_coeff();
673 const auto& tab1 = fd_operator_morse.
get_tab1();
674 const auto& tab2 = fd_operator_morse.
get_tab2();
675 for (
int i=empty_problem_start_index; i<empty_problem_end_index; i++)
686 const int& nb_subproblems,
687 const int& first_time_step_varying_probes,
689 const int& first_initialisation,
690 int& initialise_sparse_indices)
693 if (first_initialisation)
695 matrix_subproblems.typer(
"Matrice_Morse");
697 if (initialise_sparse_indices)
699 for (
int l=0; l<6; l++)
700 first_indices_sparse_matrix[l].reset();
706 const auto& tab1_operator = fd_operator_sparse.
get_tab1();
707 const auto& tab2_operator = fd_operator_sparse.
get_tab2();
708 const auto& coeff_operator = fd_operator_sparse.
get_coeff();
710 const int nb_rows_operator = fd_operator_sparse.
nb_lignes();
711 const int nb_columns_operator = fd_operator_sparse.
nb_colonnes();
713 const int nb_rows = nb_rows_operator * nb_subproblems;
714 const int nb_columns = nb_columns_operator * nb_subproblems;
716 const int nb_val_non_zero_per_operator = fd_operator_sparse.
nb_coeff();
717 const int nb_val_non_zero_sparse = nb_subproblems * nb_val_non_zero_per_operator;
727 sparse_matrix_subproblems.
dimensionner(nb_rows, nb_columns, nb_val_non_zero_sparse);
728 for (
int i=0; i<nb_subproblems; i++)
730 const int first_index = i * nb_val_non_zero_per_operator;
731 const int column_index = i * nb_columns_operator;
732 const int row_index = i * nb_rows_operator;
733 if (initialise_sparse_indices)
735 first_indices_sparse_matrix[0].append_array(first_index);
736 first_indices_sparse_matrix[1].append_array(nb_val_non_zero_per_operator);
737 first_indices_sparse_matrix[2].append_array(column_index);
738 first_indices_sparse_matrix[3].append_array(nb_columns_operator);
739 first_indices_sparse_matrix[4].append_array(row_index);
740 first_indices_sparse_matrix[5].append_array(nb_rows_operator);
742 for (j=0; j<nb_val_non_zero_per_operator; j++)
744 tab2(j + first_index) = tab2_operator(j) + column_index;
745 coeff(j + first_index) = coeff_operator(j);
747 for (j=1; j<=nb_rows_operator; j++)
748 tab1(j + row_index) = tab1_operator(j) + first_index;
750 initialise_sparse_indices = 0;
760 const int& nb_subproblems,
761 const int& first_time_step_varying_probes)
767 matrix_subproblems.typer(
"Matrice_Bloc");
769 block_matrix_subproblems.
dimensionner(nb_subproblems,nb_subproblems);
773 for (
int i=0; i<nb_subproblems; i++)
775 for (
int j=0; j<nb_subproblems; j++)
779 block_matrix_subproblems.
get_bloc(i,j).typer(
"Matrice_Morse");
784 block_matrix_subproblems.
get_bloc(i,i).typer(
"Matrice_Morse");
785 if (!first_time_step_varying_probes)
795 const int& nb_subproblems,
796 const int& use_sparse_matrix,
798 const int& first_initialisation,
799 const int& keep_global_probes_discretisation)
801 if (use_sparse_matrix)
809 const int& nb_subproblems,
811 const int& first_initialisation,
812 const int& keep_global_probes_discretisation)
820 const auto& tab1_operator = fd_operator_morse.
get_tab1();
821 const auto& tab2_operator = fd_operator_morse.
get_tab2();
822 const auto& coeff_operator = fd_operator_morse.
get_coeff();
824 int nb_rows_operator = fd_operator_morse.
nb_lignes();
825 int nb_columns_operator = fd_operator_morse.
nb_colonnes();
826 int nb_coeff_operator = fd_operator_morse.
nb_coeff();
828 int nb_rows = nb_rows_operator;
829 int nb_columns = nb_columns_operator;
830 int nb_coeff = nb_coeff_operator;
832 int nb_rows_ini = sparse_matrix_subproblems.
nb_lignes();
833 int nb_columns_ini = sparse_matrix_subproblems.
nb_colonnes();
834 int nb_coeff_ini = sparse_matrix_subproblems.
nb_coeff();
841 if (!keep_global_probes_discretisation)
849 nb_rows_ini = (*first_indices_sparse_matrix)[4][nb_subproblems];
850 nb_columns_ini = (*first_indices_sparse_matrix)[2][nb_subproblems];
851 nb_coeff_ini = (*first_indices_sparse_matrix)[0][nb_subproblems];
856 if (!keep_global_probes_discretisation)
858 nb_rows += nb_rows_ini;
859 nb_columns += nb_columns_ini;
860 nb_coeff += nb_coeff_ini;
864 nb_rows_ini = (*first_indices_sparse_matrix)[4][nb_subproblems];
865 nb_columns_ini = (*first_indices_sparse_matrix)[2][nb_subproblems];
866 nb_coeff_ini = (*first_indices_sparse_matrix)[0][nb_subproblems];
867 nb_rows = nb_rows_ini;
868 nb_columns = nb_columns_ini;
869 nb_coeff = nb_coeff_ini;
873 if (!keep_global_probes_discretisation)
874 sparse_matrix_subproblems.
dimensionner(nb_rows, nb_columns, nb_coeff);
875 assert(nb_rows>=nb_rows_ini && nb_columns>=nb_columns_ini && nb_rows>=nb_rows_ini);
877 if (first_initialisation && !keep_global_probes_discretisation)
879 (*first_indices_sparse_matrix)[0][nb_subproblems] = nb_coeff_ini;
880 (*first_indices_sparse_matrix)[1][nb_subproblems] = nb_coeff_operator;
881 (*first_indices_sparse_matrix)[2][nb_subproblems] = nb_columns_ini;
882 (*first_indices_sparse_matrix)[3][nb_subproblems] = nb_columns_operator;
883 (*first_indices_sparse_matrix)[4][nb_subproblems] = nb_rows_ini;
884 (*first_indices_sparse_matrix)[5][nb_subproblems] = nb_rows_operator;
888 const int coeff_offset = nb_coeff_ini;
889 const int column_offset = nb_columns_ini;
890 const int row_offset = nb_coeff_ini;
893 if (!keep_global_probes_discretisation)
895 for (i=0; i<nb_coeff_operator; i++)
897 tab2(i + coeff_offset) = tab2_operator(i) + column_offset;
898 coeff(i + coeff_offset) = coeff_operator(i);
900 for (i=1; i<=nb_rows_operator; i++)
901 tab1(i + row_offset) = tab1_operator(i) + coeff_offset;
904 for (i=0; i<nb_coeff_operator; i++)
905 coeff(i + coeff_offset) = coeff_operator(i);
910 const int& nb_subproblems,
911 const int& keep_global_probes_discretisation)
920 const DoubleVect& vector,
921 const int& boundary_conditions)
927 DoubleVect vector_tmp = vector;
928 if (boundary_conditions)
931 vector_tmp[vector.
size() - 1] = 1.;
933 sparse_matrix *= vector_tmp;
939 const DoubleVect& vector,
940 const int& subproblem_index,
941 const int& boundary_conditions,
942 const int& use_sparse_matrix,
945 if (use_sparse_matrix)
951 first_indices_sparse_matrix);
956 first_indices_sparse_matrix);
961 Matrice& sub_matrix = block_matrix.
get_bloc(subproblem_index, subproblem_index);
968 const int& subproblem_index,
971 local_sub_matrix.typer(
"Matrice_Morse");
974 const int nb_coeff = (*first_indices_sparse_matrix)[1][subproblem_index];
975 const int nb_column = (*first_indices_sparse_matrix)[3][subproblem_index];
976 const int nb_rows = (*first_indices_sparse_matrix)[5][subproblem_index];
977 local_sparse_sub_matrix.
dimensionner(nb_rows, nb_column, nb_coeff);
979 auto& tab1_local = local_sparse_sub_matrix.
get_set_tab1();
980 auto& tab2_local = local_sparse_sub_matrix.
get_set_tab2();
984 const auto& tab1 = sparse_matrix.
get_tab1();
985 const auto& tab2 = sparse_matrix.
get_tab2();
986 const auto& coeff = sparse_matrix.
get_coeff();
988 const int coeff_offset = (*first_indices_sparse_matrix)[0][subproblem_index];
989 const int column_offset = (*first_indices_sparse_matrix)[2][subproblem_index];
990 const int row_offset = (*first_indices_sparse_matrix)[4][subproblem_index];
992 for (i=0; i<nb_coeff; i++)
994 tab2_local(i) = tab2(i + coeff_offset) - column_offset;
995 coeff_local(i) = coeff(i + coeff_offset);
997 tab1_local(0) = FORTRAN_INDEX_INI;
998 for (i=1; i<=nb_rows; i++)
999 tab1_local(i) = tab1(i + row_offset) - coeff_offset;
1004 const int& subproblem_index,
1008 const auto& tab1_local = local_sparse_sub_matrix.
get_tab1();
1009 const auto& tab2_local = local_sparse_sub_matrix.
get_tab2();
1010 const auto& coeff_local = local_sparse_sub_matrix.
get_coeff();
1017 const int nb_coeff = (*first_indices_sparse_matrix)[1][subproblem_index];
1018 const int nb_rows = (*first_indices_sparse_matrix)[5][subproblem_index];
1020 const int coeff_offset = (*first_indices_sparse_matrix)[0][subproblem_index];
1021 const int column_offset = (*first_indices_sparse_matrix)[2][subproblem_index];
1022 const int row_offset = (*first_indices_sparse_matrix)[4][subproblem_index];
1025 for (i=0; i<nb_coeff; i++)
1027 tab2(i + coeff_offset) = tab2_local(i) + column_offset;
1028 coeff(i + coeff_offset) = coeff_local(i);
1030 for (i=1; i<=nb_rows; i++)
1031 tab1(i + row_offset) = tab1_local(i) + coeff_offset;
1035 DoubleVect * global_rhs,
1036 DoubleVect& local_rhs,
1037 const int& ini_boundary_conditions,
1038 const double& interfacial_value,
1039 const int& end_boundary_conditions,
1040 const double& end_value,
1041 const int& subproblem_index,
1042 const double& dr_inv,
1043 const int& first_time_step_temporal,
1044 const int& first_time_step_explicit,
1045 const DoubleVect& temperature_ini_temporal_schemes,
1046 const int& start_index,
1048 const int& use_sparse_matrix)
1050 if (use_sparse_matrix)
1056 first_indices_sparse_matrix);
1059 ini_boundary_conditions,
1061 end_boundary_conditions,
1064 first_time_step_temporal,
1065 first_time_step_explicit,
1066 temperature_ini_temporal_schemes);
1070 first_indices_sparse_matrix);
1075 Matrice& sub_matrix = block_matrix.
get_bloc(subproblem_index, subproblem_index);
1078 ini_boundary_conditions,
1080 end_boundary_conditions,
1083 first_time_step_temporal,
1084 first_time_step_explicit,
1085 temperature_ini_temporal_schemes);
1090 for (
int i=0; i<local_rhs.
size(); i++)
1091 (*global_rhs)[i + start_index] = local_rhs[i];
1096 DoubleVect& modified_rhs,
1097 const int& ini_boundary_conditions,
1098 const double& interfacial_value,
1099 const int& end_boundary_conditions,
1100 const double& end_value,
1101 const double& dr_inv,
1102 const int& first_time_step_temporal,
1103 const int& first_time_step_explicit,
1104 const DoubleVect& temperature_ini_temporal_schemes)
1108 auto& non_zero_coeff_per_line = sparse_matrix.
get_set_tab1();
1109 const int nb_lines = sparse_matrix.
nb_lignes();
1110 const int nb_coeff = sparse_matrix.
nb_coeff();
1111 double interfacial_value_rhs;
1112 int ini_boundary_conditions_static_temporal = ini_boundary_conditions;
1113 if (first_time_step_temporal)
1115 interfacial_value_rhs = temperature_ini_temporal_schemes[0];
1116 ini_boundary_conditions_static_temporal =
dirichlet;
1119 interfacial_value_rhs = interfacial_value;
1126 switch(ini_boundary_conditions_static_temporal)
1130 const int non_zero_elem_ini = non_zero_coeff_per_line[1] - FORTRAN_INDEX_INI;
1131 matrix_values[0] = 1.;
1132 for (
int i=1; i<non_zero_elem_ini; i++)
1133 matrix_values[i] = 0.;
1134 modified_rhs[0] = interfacial_value_rhs;
1141 const int non_zero_elem_ini = non_zero_coeff_per_line[1] - FORTRAN_INDEX_INI;
1142 int counter_fd_coeff = 0;
1143 for (
int i=0; i < non_zero_elem_ini; i++)
1145 if (i < stencil_forward)
1148 matrix_values[i] = fd_coeff * dr_inv;
1152 matrix_values[i] = 0.;
1154 modified_rhs[0] = interfacial_value;
1158 Cerr <<
"Flux_jump condition necessitates a sub-problem in each phase : not implemented yet !" << finl;
1164 const int non_zero_elem_ini = non_zero_coeff_per_line[1] - FORTRAN_INDEX_INI;
1165 matrix_values[0] = 1.;
1166 for (
int i=1; i<non_zero_elem_ini; i++)
1167 matrix_values[i] = 0.;
1168 modified_rhs[0] = 0.;
1176 if (!first_time_step_temporal)
1178 switch(end_boundary_conditions)
1182 const int non_zero_elem_end = sparse_matrix.
nb_vois(nb_lines - 1);
1183 const int last_index = nb_coeff - 1;
1184 matrix_values[last_index] = 1.;
1185 for (
int i=last_index - 1; i > ( last_index - non_zero_elem_end); i--)
1186 matrix_values[i] = 0.;
1187 modified_rhs[modified_rhs.
size() - 1] = end_value;
1193 const int non_zero_elem_end = sparse_matrix.
nb_vois(nb_lines - 1);
1196 int counter_fd_coeff = stencil_backward - 1;
1197 for (
int i=0; i < non_zero_elem_end; i++)
1199 const int index = i + nb_coeff - non_zero_elem_end;
1200 if (index + stencil_backward >= nb_coeff)
1203 matrix_values[index] = fd_coeff * dr_inv;
1207 matrix_values[index] = 0.;
1209 modified_rhs[modified_rhs.
size() - 1] = end_value;
1215 const int non_zero_elem_end = sparse_matrix.
nb_vois(nb_lines - 1);
1218 int counter_fd_coeff = stencil_backward - 1;
1219 for (
int i=0; i < non_zero_elem_end; i++)
1221 const int index = i + nb_coeff - non_zero_elem_end;
1222 if (index + stencil_backward >= nb_coeff)
1225 matrix_values[index] = fd_coeff * dr_inv;
1229 matrix_values[index] = 0.;
1233 counter_fd_coeff = 0;
1234 for (
int i=0; i < non_zero_elem_end; i++)
1236 const int index = i + nb_coeff - non_zero_elem_end;
1237 if (index + stencil_centred >= nb_coeff)
1240 matrix_values[index] += - (fd_coeff * dr_inv);
1244 modified_rhs[modified_rhs.
size() - 1] = end_value;
1249 const int non_zero_elem_end = sparse_matrix.
nb_vois(nb_lines - 1);
1250 const int last_index = nb_coeff - 1;
1251 matrix_values[last_index] = 1.;
1252 for (
int i = last_index - 1; i > (last_index - non_zero_elem_end); i--)
1253 matrix_values[i] = 0.;
1254 modified_rhs[modified_rhs.
size() - 1] = -1.;
1260 Cerr <<
"First iteration is done with Euler implicit or explicit" << finl;
1266 if (!(first_time_step_temporal && first_time_step_explicit))
1267 if ((ini_boundary_conditions !=
neumann && ini_boundary_conditions !=
flux_jump)
1268 || (end_boundary_conditions !=
neumann))
1271 ini_boundary_conditions,
1272 end_boundary_conditions);
1279 DoubleVect& modified_rhs,
1280 const int& ini_boundary_conditions,
1281 const int& end_boundary_conditions)
1289 auto& non_zero_coeff_per_line = sparse_matrix.
get_set_tab1();
1290 auto& matrix_column_indices = sparse_matrix.
get_set_tab2();
1291 const int nb_lines = sparse_matrix.
nb_lignes();
1292 const int nb_column = sparse_matrix.
nb_colonnes();
1294 const DoubleVect rhs_ini = modified_rhs;
1295 DoubleVect rhs = modified_rhs;
1297 const int ini_boundary_bool = ((ini_boundary_conditions==
default_bc) || (ini_boundary_conditions==
dirichlet));
1298 const int end_boundary_bool = ((end_boundary_conditions==
default_bc) || (end_boundary_conditions==
dirichlet));
1302 if (ini_boundary_conditions ==
neumann && ini_boundary_conditions ==
flux_jump)
1304 if (end_boundary_conditions ==
neumann)
1305 rhs[rhs.
size() - 1] = 0.;
1312 sparse_matrix.
multvect(rhs, modified_rhs);
1315 modified_rhs -= rhs;
1316 modified_rhs *= -1.;
1317 modified_rhs += rhs;
1319 if (ini_boundary_conditions ==
neumann && ini_boundary_conditions ==
flux_jump)
1320 modified_rhs[0] = rhs_ini[0];
1321 if (end_boundary_conditions ==
neumann)
1322 modified_rhs[modified_rhs.
size() - 1] = rhs_ini[rhs_ini.
size() - 1];
1329 for (
int j=2; j<nb_lines; j++)
1331 const int non_zero_elem_core_series = non_zero_coeff_per_line[j] - FORTRAN_INDEX_INI;
1332 const int non_zero_elem_core = non_zero_coeff_per_line[j] - non_zero_coeff_per_line[j-1];
1333 for (
int i = 0; i < non_zero_elem_core; i++)
1335 const int index_sparse = non_zero_elem_core_series - non_zero_elem_core + i;
1336 const int column_index = matrix_column_indices[index_sparse] - FORTRAN_INDEX_INI;
1337 if (column_index == 0 && ini_boundary_bool)
1338 matrix_values[index_sparse] = 0.;
1339 if (column_index == (nb_column - 1) && end_boundary_bool)
1340 matrix_values[index_sparse] = 0.;
1356 DoubleVect& rhs_assembly,
1357 const DoubleVect& source_terms,
1358 const int& index_start,
1359 const int& boundary_condition_interface,
1360 const int& boundary_condition_end)
1365 const int local_rhs_size = source_terms.size();
1367 int index_end = local_rhs_size;
1368 switch(boundary_condition_interface)
1384 switch(boundary_condition_end)
1401 for (
int i=index_ini; i<index_end; i++)
1403 (*thermal_subproblems_rhs_assembly)[i + index_start] += source_terms[i];
1404 rhs_assembly[i] += source_terms[i];
1411 sparse_matrix.
multvect(solution, res);
1417 const int& subproblem_index,
1418 const double& local_time_step,
1419 const double& alpha)
1422 Matrice& convection_sub_matrix = convection_block_matrix.
get_bloc(subproblem_index, subproblem_index);
1423 convection_sub_matrix *= (local_time_step * alpha);
1426 Matrice& diffusion_sub_matrix = diffusion_block_matrix.
get_bloc(subproblem_index, subproblem_index);
1427 diffusion_sub_matrix *= (local_time_step * alpha);
1432 const int& subproblem_index,
1433 const double& local_time_step,
1434 const double& alpha)
1437 Matrice& convection_sub_matrix = convection_block_matrix.
get_bloc(subproblem_index, subproblem_index);
1438 convection_sub_matrix *= (- local_time_step * alpha);
1441 Matrice& diffusion_sub_matrix = diffusion_block_matrix.
get_bloc(subproblem_index, subproblem_index);
1442 diffusion_sub_matrix *= (- local_time_step * alpha);
1447 const int& nb_points,
1448 const int& pre_initialise_thermal_subproblems_list)
1450 if (pre_initialise_thermal_subproblems_list)
1452 const auto& tab1 = sparse_matrix_solver.
get_tab1();
1453 const auto& tab2 = sparse_matrix_solver.
get_tab2();
1454 const auto& coeff = sparse_matrix_solver.
get_coeff();
1455 sparse_matrix_solver_reduced.
dimensionner(nb_points, nb_points, tab1[nb_points] - FORTRAN_INDEX_INI);
1456 auto& tab1_reduced = sparse_matrix_solver_reduced.
get_set_tab1();
1457 auto& tab2_reduced = sparse_matrix_solver_reduced.
get_set_tab2();
1458 auto& coeff_reduced = sparse_matrix_solver_reduced.
get_set_coeff();
1459 const int nb_coeff = coeff_reduced.size_array();
1460 const int nb_rows = tab1_reduced.size_array();
1470 for (i=0; i<nb_rows; i++)
1471 tab1_reduced(i) = tab1(i);
1472 for (i=0; i<nb_coeff; i++)
1474 tab2_reduced(i) = tab2(i);
1475 coeff_reduced(i) = coeff(i);
1479 sparse_matrix_solver_reduced = sparse_matrix_solver;
Class defining operators and methods for all reading operation in an input flow (file,...
void scale_matrix_by_vector(Matrice &matrix, const DoubleVect &vector, const int &boundary_conditions)
void impose_boundary_conditions(Matrice &modified_matrix, DoubleVect &mdified_rhs, const int &ini_boundary_conditions, const double &interfacial_value, const int &end_boundary_conditions, const double &end_values, const double &dr_inv, const int &first_time_step_temporal, const int &first_time_step_explicit, const DoubleVect &temperature_ini_temporal_schemes)
int non_zero_stencil_values(const FixedVector< FixedVector< DoubleVect, 2 >, MAX_ORDER_DERIVATIVE > &fd_operator)
FixedVector< FixedVector< DoubleVect, 2 >, MAX_ORDER_DERIVATIVE > identity_coefficient_
void reinitialise_any_matrix_subproblem(Matrice *matrix_subproblems, const Matrice *fd_operator, const int &nb_subproblems, const int &use_sparse_matrix, FixedVector< ArrOfInt, 6 > *first_indices_sparse_matrix, const int &first_initialisation, const int &keep_global_probes_discretisation)
void reinitialise_sparse_matrix_subproblem(Matrice *matrix_subproblems, const Matrice *fd_operator, const int &nb_subproblems, FixedVector< ArrOfInt, 6 > *first_indices_sparse_matrix, const int &first_initialisation, const int &keep_global_probes_discretisation)
const std::vector< std::vector< double > > second_order_derivative_centred_vector_
void set_operators_indices(const std::vector< std::vector< double > > &fd_operator_vector, FixedVector< FixedVector< DoubleVect, 2 >, MAX_ORDER_DERIVATIVE > &fd_operator, const int &fd_coefficient_type)
FixedVector< FixedVector< DoubleVect, 2 >, MAX_ORDER_DERIVATIVE > second_order_derivative_forward_
void set_param(Param ¶m) const override
void apply_euler_time_step(Matrice *convection_matrix, Matrice *diffusion_matrix, const int &subproblem_index, const double &local_time_step, const double &alpha)
bool reduce_side_precision_
int backward_left_offset_[3]
int build_with_unknown_pattern(Matrice &matrix, const int &nb_elem, const int &derivative_order)
void add_source_terms(DoubleVect *thermal_subproblems_rhs_assembly, DoubleVect &rhs_assembly, const DoubleVect &source_terms, const int &index_start, const int &boundary_condition_interface, const int &boundary_condition_end)
FixedVector< FixedVector< DoubleVect, 2 >, MAX_ORDER_DERIVATIVE > first_order_derivative_backward_
void make_operation_on_sub_matrix_sparse(Matrice &local_sub_matrix, Matrice *matrix, const int &subproblem_index, const FixedVector< ArrOfInt, 6 > *first_indices_sparse_matrix)
int get_max_operators(const FixedVector< FixedVector< DoubleVect, 2 >, MAX_ORDER_DERIVATIVE > &fd_operator_conv, const FixedVector< FixedVector< DoubleVect, 2 >, MAX_ORDER_DERIVATIVE > &fd_operator_diff, int(&stencil_left_offset)[3], int(&stencil_right_offset)[3])
int forward_left_offset_[3]
int build_with_known_pattern(Matrice &matrix, const int &nb_elem, const int &derivative_order)
void initialise_sparse_matrix_subproblems(Matrice &matrix_subproblems, Matrice &fd_operator, const int &nb_subproblems, const int &first_time_step_varying_probes, FixedVector< ArrOfInt, 6 > &first_indices_sparse_matrix, const int &first_initialisation, int &initialise_sparse_indices)
int forward_right_offset_[3]
void compute_operator(const Matrice *fd_operator, const DoubleVect &solution, DoubleVect &res)
void set_operators_size(const std::vector< std::vector< double > > &fd_operator_vector, FixedVector< FixedVector< DoubleVect, 2 >, MAX_ORDER_DERIVATIVE > &fd_operator)
const std::vector< std::vector< double > > second_order_derivative_forward_vector_
void impose_boundary_conditions_subproblem(Matrice *matrix, DoubleVect *global_rhs, DoubleVect &local_rhs, const int &ini_boundary_conditions, const double &interfacial_value, const int &end_boundary_conditions, const double &end_value, const int &subproblem_index, const double &dr_inv, const int &first_time_step_temporal, const int &first_time_step_explicit, const DoubleVect &temperature_ini_temporal_schemes, const int &start_index, const FixedVector< ArrOfInt, 6 > *first_indices_sparse_matrix, const int &use_sparse_matrix)
void sum_sparse_matrices_subproblems(Matrice &matrix_A, Matrice &matrix_B, const int &debug)
int stencil_backward_max_
FixedVector< FixedVector< DoubleVect, 2 >, MAX_ORDER_DERIVATIVE > first_order_derivative_forward_
void recombined_local_sub_matrix_with_matrix(Matrice &local_sub_matrix, Matrice *matrix, const int &subproblem_index, const FixedVector< ArrOfInt, 6 > *first_indices_sparse_matrix)
const std::vector< std::vector< double > > first_order_derivative_centred_vector_
void reinitialise_matrix_subproblem(Matrice *matrix_subproblems, const Matrice *fd_operator, const int &nb_subproblems, const int &keep_global_probes_discretisation)
void sum_any_matrices_subproblems(Matrice &matrix_A, Matrice &matrix_B, const int &use_sparse_matrix, const int &debug)
FixedVector< FixedVector< DoubleVect, 2 >, MAX_ORDER_DERIVATIVE > second_order_derivative_backward_
FixedVector< FixedVector< DoubleVect, 2 >, MAX_ORDER_DERIVATIVE > first_order_derivative_centred_
int centred_left_offset_[3]
void modify_rhs_for_bc(Matrice &modified_matrix, DoubleVect &modified_rhs, const int &ini_boundary_conditions, const int &end_boundary_conditions)
void initialise_matrix_subproblems(Matrice &matrix_subproblems, Matrice &fd_operator, const int &subproblems, const int &first_time_step_varying_probes)
const std::vector< std::vector< double > > first_order_derivative_forward_vector_
void reduce_solver_matrix(const Matrice_Morse &thermal_subproblems_matrix_assembly_for_solver, Matrice_Morse &thermal_subproblems_matrix_assembly_for_solver_reduced, const int &nb_points, const int &pre_initialise_thermal_subproblems_list)
void sum_matrices_subproblems(Matrice &matrix_A, Matrice &matrix_B)
const std::vector< std::vector< double > > second_order_derivative_backward_vector_
void compute_stencil_properties(const int nb_elem)
void correct_sign_temporal_schemes_subproblems(Matrice *convection_matrix, Matrice *diffusion_matrix, const int &subproblem_index, const double &local_time_step, const double &alpha)
void complete_empty_matrices_initialisation(Matrice &matrix_subproblems, Matrice &fd_operator, const int &empty_problem_start_index, const int &empty_problem_end_index)
void scale_matrix_subproblem_by_vector(Matrice *matrix, const DoubleVect &vector, const int &subproblem_index, const int &boundary_conditions, const int &use_sparse_matrix, const FixedVector< ArrOfInt, 6 > *first_indices_sparse_matrix)
int backward_right_offset_[3]
int build(Matrice &matrix, const int &nb_elem, const int &derivative_order)
FixedVector< FixedVector< DoubleVect, 2 >, MAX_ORDER_DERIVATIVE > second_order_derivative_centred_
const std::vector< std::vector< double > > first_order_derivative_backward_vector_
void get_max_stencil(const int &nb_elem, int &non_zero_elem_max, int &stencil_forward_max, int &stencil_centred_max, int &stencil_backward_max)
void pre_initialise_sparse_matrix_subproblems(Matrice &matrix_subproblems, Matrice &fd_operator, const int &max_subproblems_predicted)
void sum_matrices(Matrice &matrix_A, Matrice &matrix_B)
int centred_right_offset_[3]
void pre_initialise_matrix_subproblems(Matrice &matrice, Matrice &fd_operator, const int &max_subproblems_predicted)
virtual DoubleVect & multvect(const DoubleVect &, DoubleVect &) const
Multiplication d'un vecteur par la matrice.
virtual void dimensionner(int N, int M)
virtual const Matrice & get_bloc(int i, int j) const
Classe Matrice_Morse Represente une matrice M (creuse), non necessairement carree.
const auto & get_tab2() const
void dimensionner(int n, _SIZE_ nnz)
Size the matrix with n lines and n columns and nnz zero-values coefficients.
const auto & get_tab1() const
int nb_colonnes() const override
Return local number of columns (=size on the current proc).
const auto & get_coeff() const
int nb_lignes() const override
Return local number of lines (=size on the current proc).
void compacte(int elim_coeff_nul=0)
Method to check/clean the Matrice_Morse matrix: -Suppress coefficient defined several times.
Classe Matrice Classe generique de la hierarchie des matrices.
classe Objet_U Cette classe est la classe de base des Objets de TRUST
const Nom & que_suis_je() const
renvoie la chaine identifiant la classe.
virtual Entree & readOn(Entree &)
Lecture d'un Objet_U sur un flot d'entree Methode a surcharger.
virtual Sortie & printOn(Sortie &) const
Ecriture de l'objet sur un flot de sortie Methode a surcharger.
Helper class to factorize the readOn method of Objet_U classes.
void ajouter_flag(const char *keyword, const bool *value)
Register a boolean flag whose mere presence switches it to true.
void ajouter(const char *keyword, const int *value, Param::Nature nat=Param::OPTIONAL)
Register an integer parameter.
Classe de base des flux de sortie.