Exemple #1
0
        private static void CalculatePressure1D(
            Element element,
            Edge edge,
            PressureBoundaryCondition pressure,
            IList <ControlPoint> controlPoints,
            IList <GaussLegendrePoint3D> gaussPoints,
            IDictionary <int, double> pressureLoad)
        {
            var nurbs = new Nurbs1D(element, controlPoints, edge);

            for (int j = 0; j < gaussPoints.Count; j++)
            {
                double xGaussPoint          = 0;
                double yGaussPoint          = 0;
                double jacobian1            = 0.0;
                double jacobian2            = 0.0;
                var    elementControlPoints = element.ControlPointsDictionary.Values.ToArray();
                for (int k = 0; k < elementControlPoints.Length; k++)
                {
                    xGaussPoint += nurbs.NurbsValues[k, j] * elementControlPoints[k].X;
                    yGaussPoint += nurbs.NurbsValues[k, j] * elementControlPoints[k].Y;
                    jacobian1   += nurbs.NurbsDerivativeValuesKsi[k, j] * elementControlPoints[k].X;
                    jacobian2   += nurbs.NurbsDerivativeValuesKsi[k, j] * elementControlPoints[k].Y;
                }

                double jacdet = Math.Sqrt(Math.Pow(jacobian1, 2) + Math.Pow(jacobian2, 2));

                double norm            = Math.Sqrt(Math.Pow(xGaussPoint, 2) + Math.Pow(yGaussPoint, 2));
                var    loadGaussPointX = pressure.Value * xGaussPoint / norm;
                var    loadGaussPointY = pressure.Value * yGaussPoint / norm;

                for (int k = 0; k < elementControlPoints.Length; k++)
                {
                    int dofIDX =
                        element.Model.GlobalDofOrdering.GlobalFreeDofs[elementControlPoints[k], StructuralDof.TranslationX];
                    int dofIDY =
                        element.Model.GlobalDofOrdering.GlobalFreeDofs[elementControlPoints[k], StructuralDof.TranslationY];
                    if (pressureLoad.ContainsKey(dofIDX))
                    {
                        pressureLoad[dofIDX] +=
                            jacdet * gaussPoints[j].WeightFactor * nurbs.NurbsValues[k, j] * loadGaussPointX;
                    }
                    else
                    {
                        pressureLoad.Add(dofIDX, jacdet * gaussPoints[j].WeightFactor * nurbs.NurbsValues[k, j] * loadGaussPointX);
                    }

                    if (pressureLoad.ContainsKey(dofIDY))
                    {
                        pressureLoad[dofIDY] +=
                            jacdet * gaussPoints[j].WeightFactor * nurbs.NurbsValues[k, j] * loadGaussPointY;
                    }
                    else
                    {
                        pressureLoad.Add(dofIDY, jacdet * gaussPoints[j].WeightFactor * nurbs.NurbsValues[k, j] * loadGaussPointY);
                    }
                }
            }
        }
Exemple #2
0
        private static void CalculatePressure1D(
            Element element,
            Edge edge,
            NeumannBoundaryCondition neumann,
            IList <ControlPoint> controlPoints,
            IList <GaussLegendrePoint3D> gaussPoints,
            IDictionary <int, double> neumannLoad)
        {
            var nurbs = new Nurbs1D(element, controlPoints, edge);

            for (int j = 0; j < gaussPoints.Count; j++)
            {
                double xGaussPoint          = 0;
                double yGaussPoint          = 0;
                double zGaussPoint          = 0;
                double jacobian1            = 0.0;
                double jacobian2            = 0.0;
                var    elementControlPoints = element.ControlPointsDictionary.Values.ToArray();
                for (int k = 0; k < elementControlPoints.Length; k++)
                {
                    xGaussPoint += nurbs.NurbsValues[k, j] * elementControlPoints[k].X;
                    yGaussPoint += nurbs.NurbsValues[k, j] * elementControlPoints[k].Y;
                    zGaussPoint += nurbs.NurbsValues[k, j] * elementControlPoints[k].Z;
                    jacobian1   += nurbs.NurbsDerivativeValuesKsi[k, j] * elementControlPoints[k].X;
                    jacobian2   += nurbs.NurbsDerivativeValuesKsi[k, j] * elementControlPoints[k].Y;
                }

                double jacdet         = Math.Sqrt(Math.Pow(jacobian1, 2) + Math.Pow(jacobian2, 2));
                var    loadGaussPoint = neumann.Value(xGaussPoint, yGaussPoint, zGaussPoint);

                for (int k = 0; k < element.ControlPointsDictionary.Count; k++)
                {
                    if (element.Model.GlobalDofOrdering.GlobalFreeDofs.Contains(elementControlPoints[k],
                                                                                StructuralDof.TranslationX))
                    {
                        int dofIDX =
                            element.Model.GlobalDofOrdering.GlobalFreeDofs[elementControlPoints[k],
                                                                           StructuralDof.TranslationX];
                        if (neumannLoad.ContainsKey(dofIDX))
                        {
                            neumannLoad[dofIDX] += jacdet * gaussPoints[j].WeightFactor * nurbs.NurbsValues[k, j] *
                                                   loadGaussPoint[0];
                        }
                        else
                        {
                            neumannLoad.Add(
                                dofIDX,
                                jacdet * gaussPoints[j].WeightFactor * nurbs.NurbsValues[k, j] * loadGaussPoint[0]);
                        }
                    }

                    if (!element.Model.GlobalDofOrdering.GlobalFreeDofs.Contains(
                            elementControlPoints[k],
                            StructuralDof.TranslationY))
                    {
                        continue;
                    }

                    var dofIDY =
                        element.Model.GlobalDofOrdering.GlobalFreeDofs[
                            elementControlPoints[k],
                            StructuralDof.TranslationY];
                    if (neumannLoad.ContainsKey(dofIDY))
                    {
                        neumannLoad[dofIDY] += jacdet * gaussPoints[j].WeightFactor * nurbs.NurbsValues[k, j] *
                                               loadGaussPoint[1];
                    }
                    else
                    {
                        neumannLoad.Add(dofIDY,
                                        jacdet * gaussPoints[j].WeightFactor * nurbs.NurbsValues[k, j] * loadGaussPoint[1]);
                    }
                }
            }
        }