protected override double CreateMatrixElement(BoundaryElement <T> elem1, BoundaryElement <T> elem2, ConditionType conditionType) { switch (conditionType) { case ConditionType.Dirichlet: if (elem1.Bound.IsOuter && elem2.Bound.IsOuter) { return(Integrator.Integrate(elem1, elem2.Center, FundamentalSolution)); } if (elem1.Bound.IsOuter && !elem2.Bound.IsOuter) { return(Integrator.IntegratedQdnx(elem1, elem2, Derivates)); } if (!elem1.Bound.IsOuter && elem2.Bound.IsOuter) { return(Integrator.IntegratedQdny(elem1, elem2, Derivates)); } if (!elem1.Bound.IsOuter && !elem2.Bound.IsOuter) { return(lambda * Kroneker(elem1, elem2) + Integrator.IntegratedQdnxdny(elem1, elem2, Derivates)); } break; } return(double.NaN); }
protected override double CreateMatrixElement( BoundaryElement <T> elem1, BoundaryElement <T> elem2, ConditionType conditionType) { if (conditionType == ConditionType.Robin) { var IsExponental = true; if (IsExponental) { var enumerator = KirghoffTransformation.U0 * KirghoffTransformation.U0 * KirghoffTransformation.LAMDA0 * Integrator.Integrate(elem1, elem2.Center, FundamentalSolution); var denumerator = KirghoffTransformation.BETALAMDA * KirghoffTransformation.BETALAMDA * (U(elem2.Center, solution) + 1); return(KirghoffTransformation.Nuv(elem2.Center) * enumerator / denumerator - 0.5 * Kroneker(elem1, elem2) + Integrator.IntegratedQdnx(elem1, elem2, Derivates)); } else { var enumerator = Integrator.Integrate(elem1, elem2.Center, FundamentalSolution); var denumerator = Math.Sqrt( 1 + 2 * KirghoffTransformation.BETALAMDA * U(elem2.Center, solution) / (KirghoffTransformation.LAMDA0 * KirghoffTransformation.U0)); return(KirghoffTransformation.Nuv(elem2.Center) * enumerator / (KirghoffTransformation.LAMDA0 * denumerator) - 0.5 * Kroneker(elem1, elem2) + Integrator.IntegratedQdnx(elem1, elem2, Derivates)); } } else { return(0); } }
protected override double CreateMatrixElement(BoundaryElement <T> elem1, BoundaryElement <T> elem2, ConditionType conditionType) { switch (conditionType) { case ConditionType.Dirichlet: return(Integrator.Integrate(elem1, elem2.Center, FundamentalSolution)); case ConditionType.Neumann: return(Integrator.IntegratedQdnx(elem1, elem2, Derivates)); case ConditionType.Robin: return(Integrator.Integrate(elem1, elem2.Center, FundamentalSolution) - Integrator.IntegratedQdnx(elem1, elem2, Derivates)); } return(double.NaN); }
protected override double CreateMatrixElement(BoundaryElement <Point3D> elem1, BoundaryElement <Point3D> elem2, ConditionType conditionType) { if (elem1.Bound.Name == BoundNumber.Bound12 && elem2.Bound.Name == BoundNumber.Bound12) { return(Integrator.Integrate(elem1, elem2.Center, functionsForSemiSpace.U1)); } if (elem1.Bound.Name == BoundNumber.Bound12 && elem2.Bound.Name == BoundNumber.Bound2) { return(-Integrator.Integrate(elem1, elem2.Center, functionsForSemiSpace.U2)); } if (elem1.Bound.Name == BoundNumber.Bound12 && elem2.Bound.Name == BoundNumber.Bound13) { return(Integrator.Integrate(elem1, elem2.Center, functionsForSemiSpace.U1)); } if (elem1.Bound.Name == BoundNumber.Bound12 && elem2.Bound.Name == BoundNumber.Bound3) { return(0); } //2----------------------------------------------- if (elem1.Bound.Name == BoundNumber.Bound2 && elem2.Bound.Name == BoundNumber.Bound12) { return(Integrator.IntegratedQdnx(elem1, elem2, FunctionsForSemiSpace.Derivates)); } if (elem1.Bound.Name == BoundNumber.Bound2 && elem2.Bound.Name == BoundNumber.Bound2) { return(-Integrator.IntegratedQdnx(elem1, elem2, FunctionFactory.Derivates)); } if (elem1.Bound.Name == BoundNumber.Bound2 && elem2.Bound.Name == BoundNumber.Bound13) { return(Integrator.IntegratedQdnx(elem1, elem2, FunctionsForSemiSpace.Derivates)); } if (elem1.Bound.Name == BoundNumber.Bound2 && elem2.Bound.Name == BoundNumber.Bound3) { return(0); } //3----------------------------------------------- if (elem1.Bound.Name == BoundNumber.Bound13 && elem2.Bound.Name == BoundNumber.Bound12) { return(Integrator.Integrate(elem1, elem2.Center, functionsForSemiSpace.U1)); } if (elem1.Bound.Name == BoundNumber.Bound13 && elem2.Bound.Name == BoundNumber.Bound2) { return(0); } if (elem1.Bound.Name == BoundNumber.Bound13 && elem2.Bound.Name == BoundNumber.Bound13) { return(Integrator.Integrate(elem1, elem2.Center, functionsForSemiSpace.U1)); } if (elem1.Bound.Name == BoundNumber.Bound13 && elem2.Bound.Name == BoundNumber.Bound3) { return(-(Integrator.Integrate(elem1, elem2.Center, functionsForSemiSpace.U3))); } //4------------------------------------------------ if (elem1.Bound.Name == BoundNumber.Bound3 && elem2.Bound.Name == BoundNumber.Bound12) { return(Integrator.IntegratedQdnx(elem1, elem2, FunctionsForSemiSpace.Derivates)); } if (elem1.Bound.Name == BoundNumber.Bound3 && elem2.Bound.Name == BoundNumber.Bound2) { return(0); } if (elem1.Bound.Name == BoundNumber.Bound3 && elem2.Bound.Name == BoundNumber.Bound13) { return(Integrator.IntegratedQdnx(elem1, elem2, FunctionsForSemiSpace.Derivates)); } if (elem1.Bound.Name == BoundNumber.Bound3 && elem2.Bound.Name == BoundNumber.Bound3) { return(-Integrator.IntegratedQdnx(elem1, elem2, FunctionFactory.Derivates)); } throw new Exception("Invalid boundaries"); }