16#ifndef IJK_Finite_Difference_One_Dimensional_Matrix_Assembler_included
17#define IJK_Finite_Difference_One_Dimensional_Matrix_Assembler_included
20#include <Matrice_Bloc.h>
21#include <Matrice_Morse_Sym.h>
23#include <FixedVector.h>
26#define MAX_ORDER_DERIVATIVE 4
27#define FORTRAN_INDEX_INI 1
43 int build(
Matrice& matrix,
const int& nb_elem,
const int& derivative_order);
47 DoubleVect& modified_rhs,
48 const int& ini_boundary_conditions,
49 const int& end_boundary_conditions);
51 const DoubleVect& vector,
52 const int& boundary_conditions);
54 const DoubleVect& vector,
55 const int& subproblem_index,
56 const int& boundary_conditions,
57 const int& use_sparse_matrix,
61 const int& subproblem_index,
65 const int& subproblem_index,
68 DoubleVect& mdified_rhs,
69 const int& ini_boundary_conditions,
70 const double& interfacial_value,
71 const int& end_boundary_conditions,
72 const double& end_values,
74 const int& first_time_step_temporal,
75 const int& first_time_step_explicit,
76 const DoubleVect& temperature_ini_temporal_schemes);
78 DoubleVect * global_rhs,
79 DoubleVect& local_rhs,
80 const int& ini_boundary_conditions,
81 const double& interfacial_value,
82 const int& end_boundary_conditions,
83 const double& end_value,
84 const int& subproblem_index,
86 const int& first_time_step_temporal,
87 const int& first_time_step_explicit,
88 const DoubleVect& temperature_ini_temporal_schemes,
89 const int& start_index,
91 const int& use_sparse_matrix);
98 const int& nb_subproblems,
99 const int& first_time_step_varying_probes,
101 const int& first_initialisation,
102 int& initialise_sparse_indices);
105 const int& subproblems,
106 const int& first_time_step_varying_probes);
109 const int& nb_subproblems,
110 const int& use_sparse_matrix,
112 const int& first_initialisation,
113 const int& keep_global_probes_discretisation);
116 const int& nb_subproblems,
118 const int& first_initialisation,
119 const int& keep_global_probes_discretisation);
122 const int& nb_subproblems,
123 const int& keep_global_probes_discretisation);
125 DoubleVect& rhs_assembly,
126 const DoubleVect& source_terms,
127 const int& index_start,
128 const int& boundary_condition_interface,
129 const int& boundary_condition_end);
133 const int& subproblem_index,
134 const double& local_time_step,
135 const double& alpha);
138 const int& subproblem_index,
139 const double& local_time_step,
140 const double& alpha);
145 const int& max_subproblems_predicted);
148 const int& empty_problem_start_index,
149 const int& empty_problem_end_index);
152 Matrice_Morse& thermal_subproblems_matrix_assembly_for_solver_reduced,
153 const int& nb_points,
154 const int& pre_initialise_thermal_subproblems_list);
179 {-3./2., 2., -1./2.},
180 {-11./6., 3., -3./2., 1./3.},
181 {-25./12., 4., -3., 4./3., -1./4.}
188 {1./12., -2./3., 0., 2./3., -1./12.},
189 {1./12., -2./3., 0., 2./3., -1./12.}
196 {11./6., -3., 3./2., -1./3.},
197 {25./12., -4., 3., -4./3., 1./4.}
207 {35./12., -26./3., 19./2., -14./3., 11./12.},
208 {15./4., -77./6., 107./6., -13., 61./12., -5./6.}
215 {-2., -1., 0., 1., 2.},
216 {-2., -1., 0., 1., 2.}
223 {35./12., -26./3., 19./2., -14./3., 11./12.},
224 {15./4., -77./6., 107./6., -13., 61./12., -5./6.}
249 const int& fd_coefficient_type);
253 int (&stencil_left_offset) [3],
int (&stencil_right_offset) [3]);
255 int& non_zero_elem_max,
256 int& stencil_forward_max,
257 int& stencil_centred_max,
258 int& stencil_backward_max);
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)
void fill_lines(Matrice &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)
Classe Matrice_Morse Represente une matrice M (creuse), non necessairement carree.
Classe Matrice Classe generique de la hierarchie des matrices.
Objet_U()
Constructeur par defaut : attribue un numero d'identifiant unique a l'objet (object_id_),...
Helper class to factorize the readOn method of Objet_U classes.