transformations.cpp serif/backend/mfem/mapping/transformations.hpp serif/utils/error/errors.hpp mfem/linalg/vector.hpp mfem/linalg/densemat.hpp serif serif::mapping #include"serif/backend/mfem/mapping/transformations.hpp" #include"serif/utils/error/errors.hpp" #include"mfem/linalg/vector.hpp" #include"mfem/linalg/densemat.hpp" namespaceserif::mapping{ usingnamespaceserif::utils::errors; voidmap_reference_gradient_to_physical(constMappingPointContext&context,constmfem::Vector&reference_gradient,mfem::Vector&physical_gradient){ serif_assert<SERiFErrorCode::INVALID_DIMENSION>(reference_gradient.Size()==context.inverse_mapping_jacobian.Height(),"Referencegradientvectorhasincompatibledimensionwiththeinversemappingjacobian({}<=>{}).",reference_gradient.Size(),context.inverse_mapping_jacobian.Height()); physical_gradient.SetSize(reference_gradient.Size()); context.inverse_mapping_jacobian.MultTranspose(reference_gradient,physical_gradient); } voidmap_physical_gradient_to_reference(constMappingPointContext&context,constmfem::Vector&physical_gradient,mfem::Vector&reference_gradient){ serif_assert<SERiFErrorCode::INVALID_DIMENSION>(physical_gradient.Size()==context.mapping_jacobian.Height(),"Physicalgradientvectorhasincompatibledimensionwiththemappingjacobian({}<=>{}).",physical_gradient.Size(),context.mapping_jacobian.Height()); reference_gradient.SetSize(physical_gradient.Size()); context.mapping_jacobian.MultTranspose(physical_gradient,reference_gradient); } voidmap_reference_vector_gradient_to_physical(constMappingPointContext&context,constmfem::DenseMatrix&reference_vector_gradient,mfem::DenseMatrix&physical_vector_gradient){ serif_assert<SERiFErrorCode::INVALID_DIMENSION>(reference_vector_gradient.Width()==context.inverse_mapping_jacobian.Height(),"Referencevectorgradientmatrixhasincompatibledimensionwiththeinversemappingjacobian({}<=>{}).",reference_vector_gradient.Width(),context.inverse_mapping_jacobian.Height()); physical_vector_gradient.SetSize(reference_vector_gradient.Height(),context.inverse_mapping_jacobian.Width()); mfem::Mult(reference_vector_gradient,context.inverse_mapping_jacobian,physical_vector_gradient); } voidmap_physical_vector_gradient_to_reference(constMappingPointContext&context,constmfem::DenseMatrix&physical_vector_gradient,mfem::DenseMatrix&reference_vector_gradient){ serif_assert<SERiFErrorCode::INVALID_DIMENSION>(physical_vector_gradient.Width()==context.mapping_jacobian.Height(),"Physicalvectorgradientmatrixhasincompatibledimensionwiththemappingjacobian({}<=>{}).",physical_vector_gradient.Width(),context.mapping_jacobian.Height()); reference_vector_gradient.SetSize(physical_vector_gradient.Height(),context.mapping_jacobian.Width()); mfem::Mult(physical_vector_gradient,context.mapping_jacobian,reference_vector_gradient); } voidcompute_scalar_diffusion_tensor(constMappingPointContext&context,mfem::DenseMatrix&diffusion_tensor){ constintdimension=context.mapping_jacobian.Height(); serif_assert<SERiFErrorCode::JACOBIAN_SHAPE_ERROR>((context.inverse_mapping_jacobian.Width()==dimension)&&(context.inverse_mapping_jacobian.Height()==dimension),"Inversemappingjacobianisnotsquare({}x{}).Itisexpectedtohaveshape{}x{}",context.inverse_mapping_jacobian.Height(),context.inverse_mapping_jacobian.Width(),dimension,dimension); serif_assert<SERiFErrorCode::INVERTED_JACOBIAN>(context.mapping_determinate>0.0,"Mappingjacobiandeterminantisnon-positive({}).Themappingmaybeinvertedordegenerate.",context.mapping_determinate); diffusion_tensor.SetSize(dimension,dimension); mfem::MultABt(context.inverse_mapping_jacobian,context.inverse_mapping_jacobian,diffusion_tensor); diffusion_tensor*=context.mapping_determinate; } voidmap_hcurl_field_to_physical(constMappingPointContext&context,constmfem::Vector&reference_field,mfem::Vector&physical_field){ serif_assert<SERiFErrorCode::INVALID_DIMENSION>(reference_field.Size()==context.inverse_mapping_jacobian.Height(),"Referencefieldvectorhasincompatibledimensionwiththeinversemappingjacobian({}<=>{}).",reference_field.Size(),context.inverse_mapping_jacobian.Height()); physical_field.SetSize(reference_field.Size()); context.inverse_mapping_jacobian.MultTranspose(reference_field,physical_field); } voidmap_physical_field_to_hcurl_reference(constMappingPointContext&context,constmfem::Vector&physical_field,mfem::Vector&reference_field){ serif_assert<SERiFErrorCode::INVALID_DIMENSION>(physical_field.Size()==context.mapping_jacobian.Height(),"Physicalfieldvectorhasincompatibledimensionwiththemappingjacobian({}<=>{}).",physical_field.Size(),context.mapping_jacobian.Height()); reference_field.SetSize(physical_field.Size()); context.mapping_jacobian.MultTranspose(physical_field,reference_field); } voidmap_hcurl_curl_to_physical(constMappingPointContext&context,constmfem::Vector&reference_curl,mfem::Vector&physical_curl){ serif_assert<SERiFErrorCode::INVALID_DIMENSION>(reference_curl.Size()==context.mapping_jacobian.Width(),"Referencecurlvectorhasincompatibledimensionwiththemappingjacobian({}<=>{}).",reference_curl.Size(),context.mapping_jacobian.Height()); physical_curl.SetSize(reference_curl.Size()); context.mapping_jacobian.Mult(reference_curl,physical_curl); physical_curl/=context.mapping_determinate; } voidmap_physical_curl_to_hcurl_reference(constMappingPointContext&context,constmfem::Vector&physical_curl,mfem::Vector&reference_curl){ serif_assert<SERiFErrorCode::INVALID_DIMENSION>(physical_curl.Size()==context.inverse_mapping_jacobian.Width(),"Physicalcurlvectorhasincompatibledimensionwiththeinversemappingjacobian({}<=>{}).",physical_curl.Size(),context.inverse_mapping_jacobian.Height()); reference_curl.SetSize(physical_curl.Size()); context.inverse_mapping_jacobian.Mult(physical_curl,reference_curl); reference_curl*=context.mapping_determinate; } }