7 libMesh::PetscMatrix<libMesh::Number>& coupling_matrix,
10 const std::unordered_multimap<int,int>& inter_table
13 const libMesh::Parallel::Communicator& WorldComm = row_addresses.
mesh.comm();
14 int rank = WorldComm.rank();
15 int nodes = WorldComm.size();
18 const unsigned int row_M = row_addresses.
dof_map.n_dofs();
19 const int col_N = col_addresses.
dof_map.n_dofs();
20 const unsigned int row_M_local = row_addresses.
dof_map.n_local_dofs();
21 const int col_N_local = col_addresses.
dof_map.n_local_dofs();
27 std::vector<unsigned int> local_n_nz(row_M_local,0);
28 std::vector<unsigned int> local_n_oz(row_M_local,0);
31 std::vector<int> begin_row_DoF(nodes);
32 std::vector<int> end_row_DoF(nodes);
33 for(
int iii = 0; iii < nodes; ++iii)
35 begin_row_DoF[iii] = row_addresses.
dof_map.first_dof(iii);
36 end_row_DoF[iii] = row_addresses.
dof_map.end_dof(iii);
39 std::vector<int> begin_col_DoF(nodes);
40 std::vector<int> end_col_DoF(nodes);
41 for(
int iii = 0; iii < nodes; ++iii)
43 begin_col_DoF[iii] = col_addresses.
dof_map.first_dof(iii);
44 end_col_DoF[iii] = col_addresses.
dof_map.end_dof(iii);
47 int local_begin_row_DoF = begin_row_DoF[rank];
48 int local_end_row_DoF = end_row_DoF[rank];
52 int row_mesh_elem_idx = 0;
55 std::vector<std::vector<int> > to_add_per_proc(row_M, std::vector<int>(nodes,0));
57 std::vector<int> row_dof_indices_procs;
58 libMesh::MeshBase::const_element_iterator it_row_elem =
59 row_addresses.
mesh.active_local_elements_begin();
60 const libMesh::MeshBase::const_element_iterator it_row_elem_end =
61 row_addresses.
mesh.active_local_elements_end();
79 std::unordered_set<int> col_DoFs_to_allocate;
80 col_DoFs_to_allocate.reserve(col_addresses.
mesh.n_nodes());
82 for( ; it_row_elem != it_row_elem_end; ++it_row_elem )
85 const libMesh::Elem* elem_mediator = *it_row_elem;
88 row_mesh_elem_idx = elem_mediator->id();
91 row_addresses.
set_DoFs(row_mesh_elem_idx);
94 col_DoFs_to_allocate.clear();
97 auto range_elem_col_idx = inter_table.equal_range(row_mesh_elem_idx);
99 for(
auto it = range_elem_col_idx.first; it != range_elem_col_idx.second; ++it)
103 for(
unsigned int iii = 0; iii < col_addresses.
n_dofs; ++iii)
105 col_DoFs_to_allocate.insert(col_addresses.
dof_indices[iii]);
110 for(
auto it = col_DoFs_to_allocate.begin(); it != col_DoFs_to_allocate.end(); ++it)
114 for(
int nnn = 0; nnn < nodes; ++nnn)
116 if( dummy_col_dof > begin_col_DoF[nnn] &&
117 dummy_col_dof < end_col_DoF[nnn])
119 for(
unsigned int jjj = 0; jjj < row_addresses.
dof_indices.size(); ++jjj)
121 ++to_add_per_proc[row_addresses.
dof_indices[jjj]][nnn];
133 for(
int nnn = 0; nnn < nodes; ++nnn)
135 for(
int iii = begin_row_DoF[nnn]; iii < end_row_DoF[nnn]; ++iii)
141 int dummy_total_nz = 0;
142 int dummy_total_oz = 0;
145 for(
int iii = local_begin_row_DoF; iii < local_end_row_DoF; ++iii)
147 for(
int nnn = 0; nnn < rank; ++nnn)
149 local_n_oz[iii - local_begin_row_DoF] += to_add_per_proc[iii][nnn];
150 dummy_total_oz += to_add_per_proc[iii][nnn];
153 local_n_nz[iii - local_begin_row_DoF] += to_add_per_proc[iii][rank];
154 dummy_total_nz += to_add_per_proc[iii][rank];
156 for(
int nnn = rank + 1; nnn < nodes; ++nnn)
158 local_n_oz[iii - local_begin_row_DoF] += to_add_per_proc[iii][nnn];
159 dummy_total_oz += to_add_per_proc[iii][nnn];
166 for(
int iii = local_begin_row_DoF; iii < local_end_row_DoF; ++iii)
168 local_n_nz[iii - local_begin_row_DoF] = 1.1*local_n_nz[iii - local_begin_row_DoF];
169 local_n_nz[iii - local_begin_row_DoF] = std::max(static_cast<unsigned int>(30),local_n_nz[iii - local_begin_row_DoF]);
170 local_n_nz[iii - local_begin_row_DoF] = std::min(static_cast<unsigned int>(col_N_local),local_n_nz[iii - local_begin_row_DoF]);
172 local_n_oz[iii - local_begin_row_DoF] = 1.1*local_n_oz[iii - local_begin_row_DoF];
173 local_n_oz[iii - local_begin_row_DoF] = std::max(static_cast<unsigned int>(10),local_n_oz[iii - local_begin_row_DoF]);
174 local_n_oz[iii - local_begin_row_DoF] = std::min(static_cast<unsigned int>(col_N - col_N_local),local_n_oz[iii - local_begin_row_DoF]);
176 dummy_total_nz += local_n_nz[iii - local_begin_row_DoF];
177 dummy_total_oz += local_n_oz[iii - local_begin_row_DoF];
180 coupling_matrix.init(row_M, col_N, row_M_local, col_N_local, local_n_nz, local_n_oz);
184 const std::string BIG_name,
185 const std::string micro_name,
186 const std::string inter_name,
187 const std::string mediator_name,
189 const libMesh::MeshBase& mesh_R_BIG,
190 const libMesh::MeshBase& mesh_R_micro,
192 const std::unordered_map<
int,std::pair<int,int> >&
193 full_intersection_pairs_map,
194 const std::unordered_map<
int,std::pair<int,int> >&
195 full_intersection_restricted_pairs_map,
196 const std::unordered_map<int,int>&
197 local_intersection_meshI_to_inter_map,
198 const std::unordered_multimap<int,int>& inter_table_mediator_BIG,
199 const std::unordered_multimap<int,int>& inter_table_mediator_micro,
201 const std::string BIG_type,
202 const std::string micro_type,
207 libMesh::EquationSystems& mediator_eq_system =
209 libMesh::EquationSystems& BIG_eq_system =
211 libMesh::EquationSystems& micro_eq_system =
213 libMesh::EquationSystems& inter_eq_system =
216 libMesh::EquationSystems& R_BIG_eq_system =
218 libMesh::EquationSystems& R_micro_eq_system =
223 " Micro equation systems is missing a system type!");
225 " Macro equation systems is missing a system type!");
227 " Restricted micro equation systems missing \"Elasticity\" system!");
229 " Restricted macro equation systems missing \"Elasticity\" system!");
231 " Intersection equation systems missing \"Elasticity\" system!");
233 " Mediatored equation systems missing \"Elasticity\" system!");
236 libMesh::System& volume_mediator_system =
237 libMesh::cast_ref<libMesh::System&>(mediator_eq_system.get_system(
"Elasticity"));
239 libMesh::System& volume_BIG_system =
240 libMesh::cast_ref<libMesh::System&>(BIG_eq_system.get_system<libMesh::ExplicitSystem>(BIG_type));
242 libMesh::System& volume_micro_system =
243 libMesh::cast_ref<libMesh::System&>(micro_eq_system.get_system<libMesh::ExplicitSystem>(micro_type));
245 libMesh::System& volume_inter_system =
246 inter_eq_system.get_system<libMesh::ExplicitSystem>(
"Elasticity");
248 libMesh::System& volume_R_BIG_system =
249 R_BIG_eq_system.get_system<libMesh::ExplicitSystem>(
"Elasticity");
251 libMesh::System& volume_R_micro_system =
252 R_micro_eq_system.get_system<libMesh::ExplicitSystem>(
"Elasticity");
263 const std::vector<libMesh::Point>& quad_points_inter =
265 std::vector<libMesh::Point> quad_points_reference;
268 const std::vector<libMesh::Real>& JxW =
272 const std::vector<std::vector<libMesh::Real> >& phi_inter =
274 std::vector<std::vector<libMesh::Real> > corrected_phi_R_BIG;
275 std::vector<std::vector<libMesh::Real> > corrected_phi_R_micro;
276 std::vector<std::vector<libMesh::Real> > corrected_phi_mediator;
279 const std::vector<std::vector<libMesh::RealGradient> >& dphi_inter =
281 std::vector<std::vector<libMesh::RealGradient> > corrected_dphi_R_BIG;
282 std::vector<std::vector<libMesh::RealGradient> > corrected_dphi_R_micro;
283 std::vector<std::vector<libMesh::RealGradient> > corrected_dphi_mediator;
285 unsigned int n_quadrature_pts = 0;
288 libMesh::PetscMatrix<libMesh::Number>& couplingMatrix_mediator_BIG =
290 libMesh::PetscMatrix<libMesh::Number>& couplingMatrix_mediator_micro =
292 libMesh::PetscMatrix<libMesh::Number>& couplingMatrix_mediator_mediator =
295 const libMesh::Parallel::Communicator& WorldComm = couplingMatrix_mediator_micro.comm();
304 mediator_addresses.set_DoFs();
321 Me_mediator_R_micro.
set_matrices(mediator_addresses, R_micro_addresses);
322 Me_mediator_R_BIG.
set_matrices(mediator_addresses, R_BIG_addresses);
328 const libMesh::Elem* elem_inter =
329 *inter_addresses.
mesh.active_local_elements_begin();
331 n_quadrature_pts = inter_addresses.
fe_unique_ptr->n_quadrature_points();
333 corrected_phi_R_BIG.resize(R_BIG_addresses.
n_dofs_u,
334 std::vector<libMesh::Real>(n_quadrature_pts, 0));
335 corrected_phi_R_micro.resize(R_micro_addresses.
n_dofs_u,
336 std::vector<libMesh::Real>(n_quadrature_pts, 0));
337 corrected_phi_mediator.resize(mediator_addresses.n_dofs_u,
338 std::vector<libMesh::Real>(n_quadrature_pts, 0));
342 corrected_dphi_R_BIG.resize(R_BIG_addresses.
n_dofs_u,
343 std::vector<libMesh::RealGradient>(n_quadrature_pts));
344 corrected_dphi_mediator.resize(mediator_addresses.n_dofs_u,
345 std::vector<libMesh::RealGradient>(n_quadrature_pts));
346 corrected_dphi_R_micro.resize(R_micro_addresses.
n_dofs_u,
347 std::vector<libMesh::RealGradient>(n_quadrature_pts));
352 std::vector<std::vector<libMesh::Real> > lambda_weight_mediator(
353 mediator_addresses.n_dofs_u,
354 std::vector<libMesh::Real>(inter_addresses.
n_dofs_u, 0));
355 std::vector<std::vector<libMesh::Real> > lambda_weight_R_BIG(
357 std::vector<libMesh::Real>(inter_addresses.
n_dofs_u, 0));
358 std::vector<std::vector<libMesh::Real> > lambda_weight_R_micro(
360 std::vector<libMesh::Real>(inter_addresses.
n_dofs_u, 0));
364 couplingMatrix_mediator_BIG,
367 inter_table_mediator_BIG
371 couplingMatrix_mediator_micro,
374 inter_table_mediator_micro
377 couplingMatrix_mediator_mediator.attach_dof_map(mediator_addresses.dof_map);
378 couplingMatrix_mediator_mediator.init();
382 int elem_restrict_BIG_idx = -1;
383 int elem_restrict_micro_idx = -1;
385 int elem_BIG_idx = -1;
386 int elem_micro_idx = -1;
387 int elem_mediator_idx = -1;
388 int elem_inter_idx = -1;
390 std::pair<int, int> restrict_idx_pair;
391 std::pair<int, int> idx_pair;
394 int DEBUG_max_inter_idx = -1;
395 int DEBUG_nb_of_inter_elems = 0;
396 double DEBUG_vol = 0;
399 libMesh::MeshBase::const_element_iterator inter_elIt =
400 inter_addresses.
mesh.active_local_elements_begin();
401 const libMesh::MeshBase::const_element_iterator end_inter_elIt =
402 inter_addresses.
mesh.active_local_elements_end();
404 for( ; inter_elIt != end_inter_elIt; ++inter_elIt )
406 const libMesh::Elem* elem_inter = *inter_elIt;
409 elem_inter_idx = elem_inter->id();
410 inter_idx = local_intersection_meshI_to_inter_map.at(elem_inter_idx);
412 restrict_idx_pair = full_intersection_restricted_pairs_map.at(inter_idx);
413 elem_restrict_BIG_idx = restrict_idx_pair.first;
414 elem_restrict_micro_idx = restrict_idx_pair.second;
416 idx_pair = full_intersection_pairs_map.at(inter_idx);
417 elem_BIG_idx = idx_pair.first;
418 elem_micro_idx = idx_pair.second;
421 elem_mediator_idx = elem_restrict_BIG_idx;
423 const libMesh::Elem* elem_mediator =
424 mediator_addresses.mesh.elem(elem_mediator_idx);
425 const libMesh::Elem* elem_R_BIG =
426 R_BIG_addresses.
mesh.elem(elem_restrict_BIG_idx);
427 const libMesh::Elem* elem_R_micro =
428 R_micro_addresses.
mesh.elem(elem_restrict_micro_idx);
430 mediator_addresses.set_DoFs(elem_mediator_idx);
431 R_BIG_addresses.
set_DoFs(elem_restrict_BIG_idx);
432 R_micro_addresses.
set_DoFs(elem_restrict_micro_idx);
434 BIG_addresses.
set_DoFs(elem_BIG_idx);
435 micro_addresses.
set_DoFs(elem_micro_idx);
452 corrected_phi_R_BIG.resize(R_BIG_addresses.
n_dofs_u,
453 std::vector<libMesh::Real>(n_quadrature_pts, 0));
454 corrected_phi_mediator.resize(mediator_addresses.n_dofs_u,
455 std::vector<libMesh::Real>(n_quadrature_pts, 0));
456 corrected_phi_R_micro.resize(R_micro_addresses.
n_dofs_u,
457 std::vector<libMesh::Real>(n_quadrature_pts, 0));
461 corrected_dphi_R_BIG.resize(R_BIG_addresses.
n_dofs_u,
462 std::vector<libMesh::RealGradient>(n_quadrature_pts));
463 corrected_dphi_mediator.resize(mediator_addresses.n_dofs_u,
464 std::vector<libMesh::RealGradient>(n_quadrature_pts));
465 corrected_dphi_R_micro.resize(R_micro_addresses.
n_dofs_u,
466 std::vector<libMesh::RealGradient>(n_quadrature_pts));
470 Me_mediator_R_micro.
zero();
471 Me_mediator_R_BIG.
zero();
472 Me_mediator_mediator.
zero();
477 if (elem_inter_idx > DEBUG_max_inter_idx)
479 DEBUG_max_inter_idx = elem_inter_idx;
486 DEBUG_vol += elem_inter->volume();
487 ++DEBUG_nb_of_inter_elems;
494 quad_points_inter, quad_points_reference,
495 lambda_weight_R_BIG);
498 elem_R_micro, quad_points_inter, quad_points_reference,
499 lambda_weight_R_micro);
501 get_lambdas(mediator_addresses.dim, mediator_addresses.fe_type,
502 elem_mediator, quad_points_inter, quad_points_reference,
503 lambda_weight_mediator);
506 corrected_phi_R_BIG);
508 corrected_phi_R_micro);
510 corrected_phi_mediator);
515 corrected_dphi_R_BIG);
517 corrected_dphi_R_micro);
519 dphi_inter, corrected_dphi_mediator);
523 for (
unsigned int qp = 0; qp < inter_addresses.
qrule.n_points();
528 R_micro_addresses, qp, corrected_phi_mediator,
529 corrected_phi_R_micro, JxW, L2_coupling_const);
533 R_BIG_addresses, qp, corrected_phi_mediator,
534 corrected_phi_R_BIG, JxW, L2_coupling_const);
538 mediator_addresses, mediator_addresses, qp,
539 corrected_phi_mediator, corrected_phi_mediator, JxW,
548 R_micro_addresses, qp, corrected_dphi_mediator,
549 corrected_dphi_R_micro, JxW, H1_coupling_const);
552 R_BIG_addresses, qp, corrected_dphi_mediator,
553 corrected_dphi_R_BIG, JxW, H1_coupling_const);
556 mediator_addresses, mediator_addresses, qp,
557 corrected_dphi_mediator, corrected_dphi_mediator,
558 JxW, H1_coupling_const);
562 couplingMatrix_mediator_micro.add_matrix(Me_mediator_R_micro.
Me,
563 mediator_addresses.dof_indices, micro_addresses.
dof_indices);
564 couplingMatrix_mediator_BIG.add_matrix(Me_mediator_R_BIG.
Me,
565 mediator_addresses.dof_indices, BIG_addresses.
dof_indices);
566 couplingMatrix_mediator_mediator.add_matrix(Me_mediator_mediator.
Me,
567 mediator_addresses.dof_indices, mediator_addresses.dof_indices);
572 couplingMatrix_mediator_micro.close();
573 couplingMatrix_mediator_BIG.close();
574 couplingMatrix_mediator_mediator.close();
582 std::cout <<
"> COUPLING DEBUG !!! " << std::endl;
583 std::cout <<
">" << std::endl;
584 std::cout <<
"> DEBUG_max_inter_idx = " << DEBUG_max_inter_idx
586 std::cout <<
"> DEBUG_nb_of_inter_elems = "
587 << DEBUG_nb_of_inter_elems << std::endl;
588 std::cout <<
"> DEBUG_vol = " << DEBUG_vol << std::endl
594 const std::string BIG_name,
595 const std::string micro_name,
596 const std::string inter_name,
597 const std::string mediator_name,
599 const libMesh::MeshBase& mesh_R_BIG,
600 const libMesh::MeshBase& mesh_R_micro,
602 const std::unordered_map<
int,std::pair<int,int> >&
603 full_intersection_pairs_map,
604 const std::unordered_map<
int,std::pair<int,int> >&
605 full_intersection_restricted_pairs_map,
606 const std::unordered_map<int,int>&
607 local_intersection_meshI_to_inter_map,
608 const std::unordered_multimap<int,int>& inter_table_mediator_BIG,
609 const std::unordered_multimap<int,int>& inter_table_mediator_micro,
611 const std::string BIG_type,
612 const std::string micro_type,
617 libMesh::EquationSystems& mediator_eq_system =
619 libMesh::EquationSystems& BIG_eq_system =
621 libMesh::EquationSystems& micro_eq_system =
623 libMesh::EquationSystems& inter_eq_system =
626 libMesh::EquationSystems& R_BIG_eq_system =
628 libMesh::EquationSystems& R_micro_eq_system =
633 " Micro equation systems is missing a system type!");
635 " Macro equation systems is missing a system type!");
637 " Restricted micro equation systems missing \"Elasticity\" system!");
639 " Restricted macro equation systems missing \"Elasticity\" system!");
641 " Intersection equation systems missing \"Elasticity\" system!");
643 " Mediatored equation systems missing \"Elasticity\" system!");
646 libMesh::System& volume_mediator_system =
647 libMesh::cast_ref<libMesh::System&>(mediator_eq_system.get_system(
"Elasticity"));
649 libMesh::System& volume_BIG_system =
650 libMesh::cast_ref<libMesh::System&>(BIG_eq_system.get_system<libMesh::ExplicitSystem>(BIG_type));
652 libMesh::System& volume_micro_system =
653 libMesh::cast_ref<libMesh::System&>(micro_eq_system.get_system<libMesh::ExplicitSystem>(micro_type));
655 libMesh::System& volume_inter_system =
656 inter_eq_system.get_system<libMesh::ExplicitSystem>(
"Elasticity");
658 libMesh::System& volume_R_BIG_system =
659 R_BIG_eq_system.get_system<libMesh::ExplicitSystem>(
"Elasticity");
661 libMesh::System& volume_R_micro_system =
662 R_micro_eq_system.get_system<libMesh::ExplicitSystem>(
"Elasticity");
673 const std::vector<libMesh::Point>& quad_points_inter =
675 std::vector<libMesh::Point> quad_points_reference;
678 const std::vector<libMesh::Real>& JxW =
682 const std::vector<std::vector<libMesh::Real> >& phi_inter =
684 std::vector<std::vector<libMesh::Real> > corrected_phi_R_BIG;
685 std::vector<std::vector<libMesh::Real> > corrected_phi_R_micro;
686 std::vector<std::vector<libMesh::Real> > corrected_phi_mediator;
689 const std::vector<std::vector<libMesh::RealGradient> >& dphi_inter =
691 std::vector<std::vector<libMesh::RealGradient> > corrected_dphi_R_BIG;
692 std::vector<std::vector<libMesh::RealGradient> > corrected_dphi_R_micro;
693 std::vector<std::vector<libMesh::RealGradient> > corrected_dphi_mediator;
695 unsigned int n_quadrature_pts = 0;
698 libMesh::PetscMatrix<libMesh::Number> couplingMatrix_mediator_BIG(mesh_R_BIG.comm());
699 libMesh::PetscMatrix<libMesh::Number> couplingMatrix_mediator_micro(mesh_R_BIG.comm());
700 libMesh::PetscMatrix<libMesh::Number> couplingMatrix_mediator_mediator(mesh_R_BIG.comm());
702 const libMesh::Parallel::Communicator& WorldComm = couplingMatrix_mediator_micro.comm();
705 mediator_addresses.set_DoFs();
722 Me_mediator_R_micro.
set_matrices(mediator_addresses, R_micro_addresses);
723 Me_mediator_R_BIG.
set_matrices(mediator_addresses, R_BIG_addresses);
729 const libMesh::Elem* elem_inter =
730 *inter_addresses.
mesh.active_local_elements_begin();
732 n_quadrature_pts = inter_addresses.
fe_unique_ptr->n_quadrature_points();
734 corrected_phi_R_BIG.resize(R_BIG_addresses.
n_dofs_u,
735 std::vector<libMesh::Real>(n_quadrature_pts, 0));
736 corrected_phi_R_micro.resize(R_micro_addresses.
n_dofs_u,
737 std::vector<libMesh::Real>(n_quadrature_pts, 0));
738 corrected_phi_mediator.resize(mediator_addresses.n_dofs_u,
739 std::vector<libMesh::Real>(n_quadrature_pts, 0));
742 corrected_dphi_R_BIG.resize(R_BIG_addresses.
n_dofs_u,
743 std::vector<libMesh::RealGradient>(n_quadrature_pts));
744 corrected_dphi_mediator.resize(mediator_addresses.n_dofs_u,
745 std::vector<libMesh::RealGradient>(n_quadrature_pts));
746 corrected_dphi_R_micro.resize(R_micro_addresses.
n_dofs_u,
747 std::vector<libMesh::RealGradient>(n_quadrature_pts));
752 std::vector<std::vector<libMesh::Real> > lambda_weight_mediator(
753 mediator_addresses.n_dofs_u,
754 std::vector<libMesh::Real>(inter_addresses.
n_dofs_u, 0));
755 std::vector<std::vector<libMesh::Real> > lambda_weight_R_BIG(
757 std::vector<libMesh::Real>(inter_addresses.
n_dofs_u, 0));
758 std::vector<std::vector<libMesh::Real> > lambda_weight_R_micro(
760 std::vector<libMesh::Real>(inter_addresses.
n_dofs_u, 0));
764 couplingMatrix_mediator_BIG,
767 inter_table_mediator_BIG
771 couplingMatrix_mediator_micro,
774 inter_table_mediator_micro
777 couplingMatrix_mediator_mediator.attach_dof_map(mediator_addresses.dof_map);
778 couplingMatrix_mediator_mediator.init();
780 std::cout <<
" ----------------- " << std::endl;
783 int elem_restrict_BIG_idx = -1;
784 int elem_restrict_micro_idx = -1;
786 int elem_BIG_idx = -1;
787 int elem_micro_idx = -1;
788 int elem_mediator_idx = -1;
789 int elem_inter_idx = -1;
791 std::pair<int, int> restrict_idx_pair;
792 std::pair<int, int> idx_pair;
795 int DEBUG_max_inter_idx = -1;
796 int DEBUG_nb_of_inter_elems = 0;
797 double DEBUG_vol = 0;
800 libMesh::MeshBase::const_element_iterator inter_elIt =
801 inter_addresses.
mesh.active_local_elements_begin();
802 const libMesh::MeshBase::const_element_iterator end_inter_elIt =
803 inter_addresses.
mesh.active_local_elements_end();
805 for( ; inter_elIt != end_inter_elIt; ++inter_elIt )
807 const libMesh::Elem* elem_inter = *inter_elIt;
810 elem_inter_idx = elem_inter->id();
811 inter_idx = local_intersection_meshI_to_inter_map.at(elem_inter_idx);
813 restrict_idx_pair = full_intersection_restricted_pairs_map.at(inter_idx);
814 elem_restrict_BIG_idx = restrict_idx_pair.first;
815 elem_restrict_micro_idx = restrict_idx_pair.second;
817 idx_pair = full_intersection_pairs_map.at(inter_idx);
818 elem_BIG_idx = idx_pair.first;
819 elem_micro_idx = idx_pair.second;
822 elem_mediator_idx = elem_restrict_BIG_idx;
824 const libMesh::Elem* elem_mediator =
825 mediator_addresses.mesh.elem(elem_mediator_idx);
826 const libMesh::Elem* elem_R_BIG =
827 R_BIG_addresses.
mesh.elem(elem_restrict_BIG_idx);
828 const libMesh::Elem* elem_R_micro =
829 R_micro_addresses.
mesh.elem(elem_restrict_micro_idx);
831 mediator_addresses.set_DoFs(elem_mediator_idx);
832 R_BIG_addresses.
set_DoFs(elem_restrict_BIG_idx);
833 R_micro_addresses.
set_DoFs(elem_restrict_micro_idx);
835 BIG_addresses.
set_DoFs(elem_BIG_idx);
836 micro_addresses.
set_DoFs(elem_micro_idx);
853 corrected_phi_R_BIG.resize(R_BIG_addresses.
n_dofs_u,
854 std::vector<libMesh::Real>(n_quadrature_pts, 0));
855 corrected_phi_mediator.resize(mediator_addresses.n_dofs_u,
856 std::vector<libMesh::Real>(n_quadrature_pts, 0));
857 corrected_phi_R_micro.resize(R_micro_addresses.
n_dofs_u,
858 std::vector<libMesh::Real>(n_quadrature_pts, 0));
861 corrected_dphi_R_BIG.resize(R_BIG_addresses.
n_dofs_u,
862 std::vector<libMesh::RealGradient>(n_quadrature_pts));
863 corrected_dphi_mediator.resize(mediator_addresses.n_dofs_u,
864 std::vector<libMesh::RealGradient>(n_quadrature_pts));
865 corrected_dphi_R_micro.resize(R_micro_addresses.
n_dofs_u,
866 std::vector<libMesh::RealGradient>(n_quadrature_pts));
869 Me_mediator_R_micro.
zero();
870 Me_mediator_R_BIG.
zero();
871 Me_mediator_mediator.
zero();
875 if (elem_inter_idx > DEBUG_max_inter_idx)
877 DEBUG_max_inter_idx = elem_inter_idx;
883 DEBUG_vol += std::abs(elem_inter->volume());
884 ++DEBUG_nb_of_inter_elems;
891 quad_points_inter, quad_points_reference,
892 lambda_weight_R_BIG);
895 elem_R_micro, quad_points_inter, quad_points_reference,
896 lambda_weight_R_micro);
898 get_lambdas(mediator_addresses.dim, mediator_addresses.fe_type,
899 elem_mediator, quad_points_inter, quad_points_reference,
900 lambda_weight_mediator);
903 corrected_phi_R_BIG);
905 corrected_phi_R_micro);
907 corrected_phi_mediator);
910 corrected_dphi_R_BIG);
912 corrected_dphi_R_micro);
914 dphi_inter, corrected_dphi_mediator);
918 for (
unsigned int qp = 0; qp < inter_addresses.
qrule.n_points();
923 R_micro_addresses, qp, corrected_phi_mediator,
924 corrected_phi_R_micro, JxW, 1);
928 R_BIG_addresses, qp, corrected_phi_mediator,
929 corrected_phi_R_BIG, JxW, 1);
933 mediator_addresses, mediator_addresses, qp,
934 corrected_phi_mediator, corrected_phi_mediator, JxW,
941 R_micro_addresses, qp, corrected_dphi_mediator,
942 corrected_dphi_R_micro, JxW, 0);
945 R_BIG_addresses, qp, corrected_dphi_mediator,
946 corrected_dphi_R_BIG, JxW, 0);
949 mediator_addresses, mediator_addresses, qp,
950 corrected_dphi_mediator, corrected_dphi_mediator,
954 couplingMatrix_mediator_micro.add_matrix(Me_mediator_R_micro.
Me,
955 mediator_addresses.dof_indices, micro_addresses.
dof_indices);
956 couplingMatrix_mediator_BIG.add_matrix(Me_mediator_R_BIG.
Me,
957 mediator_addresses.dof_indices, BIG_addresses.
dof_indices);
958 couplingMatrix_mediator_mediator.add_matrix(Me_mediator_mediator.
Me,
959 mediator_addresses.dof_indices, mediator_addresses.dof_indices);
964 couplingMatrix_mediator_micro.close();
965 couplingMatrix_mediator_BIG.close();
966 couplingMatrix_mediator_mediator.close();
968 std::cout <<
" ----------------- " << std::endl;
970 Vec row_sum_micro, row_sum_BIG, row_sum_mediator;
971 MatCreateVecs(couplingMatrix_mediator_micro.mat(),&row_sum_micro,NULL);
972 MatCreateVecs(couplingMatrix_mediator_BIG.mat(),&row_sum_BIG,NULL);
973 MatCreateVecs(couplingMatrix_mediator_mediator.mat(),&row_sum_mediator,NULL);
975 MatGetRowSum(couplingMatrix_mediator_micro.mat(),row_sum_micro);
976 MatGetRowSum(couplingMatrix_mediator_BIG.mat(),row_sum_BIG);
977 MatGetRowSum(couplingMatrix_mediator_mediator.mat(),row_sum_mediator);
979 PetscScalar coupl_vol_micro = 0, coupl_vol_BIG = 0, coupl_vol_mediator = 0;
981 VecSum(row_sum_micro,&coupl_vol_micro);
982 VecSum(row_sum_BIG,&coupl_vol_BIG);
983 VecSum(row_sum_mediator,&coupl_vol_mediator);
985 mesh_R_BIG.comm().sum(DEBUG_vol);
987 std::cout <<
"> COUPLING DEBUG !!! " << std::endl;
988 std::cout <<
">" << std::endl;
989 std::cout <<
"> DEBUG_max_inter_idx = " << DEBUG_max_inter_idx
991 std::cout <<
"> DEBUG_nb_of_inter_elems = "
992 << DEBUG_nb_of_inter_elems << std::endl;
993 std::cout <<
"> DEBUG_mesh_vol = " << DEBUG_vol
995 std::cout <<
"> DEBUG_micro_vol = " << coupl_vol_micro << std::endl;
996 std::cout <<
"> DEBUG_big_vol = " << coupl_vol_BIG << std::endl;
997 std::cout <<
"> DEBUG_mediator_vol = " << coupl_vol_mediator << std::endl
1000 VecDestroy(&row_sum_micro);
1001 VecDestroy(&row_sum_BIG);
1002 VecDestroy(&row_sum_mediator);
void check_coupling_construction_3D_parallel(const std::string BIG_name, const std::string micro_name, const std::string inter_name, const std::string mediator_name, const libMesh::MeshBase &mesh_R_BIG, const libMesh::MeshBase &mesh_R_micro, const std::unordered_map< int, std::pair< int, int > > &full_intersection_pairs_map, const std::unordered_map< int, std::pair< int, int > > &full_intersection_restricted_pairs_map, const std::unordered_map< int, int > &local_intersection_meshI_to_inter_map, const std::unordered_multimap< int, int > &inter_table_mediator_BIG, const std::unordered_multimap< int, int > &inter_table_mediator_micro, const std::string BIG_type="Elasticity", const std::string micro_type="Elasticity", bool bSameElemsType=true)
void add_H1_coupling_matrix(const libMesh_fe_addresses_3 &system_type_AAA, const libMesh_fe_addresses_3 &system_type_BBB, int qp, const std::vector< std::vector< libMesh::RealGradient > > &corrected_dphi_sysAAA, const std::vector< std::vector< libMesh::RealGradient > > &corrected_dphi_sysBBB, const std::vector< libMesh::Real > &JxW, const libMesh::Number H1_coupling_const)
void get_lambdas(const unsigned int dim, const libMesh::FEType &fe_t, const libMesh::Elem *base_elem, const std::vector< libMesh::Point > &phys_points, std::vector< libMesh::Point > &ref_points, std::vector< std::vector< libMesh::Real > > &lambda_weights)
std::map< std::string, libMesh::EquationSystems * > m_mediator_EquationSystemMap
const bool MASTER_debug_coupling_assemble
std::pair< std::string, libMesh::EquationSystems * > m_BIG_EquationSystem
void set_matrices(libMesh_fe_addresses_3 &system_type_AAA, libMesh_fe_addresses_3 &system_type_BBB)
std::map< std::string, double > m_coupling_widthMap
const libMesh::DofMap & dof_map
std::map< std::string, double > m_coupling_rigidityMap
std::map< std::string, libMesh::EquationSystems * > m_inter_EquationSystemMap
std::map< std::string, libMesh::EquationSystems * > m_R_micro_EquationSystemMap
void set_corrected_shape_gradients(const std::vector< std::vector< libMesh::Real > > &lambda_weights, const std::vector< std::vector< libMesh::RealGradient > > &phi_inter, std::vector< std::vector< libMesh::RealGradient > > &phi_corrected)
std::map< std::string, libMesh::EquationSystems * > m_micro_EquationSystemMap
void assemble_coupling_elasticity_3D_parallel(const std::string BIG_name, const std::string micro_name, const std::string inter_name, const std::string mediator_name, const libMesh::MeshBase &mesh_R_BIG, const libMesh::MeshBase &mesh_R_micro, const std::unordered_map< int, std::pair< int, int > > &full_intersection_pairs_map, const std::unordered_map< int, std::pair< int, int > > &full_intersection_restricted_pairs_map, const std::unordered_map< int, int > &local_intersection_meshI_to_inter_map, const std::unordered_multimap< int, int > &inter_table_mediator_BIG, const std::unordered_multimap< int, int > &inter_table_mediator_micro, const std::string BIG_type="Elasticity", const std::string micro_type="Elasticity", bool bSameElemsType=true)
const libMesh::MeshBase & mesh
std::pair< std::string, libMesh::EquationSystems * > m_R_BIG_EquationSystem
libMesh::DenseMatrix< libMesh::Number > Me
std::map< std::string, bool > m_bUseH1Coupling
void build_L2_coupling_matrix(const libMesh_fe_addresses_3 &system_type_AAA, const libMesh_fe_addresses_3 &system_type_BBB, int qp, const std::vector< std::vector< libMesh::Real > > &corrected_phi_AAA, const std::vector< std::vector< libMesh::Real > > &corrected_phi_BBB, const std::vector< libMesh::Real > &JxW, double L2_coupling_const)
std::vector< libMesh::dof_id_type > dof_indices
std::map< std::string, libMesh::PetscMatrix< libMesh::Number > * > m_couplingMatrixMap_mediator_mediator
std::map< std::string, libMesh::PetscMatrix< libMesh::Number > * > m_couplingMatrixMap_mediator_BIG
void set_corrected_shapes(const std::vector< std::vector< libMesh::Real > > &lambda_weights, const std::vector< std::vector< libMesh::Real > > &phi_inter, std::vector< std::vector< libMesh::Real > > &phi_corrected)
std::map< std::string, libMesh::PetscMatrix< libMesh::Number > * > m_couplingMatrixMap_mediator_micro
void print_matrix_dim(libMesh::PetscMatrix< libMesh::Number > &CouplingTestMatrix, bool bDetailed=false)
void prepare_coupling_preallocation(libMesh::PetscMatrix< libMesh::Number > &coupling_matrix, libMesh_fe_addresses_3 &row_addresses, libMesh_fe_addresses_3 &col_addresses, const std::unordered_multimap< int, int > &inter_table)
void MPI_reduce_vector(std::vector< T > &r, int root, const libMesh::Parallel::Communicator &Comm)
libMesh::UniquePtr< libMesh::FEBase > fe_unique_ptr