data.cpp stdexcept mfem/linalg/vector.hpp mfem/fem/fe/fe_base.hpp mfem/fem/fespace.hpp serif/backend/mfem/mapping/data.hpp serif/utils/error/errors.hpp serif serif::mapping #include<stdexcept> #include"mfem/linalg/vector.hpp" #include"mfem/fem/fe/fe_base.hpp" #include"mfem/fem/fespace.hpp" #include"serif/backend/mfem/mapping/data.hpp" #include"serif/utils/error/errors.hpp" namespaceserif::mapping{ usingnamespaceserif::utils::errors; ElementDisplacementData::ElementDisplacementData( constmfem::FiniteElement&element, mfem::Vector&displacement_dofs ):m_element(&element),m_dimension(0){ constintdof_count=element.GetDof(); //TODO:Changethesetoserif_ensurecallswithappropriateerrorcodes if(dof_count<=0){ serif_error<std::invalid_argument, SERiFErrorCode::INVALID_DOF_COUNT>("ElementDisplacementData:Displacementelementsmusthaveatleastonedegreeoffreedom.Gotanelementwith{}dofs",dof_count); } if(displacement_dofs.Size()<=0||displacement_dofs.Size()%dof_count!=0){ serif_error<std::invalid_argument,SERiFErrorCode::INVALID_DOF_COUNT>("ElementDisplacementData:Thedisplacementvectorsize({})mustbeapositivemultipleoftheelementdegreeoffreedomcount({}).",displacement_dofs.Size(),dof_count); } m_dimension=displacement_dofs.Size()/dof_count; m_dof_matrix.SetSize(dof_count,m_dimension); for(intcomponentID=0;componentID<m_dimension;++componentID){ for(intdofID=0;dofID<dof_count;++dofID){ m_dof_matrix(dofID,componentID)=displacement_dofs(dofID+componentID*dof_count); } } } constmfem::FiniteElement&ElementDisplacementData::get_element()constnoexcept{ return*m_element; } constmfem::DenseMatrix&ElementDisplacementData::get_dof_matrix()constnoexcept{ returnm_dof_matrix; } intElementDisplacementData::get_dimension()constnoexcept{ returnm_dimension; } intElementDisplacementData::get_dof_count()constnoexcept{ returnm_element->GetDof(); } ElementDisplacementDataelement_displacement_data_from_element_vdofs(constmfem::FiniteElement&element,mfem::Vector&displacement_dofs){ returnElementDisplacementData(element,displacement_dofs); } ElementCompactificationData::ElementCompactificationData( constmfem::FiniteElement&element, constmfem::Vector&dofs ):m_element(&element),m_dofs(dofs){ if(element.GetRangeType()!=mfem::FiniteElement::SCALAR){ serif_error<std::invalid_argument,SERiFErrorCode::INVALID_COMPACTIFICATION_RANK>("Compactificationcoordinaterequiresascalarfiniteelement."); } if(element.GetMapType()!=mfem::FiniteElement::VALUE){ serif_error<std::invalid_argument,SERiFErrorCode::INVALID_COMPACTIFICATION_TYPE>("Compactificationcoordinaterequiresavalue-mappedscalarfiniteelement"); } if(element.GetDerivType()!=mfem::FiniteElement::GRAD){ serif_error<std::invalid_argument,SERiFErrorCode::INVALID_COMPACTIFICATION_DERIVATIVE_TYPE>("Compactificationcoordinatefiniteelementmustprovideagradient"); } if(element.GetDof()<=0){ serif_error<std::invalid_argument,SERiFErrorCode::INVALID_DOF_COUNT>("Compactificationcoordinatgefiniteelementmusthaveapositivenon-zeronumberofdegreesoffreedom.Recived{}",element.GetDof()); } if(dofs.Size()!=element.GetDof()){ serif_error<std::invalid_argument,SERiFErrorCode::INVALID_DOF_COUNT>("Compactificationcoordinatedegreeoffreedomcount({})doesnotmatchitsfiniteelementdofcount({})",dofs.Size(),element.GetDof()); } } constmfem::FiniteElement&ElementCompactificationData::get_element()constnoexcept{ return*m_element; } constmfem::Vector&ElementCompactificationData::get_dofs()constnoexcept{ returnm_dofs; } intElementCompactificationData::get_dof_count()constnoexcept{ returnm_dofs.Size(); } DMWorkspace::DMWorkspace(constintdimension){ set_dimension(dimension); } voidDMWorkspace::set_dimension(constintdimension){ if(dimension<=0){ serif_error<std::invalid_argument, SERiFErrorCode::INVALID_DIMENSION>("Domainmappingworkspacedimensionmustbepositiveandfinite.Received{}",dimension); } m_dimension=dimension; m_field_value.SetSize(dimension); m_field_jacobian.SetSize(dimension,dimension); m_reference_field_jacobian.SetSize(dimension,dimension); m_compactification_point.compactification_coordinate=0.0; m_compactification_point.coordinate_gradient.SetSize(dimension); m_reference_normal.SetSize(dimension); m_mapped_normal.SetSize(dimension); m_full_element_jacobian.SetSize(dimension,dimension); m_vector_temp.SetSize(dimension); m_matrix_temp_1.SetSize(dimension,dimension); m_matrix_temp_2.SetSize(dimension,dimension); m_exterior_result.physical_position.SetSize(dimension); m_exterior_result.mapping_jacobian.SetSize(dimension,dimension); m_exterior_variation.physical_position_variation.SetSize(dimension); m_exterior_variation.mapping_jacobian_variation.SetSize(dimension,dimension); } intDMWorkspace::get_dimension()constnoexcept{ returnm_dimension; } }