def residuals(f, g, s, x, dr, nodes, weights, p, diff=True): N, n_x = x.shape dr.set_values(x) output = numpy.zeros((N, n_x)) if not diff: for i in range(nodes.shape[0]): E = nodes[i, :][None, :].repeat(N, axis=0) S = g(s, x, E, p) X = dr.interpolate(S) t = f(s, x, E, S, X, p) output += weights[i]*t return output if diff: output_x = scipy.sparse.csr_matrix((N*n_x, N*n_x)) for i in range(nodes.shape[0]): E = nodes[i, :][None, :].repeat(N, axis=0) S, S_s, S_x, S_E = g(s, x, E, p, diff=True) X, X_S, X_x = dr.interpolate(S, deriv=True, deriv_X=True) R, R_s, R_x, R_E, R_S, R_X = f(s, x, E, S, X, p, diff=True) output += weights[i]*R t1 = weights[i]*(R_x + smult(R_S, S_x) + smult(R_X, smult(X_S, S_x))) # N.n_x.n_x t1 = serial_to_full(t1) t2 = weights[i] * serial_to_full(R_X) @ diag_to_full(X_x) output_x += t1 + t2 return output, output_x
def g(self, s, x, e, p, derivs=True): if not derivs: a = self.__a(s, x, p, derivs=False)[0] return self.__g(s, x, a, e, p, derivs=False) else: [a, a_s, a_x] = self.__a(s, x, p, derivs=True) [g, g_s, g_x, g_a, g_e] = self.__g(s, x, a, e, p, derivs=True) G = g G_s = g_s + smult(g_a, a_s) G_x = g_x + smult(g_a, a_x) G_e = g_e return [G, G_s, G_x, G_e]
def g(self,s,x,e,p,derivs=True): if not derivs: a = self.__a(s,x,p,derivs=False)[0] return self.__g(s,x,a,e,p,derivs=False) else: [a,a_s,a_x] = self.__a(s,x,p,derivs=True) [g,g_s,g_x,g_a,g_e] = self.__g(s,x,a,e,p,derivs=True) G = g G_s = g_s + smult(g_a,a_s) G_x = g_x + smult(g_a,a_x) G_e = g_e return [G,G_s,G_x,G_e]
def f(self, s, x, snext, xnext, e, p, derivs=True): if not derivs: a = self.__a(s,x,p,derivs=False)[0] anext = self.__a(snext,xnext,p,derivs=False)[0] return self.__f(s,x,snext,xnext,a,anext,e,p,derivs=False) else: [a,a_s,a_x] = self.__a(s,x,p,derivs=True) [A,A_S,A_X] = self.__a(snext,xnext,p,derivs=True) [f,f_s,f_x,f_S,f_X,f_a,f_A] = self.__f(s,x,snext,xnext,a,A,e,p) F = f F_s = f_s + smult(f_a,a_s) F_x = f_x + smult(f_a,a_x) F_S = f_S + smult(f_A,A_S) F_X = f_X + smult(f_A,A_X) return [F,F_s,F_x,F_S,F_X]
def f(self, s, x, snext, xnext, e, p, derivs=True): if not derivs: a = self.__a(s, x, p, derivs=False)[0] anext = self.__a(snext, xnext, p, derivs=False)[0] return self.__f(s, x, snext, xnext, a, anext, e, p, derivs=False) else: [a, a_s, a_x] = self.__a(s, x, p, derivs=True) [A, A_S, A_X] = self.__a(snext, xnext, p, derivs=True) [f, f_s, f_x, f_S, f_X, f_a, f_A] = self.__f(s, x, snext, xnext, a, A, e, p) F = f F_s = f_s + smult(f_a, a_s) F_x = f_x + smult(f_a, a_x) F_S = f_S + smult(f_A, A_S) F_X = f_X + smult(f_A, A_X) return [F, F_s, F_x, F_S, F_X]