/// <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 + "]")); } } }
public LinearEdgeFormVectorizer(IEdgeForm _edgeForm) { this.InnerEdgeTerms = _edgeForm.InnerEdgeTerms; this.BoundaryEdgeTerms = _edgeForm.BoundaryEdgeTerms; this.edgeForm = _edgeForm; }
public LinearVolumeFormVectorizer(IVolumeForm _volForm) { this.VolTerms = _volForm.VolTerms; this.volForm = _volForm; }
/// <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; }
public NonlinVolumeFormVectorizer(IVolumeForm _volForm) { this.VolTerms = _volForm.VolTerms; this.volForm = _volForm; }