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");
664 libMesh_fe_addresses_3 mediator_addresses(volume_mediator_system);
665 libMesh_fe_addresses_3 BIG_addresses(volume_BIG_system);
666 libMesh_fe_addresses_3 micro_addresses(volume_micro_system);
667 libMesh_fe_addresses_3 inter_addresses(volume_inter_system);
669 libMesh_fe_addresses_3 R_BIG_addresses(volume_R_BIG_system);
670 libMesh_fe_addresses_3 R_micro_addresses(volume_R_micro_system);
673 const std::vector<libMesh::Point>& quad_points_inter =
674 inter_addresses.fe_unique_ptr->get_xyz();
675 std::vector<libMesh::Point> quad_points_reference;
678 const std::vector<libMesh::Real>& JxW =
679 inter_addresses.fe_unique_ptr->get_JxW();
682 const std::vector<std::vector<libMesh::Real> >& phi_inter =
683 inter_addresses.fe_unique_ptr->get_phi();
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 =
690 inter_addresses.fe_unique_ptr->get_dphi();
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();
706 BIG_addresses.set_DoFs();
707 micro_addresses.set_DoFs();
708 inter_addresses.set_DoFs();
710 R_BIG_addresses.set_DoFs();
711 R_micro_addresses.set_DoFs();
714 coupling_matrices_3 Me_mediator_R_micro;
715 coupling_matrices_3 Me_mediator_R_BIG;
716 coupling_matrices_3 Me_mediator_mediator;
722 Me_mediator_R_micro.set_matrices(mediator_addresses, R_micro_addresses);
723 Me_mediator_R_BIG.set_matrices(mediator_addresses, R_BIG_addresses);
724 Me_mediator_mediator.set_matrices(mediator_addresses,
729 const libMesh::Elem* elem_inter =
730 *inter_addresses.mesh.active_local_elements_begin();
731 inter_addresses.fe_unique_ptr->reinit(elem_inter);
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(
756 R_BIG_addresses.n_dofs_u,
757 std::vector<libMesh::Real>(inter_addresses.n_dofs_u, 0));
758 std::vector<std::vector<libMesh::Real> > lambda_weight_R_micro(
759 R_micro_addresses.n_dofs_u,
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);
841 Me_mediator_R_micro.set_matrices(mediator_addresses,
843 Me_mediator_R_BIG.set_matrices(mediator_addresses,
845 Me_mediator_mediator.set_matrices(mediator_addresses,
849 inter_addresses.fe_unique_ptr->reinit(elem_inter);
851 inter_addresses.fe_unique_ptr->n_quadrature_points();
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;
888 inter_addresses.fe_unique_ptr->reinit(elem_inter);
890 get_lambdas(R_BIG_addresses.dim, R_BIG_addresses.fe_type, elem_R_BIG,
891 quad_points_inter, quad_points_reference,
892 lambda_weight_R_BIG);
894 get_lambdas(R_micro_addresses.dim, R_micro_addresses.fe_type,
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();
922 Me_mediator_R_micro.build_L2_coupling_matrix(mediator_addresses,
923 R_micro_addresses, qp, corrected_phi_mediator,
924 corrected_phi_R_micro, JxW, 1);
927 Me_mediator_R_BIG.build_L2_coupling_matrix(mediator_addresses,
928 R_BIG_addresses, qp, corrected_phi_mediator,
929 corrected_phi_R_BIG, JxW, 1);
932 Me_mediator_mediator.build_L2_coupling_matrix(
933 mediator_addresses, mediator_addresses, qp,
934 corrected_phi_mediator, corrected_phi_mediator, JxW,
940 Me_mediator_R_micro.add_H1_coupling_matrix(mediator_addresses,
941 R_micro_addresses, qp, corrected_dphi_mediator,
942 corrected_dphi_R_micro, JxW, 0);
944 Me_mediator_R_BIG.add_H1_coupling_matrix(mediator_addresses,
945 R_BIG_addresses, qp, corrected_dphi_mediator,
946 corrected_dphi_R_BIG, JxW, 0);
948 Me_mediator_mediator.add_H1_coupling_matrix(
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 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
std::pair< std::string, libMesh::EquationSystems * > m_BIG_EquationSystem
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
std::pair< std::string, libMesh::EquationSystems * > m_R_BIG_EquationSystem
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)
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)