def get_gradient(self, fields_a, fields_f, frequencies, geom_list, f): # sanitize the input if (fields_a.ndim < 5) or (fields_f.ndim < 5): raise ValueError( "Fields arrays must have 5 dimensions (x,y,z,frequency,component)" ) num_freqs = np.array(frequencies).size grad = np.zeros((self.num_design_params * num_freqs, )) # preallocate # compute the gradient mp._get_gradient(grad, fields_a, fields_f, self.volume, np.array(frequencies), geom_list, f) return np.squeeze( grad.reshape(self.num_design_params, num_freqs, order='F'))
def get_gradient(self,sim,fields_a,fields_f,frequencies): for c in range(3): fields_a[c] = fields_a[c].flatten(order='C') fields_f[c] = fields_f[c].flatten(order='C') fields_a = np.concatenate(fields_a) fields_f = np.concatenate(fields_f) num_freqs = np.array(frequencies).size grad = np.zeros((num_freqs,self.num_design_params)) # preallocate geom_list = sim.geometry f = sim.fields vol = sim._fit_volume_to_simulation(self.volume) # compute the gradient mp._get_gradient(grad,fields_a,fields_f,vol,np.array(frequencies),geom_list,f) return np.squeeze(grad).T
def get_gradient(self, sim, fields_a, fields_f, frequencies, finite_difference_step): num_freqs = onp.array(frequencies).size '''We have the option to linearly scale the gradients up front using the scalegrad parameter (leftover from MPB API). Not currently needed for any existing feature (but available for future use)''' scalegrad = 1 grad = onp.zeros((num_freqs, self.num_design_params)) # preallocate vol = sim._fit_volume_to_simulation(self.volume) # compute the gradient mp._get_gradient(grad, scalegrad, fields_a[0].swigobj, fields_a[1].swigobj, fields_a[2].swigobj, fields_f[0].swigobj, fields_f[1].swigobj, fields_f[2].swigobj, sim.gv, vol.swigobj, onp.array(frequencies), sim.geps, finite_difference_step) return onp.squeeze(grad).T