def evaluate_fields(self, cid, xi, fields): num_fields = len(fields) X = numpy.zeros((xi.shape[0], num_fields)) for i, field in enumerate(fields): Phi = interpolator.weights(self.EFn[cid], xi, deriv=field[1:]) X[:, i] = numpy.dot(Phi, self.P[self.EMap[cid][field[0]]]) return X
def evaluate(self, cid, xi, deriv=None): num_fields = len(self.EMap[cid]) X = numpy.zeros((xi.shape[0], num_fields)) Phi = interpolator.weights(self.EFn[cid], xi, deriv=deriv) for i in range(num_fields): X[:, i] = numpy.dot(Phi, self.P[self.EMap[cid][i]]) return X
def evaluates(self, cids, xi, deriv=None, X=None): num_fields = len(self.EMap[cids[0]]) if X==None: X = numpy.zeros((len(cids) * xi.shape[0], num_fields)) Phi = interpolator.weights(self.EFn[cids[0]], xi, deriv=deriv) Nxi = xi.shape[0] ind = 0 for cid in cids: for i in range(num_fields): X[ind:ind+Nxi, i] = numpy.dot(Phi, self.P[self.EMap[cid][i]]) ind += Nxi return X
def update_dependent_nodes(self): # update dependent nodes for dn in self.DNMap: cid = dn[0] xi_cids = dn[1] dn_cids = dn[2] shape = dn[3] scale = dn[4] num_fields = len(self.EMap[cid]) if num_fields == 1: xi = numpy.array([self.P[xi_cids]]).T else: xi = numpy.array([self.P[xi_cids]]) if len(shape) == 1: Phi = interpolator.weights(self.EFn[cid], xi) for i in range(num_fields): self.P[dn_cids[i]] = numpy.dot(Phi, self.P[self.EMap[cid][i]]) elif len(shape) == 2: components = shape[1] Phi = [interpolator.weights(self.EFn[cid], xi)] if components == 2: Phi.append(interpolator.weights(self.EFn[cid], xi, deriv=[1])) elif components == 4: Phi.append(interpolator.weights(self.EFn[cid], xi, deriv=[1, 0])) Phi.append(interpolator.weights(self.EFn[cid], xi, deriv=[0, 1])) Phi.append(interpolator.weights(self.EFn[cid], xi, deriv=[1, 1])) comp_idx = 0 if scale is None: scale = numpy.ones((shape[1])) for i in range(num_fields): for j, phi in enumerate(Phi): self.P[dn_cids[comp_idx]] = scale[j] * numpy.dot(phi, self.P[self.EMap[cid][i]]) comp_idx += 1
def update_dependent_nodes(self): # update dependent nodes for dn in self.DNMap: cid = dn[0] xi_cids = dn[1] dn_cids = dn[2] num_fields = len(self.EMap[cid]) if num_fields == 1: xi = numpy.array([self.P[xi_cids]]).T else: xi = numpy.array([self.P[xi_cids]]) Phi = interpolator.weights(self.EFn[cid], xi) for i in range(num_fields): self.P[dn_cids[i]] = numpy.dot(Phi, self.P[self.EMap[cid][i]])
def weights(self, cid, xi, deriv=None): return interpolator.weights(self.EFn[cid], xi, deriv=deriv)