Exemple #1
0
    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
Exemple #3
0
 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