Пример #1
0
        /// <summary>
        /// %
        /// </summary>
        protected FormDifferentiatorCommon(IEquationComponent vf, TermActivationFlags __Terms, int SpatialDimension)
        {
            m_OrgForm          = vf;
            m_eps              = Math.Sqrt(BLAS.MachineEps);
            m_SpatialDimension = SpatialDimension;

            Terms = __Terms;
            if ((Terms & (TermActivationFlags.GradUxV | TermActivationFlags.UxV)) != 0)
            {
                Terms |= TermActivationFlags.V;
            }
            if ((Terms & (TermActivationFlags.GradUxGradV | TermActivationFlags.UxGradV)) != 0)
            {
                Terms |= TermActivationFlags.GradV;
            }

            // Parameters for form derivative
            // ==============================

            ParamUreq     = (Terms & (TermActivationFlags.UxGradV | TermActivationFlags.UxV)) != 0;
            ParamGradUreq = (Terms & (TermActivationFlags.GradUxGradV | TermActivationFlags.GradUxV)) != 0;

            m_ParameterOrdering = new string[0];

            // original parameters
            OffsetOrgParams = m_ParameterOrdering.Length;
            if (vf.ParameterOrdering != null && vf.ParameterOrdering.Count > 0)
            {
                m_ParameterOrdering = m_ParameterOrdering.Cat(vf.ParameterOrdering);
                NoOfOrgParams       = vf.ParameterOrdering.Count;
            }
            else
            {
                NoOfOrgParams = 0;
            }

            // U in linearization point
            OffsetUparams = m_ParameterOrdering.Length;
            if (ParamUreq && vf.ArgumentOrdering != null && vf.ArgumentOrdering.Count > 0)
            {
                m_ParameterOrdering = m_ParameterOrdering.Cat(vf.ArgumentOrdering.Select(fn => fn + "_lin"));
            }

            // derivatives in linearization point
            OffsetGradUparams = m_ParameterOrdering.Length;
            if (ParamGradUreq && vf.ArgumentOrdering != null && vf.ArgumentOrdering.Count > 0)
            {
                foreach (string arg in vf.ArgumentOrdering)
                {
                    m_ParameterOrdering = m_ParameterOrdering.Cat(SpatialDimension.ForLoop(d => arg + "_lin_d[" + d + "]"));
                }
            }
        }
Пример #2
0
 public LinearEdgeFormVectorizer(IEdgeForm _edgeForm)
 {
     this.InnerEdgeTerms    = _edgeForm.InnerEdgeTerms;
     this.BoundaryEdgeTerms = _edgeForm.BoundaryEdgeTerms;
     this.edgeForm          = _edgeForm;
 }
Пример #3
0
 public LinearVolumeFormVectorizer(IVolumeForm _volForm)
 {
     this.VolTerms = _volForm.VolTerms;
     this.volForm  = _volForm;
 }
Пример #4
0
        /// <summary>
        /// Implementation of constructor functionality.
        /// </summary>
        private void FindJacobianParams(int SpatialDimension, string[] ParameterVar, Func <IEquationComponent, TermActivationFlags> extractTaf)
        {
            string[] DomVar             = DomainVar.ToArray();
            bool[]   DomVarAsParam      = new bool[DomVar.Length];
            bool[]   DomVarDerivAsParam = new bool[DomVar.Length];
            NoOfOrgParams = ParameterVar.Length;

            foreach (var eq in Components)
            {
                if (!(eq is ISupportsJacobianComponent))
                {
                    throw new NotSupportedException(string.Format("Unable to handle component {0}: To obtain a Jacobian operator, all components must implement the {1} interface.", eq.GetType().Name, typeof(ISupportsJacobianComponent).Name));
                }

                if (eq.ArgumentOrdering != null)
                {
                    // collect term activation flags
                    TermActivationFlags termActivationFlags = extractTaf(eq);

                    foreach (string var in eq.ArgumentOrdering)
                    {
                        int iVar = DomVar.IndexOf(var, (a, b) => a.Equals(b));

                        if ((termActivationFlags & (TermActivationFlags.UxV | TermActivationFlags.UxGradV)) != 0)
                        {
                            DomVarAsParam[iVar] |= true;
                        }
                        if ((termActivationFlags & (TermActivationFlags.GradUxV | TermActivationFlags.GradUxGradV)) != 0)
                        {
                            DomVarDerivAsParam[iVar] |= true;
                        }
                    }
                }
            }


            string[] newParamVar = new string[0];
            DomainToParam      = new int[DomVar.Length];
            DomainDerivToParam = new int[DomVar.Length, SpatialDimension];
            DomainToParam.SetAll(-1234);
            DomainDerivToParam.SetAll(-1235);

            // insert parameters from the original operator at the beginning
            newParamVar = newParamVar.Cat(ParameterVar);

            // parameters for field values in the middle
            for (int iVar = 0; iVar < DomVar.Length; iVar++)
            {
                if (DomVarAsParam[iVar])
                {
                    DomainToParam[iVar] = newParamVar.Length;
                    newParamVar         = newParamVar.Cat(DomVar[iVar] + "_lin");
                }
            }

            // after this, the gradients
            for (int iVar = 0; iVar < DomVar.Length; iVar++)
            {
                if (DomVarDerivAsParam[iVar])
                {
                    for (int d = 0; d < SpatialDimension; d++)
                    {
                        DomainDerivToParam[iVar, d] = newParamVar.Length;
                        newParamVar = newParamVar.Cat(DomVar[iVar] + "_lin_d[" + d + "]");
                    }
                }
            }

            JacobianParameterVars = newParamVar;
        }
Пример #5
0
 public NonlinVolumeFormVectorizer(IVolumeForm _volForm)
 {
     this.VolTerms = _volForm.VolTerms;
     this.volForm  = _volForm;
 }