예제 #1
0
SmartPtr<IElemProlongation<TDomain> >
GetStandardElementProlongation(const LFEID& lfeid)
{
	switch(lfeid.type()){
		case LFEID::LAGRANGE:
			if(lfeid.order() == 1)
				return make_sp(new P1LagrangeElemTransfer<TDomain>(lfeid));
			else
				return make_sp(new StdLagrangeElemTransfer<TDomain>(lfeid));
		case LFEID::PIECEWISE_CONSTANT:
			return make_sp(new PiecewiseConstantElemTransfer<TDomain>(lfeid));

		case LFEID::CROUZEIX_RAVIART:
			return make_sp(new CrouzeixRaviartElemTransfer<TDomain>(lfeid));

		default: UG_THROW("No Standard Element Prolongation found for "<<lfeid);
	}
}
void ConvectionDiffusionFE<Domain2d>::
register_all_funcs(const LFEID& lfeid, const int quadOrder)
{
	register_func<RegularEdge, DimFEGeometry<dim, 1> >();

	const int order = lfeid.order();
	if(quadOrder != 2*order+1 || lfeid.type() != LFEID::LAGRANGE)
	{
		register_func<Triangle, DimFEGeometry<dim> >();
		register_func<Quadrilateral, DimFEGeometry<dim> >();
		return;
	}

//	special compiled cases

//	Triangle
	switch(order)
	{
		case 1:	{typedef FEGeometry<Triangle, dim, LagrangeLSFS<ReferenceTriangle, 1>, GaussQuadrature<ReferenceTriangle, 3> > FEGeom;
				 register_func<Triangle, FEGeom >(); break;}
		case 2:	{typedef FEGeometry<Triangle, dim, LagrangeLSFS<ReferenceTriangle, 2>, GaussQuadrature<ReferenceTriangle, 5> > FEGeom;
				 register_func<Triangle, FEGeom >(); break;}
		case 3:	{typedef FEGeometry<Triangle, dim, LagrangeLSFS<ReferenceTriangle, 3>, GaussQuadrature<ReferenceTriangle, 7> > FEGeom;
				 register_func<Triangle, FEGeom >(); break;}
		default: register_func<Triangle, DimFEGeometry<dim> >();  break;
	}

//	Quadrilateral
	switch(order) {
		case 1:	{typedef FEGeometry<Quadrilateral, dim, LagrangeLSFS<ReferenceQuadrilateral, 1>, GaussQuadrature<ReferenceQuadrilateral, 3> > FEGeom;
				 register_func<Quadrilateral, FEGeom >(); break;}
		case 2:	{typedef FEGeometry<Quadrilateral, dim, LagrangeLSFS<ReferenceQuadrilateral, 2>, GaussQuadrature<ReferenceQuadrilateral, 7> > FEGeom;
				 register_func<Quadrilateral, FEGeom >(); break;}
		case 3:	{typedef FEGeometry<Quadrilateral, dim, LagrangeLSFS<ReferenceQuadrilateral, 3>, GaussQuadrature<ReferenceQuadrilateral, 11> > FEGeom;
				 register_func<Quadrilateral, FEGeom >(); break;}
		default: register_func<Quadrilateral, DimFEGeometry<dim> >();  break;
	}
}
void ConvectionDiffusionFE<Domain3d>::
register_all_funcs(const LFEID& lfeid, const int quadOrder)
{
	register_func<RegularEdge, DimFEGeometry<dim, 1> >();
	register_func<Triangle, DimFEGeometry<dim, 2> >();
	register_func<Quadrilateral, DimFEGeometry<dim, 2> >();

	const int order = lfeid.order();
	if(quadOrder != 2*order+1 || lfeid.type() != LFEID::LAGRANGE)
	{
		register_func<Tetrahedron, DimFEGeometry<dim> >();
		register_func<Prism, DimFEGeometry<dim> >();
		register_func<Pyramid, DimFEGeometry<dim> >();
		register_func<Hexahedron, DimFEGeometry<dim> >();
		register_func<Octahedron, DimFEGeometry<dim> >();
		return;
	}

//	special compiled cases

//	Tetrahedron
	switch(order)
	{
		case 1:	{typedef FEGeometry<Tetrahedron, dim, LagrangeLSFS<ReferenceTetrahedron, 1>, GaussQuadrature<ReferenceTetrahedron, 3> > FEGeom;
				 register_func<Tetrahedron, FEGeom >(); break;}
		case 2:	{typedef FEGeometry<Tetrahedron, dim, LagrangeLSFS<ReferenceTetrahedron, 2>, GaussQuadrature<ReferenceTetrahedron, 5> > FEGeom;
				 register_func<Tetrahedron, FEGeom >(); break;}
		case 3:	{typedef FEGeometry<Tetrahedron, dim, LagrangeLSFS<ReferenceTetrahedron, 3>, GaussQuadrature<ReferenceTetrahedron, 7> > FEGeom;
				 register_func<Tetrahedron, FEGeom >(); break;}
		default: register_func<Tetrahedron, DimFEGeometry<dim> >();  break;
	}

//	Prism
	switch(order) {
		default: register_func<Prism, DimFEGeometry<dim> >();  break;
	}

//	Pyramid
	switch(order)
	{
		default: register_func<Pyramid, DimFEGeometry<dim> >();  break;
	}

//	Octahedron
	switch(order)
	{
		default: register_func<Octahedron, DimFEGeometry<dim> >();  break;
	}

//	Hexahedron
	switch(order)
	{
		case 1:	{typedef FEGeometry<Hexahedron, dim, LagrangeLSFS<ReferenceHexahedron, 1>, GaussQuadrature<ReferenceHexahedron, 3> > FEGeom;
				 register_func<Hexahedron, FEGeom >(); break;}
		case 2:	{typedef FEGeometry<Hexahedron, dim, LagrangeLSFS<ReferenceHexahedron, 2>, GaussQuadrature<ReferenceHexahedron, 7> > FEGeom;
				 register_func<Hexahedron, FEGeom >(); break;}
		case 3:	{typedef FEGeometry<Hexahedron, dim, LagrangeLSFS<ReferenceHexahedron, 3>, GaussQuadrature<ReferenceHexahedron, 11> > FEGeom;
				 register_func<Hexahedron, FEGeom >(); break;}
		default: register_func<Hexahedron, DimFEGeometry<dim> >();  break;
	}
}