public static SimplePermuteManager Make(Func <int, int> permute, int originalLength, int newLength) { var buf = new SimplePermuteManager(); buf.p = new int[originalLength]; buf.ip = new int[newLength]; buf.OriginalLength = originalLength; buf.NewLength = newLength; for (var i = 0; i < originalLength; i++) { var pi = buf.p[i] = permute(i); if (pi != -1) { buf.ip[buf.p[i]] = i; } } return(buf); }
public static Matrix FullyExpand(Matrix originalMatrix, IEnumerable <ElementLocalDof> src, int totalNodes) { var source = src.ToArray(); var dic = new Dictionary <int, ElementLocalDof[]>(); source.GroupBy(i => i.NodeIndex).ToList().ForEach(i => dic[i.Key] = i.OrderBy(j => j.Dof).ToArray()); var permArr = new List <int>(); for (int i = 0; i < source.Length; i++) { var newLoc = source[i].NodeIndex * 6 + (int)source[i].Dof; permArr.Add(newLoc); } var permute = SimplePermuteManager.Make(i => permArr[i], source.Length, totalNodes * 6); var buf = permute.ApplyTo(originalMatrix); return(buf); }