Skip to content

Incorrect adjoint fields in cylindrical coordinates #2193

Description

@mochen4

There is an issue with the gradients after PR #1855. Specifically, if I plot the forward fields, adjoint fields, and coordinates of the points from this line:

meep/src/meepgeom.cpp

Lines 2925 to 2927 in 2aa9164

material_grids_addgradient_point(v_local + ng * f_i, vec_to_vector3(p),
scalegrad * cyl_scale, geps, adjoint_c, forward_c,
fwd, adj, frequencies[f_i], gv, du);

The forward fields are the same as before the PR, yet the adjoint fields are different compared to before.
cc @smartalecH

Here is a simple test case (in cylindrical coordinates) I used:

import meep as mp
import meep.adjoint as mpa
import numpy as np
from autograd import numpy as npa
from matplotlib import pyplot as plt

np.random.rand(240)

mp.verbosity(0)
resolution = 20
Si = mp.Medium(epsilon=13)

design_region_width = 0.1
design_region_height = 0.1
pml_size = 1.0
padl, padr, padz = 0.5 , 0.5, 0.5
Sr = design_region_width + pml_size + padl + padr
Sz = 2*pml_size + design_region_height + 2*padz + 1
cell_size = mp.Vector3(Sr,0,Sz)
pml_layers = [mp.PML(pml_size)]

nf = 2
fcen = 1/1.55
width = 0.1
fwidth = width * fcen
source_center  = mp.Vector3(padl+design_region_width/2,0,-padz-design_region_height/2)
source_size    = mp.Vector3(design_region_width,0,0)
src = mp.GaussianSource(frequency=fcen,fwidth=fwidth)
source = [mp.Source(src,component=mp.Ep,center=source_center, size=source_size)]

design_region_resolution = 20
Nx = int(design_region_resolution*design_region_width)
Ny = int(design_region_resolution*design_region_height)
design_variables = mp.MaterialGrid(mp.Vector3(Nx,1, Ny),mp.air, Si, do_averaging=False)
design_region = mpa.DesignRegion(design_variables,volume=mp.Volume(center=mp.Vector3(padl+design_region_width/2, 0, 0), size=mp.Vector3(design_region_width, 0, design_region_height)))


geometry = [mp.Block(center=design_region.center, size=design_region.size, material=design_variables)] # design region
dimensions = mp.CYLINDRICAL
sim = mp.Simulation(cell_size=cell_size, boundary_layers=pml_layers, geometry=geometry, sources=source, default_material=mp.air,
                    resolution=resolution, dimensions=dimensions, m=-1, force_complex_fields=True)

far_x = [mp.Vector3(0.1,0,20)]
NearRegions = [mp.Near2FarRegion(center=mp.Vector3(padl+(design_region_width)/2,0,padz+design_region_height/2), 
                size=mp.Vector3(0.5,0,0), weight=+1)]
FarFields = mpa.Near2FarFields(sim, NearRegions ,far_x)
ob_list = [FarFields]

def J(ff):
    return npa.abs(ff[0,0,1])**2
obj_fs = [J]
opt = mpa.OptimizationProblem(
    simulation = sim,
    objective_functions = obj_fs,
    objective_arguments = ob_list,
    design_regions = [design_region],
    fcen = fcen,
    nf=1,
    df=0,
    minimum_run_time = 2000,
    maximum_run_time = 2001
)

x = 0.5*np.ones(Nx*Ny)
f0, adj = opt([x])
#fd, idx = opt.calculate_fd_gradient(num_gradients=4, db = 1e-4)


print(f0)
print("adj",adj)

The fields before PR:

fwd c er, fwd 0.645056+i0.153555, adj c er, adj 0.000002+i0.000011, (0.475000, 0.000000,0.000000, -0.050000) 
fwd c er, fwd 0.643162+i0.383013, adj c er, adj 0.000005+i0.000010, (0.475000, 0.000000,0.000000, 0.000000) 
fwd c er, fwd 0.602949+i0.602070, adj c er, adj 0.000008+i0.000007, (0.475000, 0.000000,0.000000, 0.050000) 
fwd c er, fwd 0.405817+i0.497857, adj c er, adj 0.000007+i0.000005, (0.475000, 0.000000,0.000000, 0.100000) 
fwd c er, fwd 0.651281+i-0.039765, adj c er, adj -0.000000+i0.000015, (0.525000, 0.000000,0.000000, -0.050000) 
fwd c er, fwd 0.638741+i0.398589, adj c er, adj 0.000005+i0.000010, (0.525000, 0.000000,0.000000, 0.000000) 
fwd c er, fwd 0.734200+i0.989445, adj c er, adj 0.000012+i0.000007, (0.525000, 0.000000,0.000000, 0.050000) 
fwd c er, fwd 0.230273+i0.344623, adj c er, adj 0.000005+i0.000003, (0.525000, 0.000000,0.000000, 0.100000) 
fwd c er, fwd 1.118304+i0.707820, adj c er, adj 0.000006+i0.000014, (0.575000, 0.000000,0.000000, -0.050000) 
fwd c er, fwd 0.652416+i0.453383, adj c er, adj 0.000006+i0.000012, (0.575000, 0.000000,0.000000, 0.000000) 
fwd c er, fwd 0.561694+i0.367975, adj c er, adj 0.000008+i0.000016, (0.575000, 0.000000,0.000000, 0.050000) 
fwd c er, fwd 0.188903+i0.293060, adj c er, adj 0.000005+i0.000004, (0.575000, 0.000000,0.000000, 0.100000) 
fwd c er, fwd 0.630064+i0.389666, adj c er, adj 0.000004+i0.000010, (0.625000, 0.000000,0.000000, -0.050000) 
fwd c er, fwd 0.528196+i0.387201, adj c er, adj 0.000005+i0.000010, (0.625000, 0.000000,0.000000, 0.000000) 
fwd c er, fwd 0.420290+i0.369146, adj c er, adj 0.000006+i0.000010, (0.625000, 0.000000,0.000000, 0.050000) 
fwd c er, fwd 0.256575+i0.360613, adj c er, adj 0.000006+i0.000006, (0.625000, 0.000000,0.000000, 0.100000) 
fwd c ep, fwd 0.092786+i-0.482891, adj c ep, adj -0.000010+i0.000002, (0.500000, 0.000000,0.000000, -0.050000) 
fwd c ep, fwd 0.221215+i-0.499613, adj c ep, adj -0.000010+i0.000004, (0.500000, 0.000000,0.000000, 0.000000) 
fwd c ep, fwd 0.332522+i-0.473199, adj c ep, adj -0.000008+i0.000005, (0.500000, 0.000000,0.000000, 0.050000) 
fwd c ep, fwd 0.378766+i-0.394397, adj c ep, adj -0.000006+i0.000006, (0.500000, 0.000000,0.000000, 0.100000) 
fwd c ep, fwd 0.375797+i-2.848804, adj c ep, adj -0.000069+i0.000011, (0.550000, 0.000000,0.000000, -0.050000) 
fwd c ep, fwd 1.271099+i-3.059732, adj c ep, adj -0.000065+i0.000024, (0.550000, 0.000000,0.000000, 0.000000) 
fwd c ep, fwd 2.042060+i-2.922385, adj c ep, adj -0.000056+i0.000034, (0.550000, 0.000000,0.000000, 0.050000) 
fwd c ep, fwd 0.335374+i-0.340894, adj c ep, adj -0.000006+i0.000006, (0.550000, 0.000000,0.000000, 0.100000) 
fwd c ep, fwd 0.011707+i-0.289568, adj c ep, adj -0.000008+i0.000001, (0.600000, 0.000000,0.000000, -0.050000) 
fwd c ep, fwd 0.114356+i-0.312847, adj c ep, adj -0.000007+i0.000002, (0.600000, 0.000000,0.000000, 0.000000) 
fwd c ep, fwd 0.207578+i-0.305733, adj c ep, adj -0.000006+i0.000004, (0.600000, 0.000000,0.000000, 0.050000) 
fwd c ep, fwd 0.279757+i-0.274860, adj c ep, adj -0.000005+i0.000005, (0.600000, 0.000000,0.000000, 0.100000) 
fwd c ep, fwd -0.002345+i-0.243960, adj c ep, adj -0.000007+i0.000001, (0.650000, 0.000000,0.000000, -0.050000) 
fwd c ep, fwd 0.085468+i-0.258471, adj c ep, adj -0.000007+i0.000002, (0.650000, 0.000000,0.000000, 0.000000) 
fwd c ep, fwd 0.166449+i-0.251492, adj c ep, adj -0.000006+i0.000003, (0.650000, 0.000000,0.000000, 0.050000) 
fwd c ep, fwd 0.234422+i-0.224610, adj c ep, adj -0.000005+i0.000004, (0.650000, 0.000000,0.000000, 0.100000) 
fwd c ez, fwd -0.112498+i-0.320694, adj c ez, adj -0.000003+i0.000006, (0.500000, 0.000000,0.000000, -0.075000) 
fwd c ez, fwd -0.135251+i-0.123785, adj c ez, adj -0.000000+i0.000001, (0.500000, 0.000000,0.000000, -0.025000) 
fwd c ez, fwd -0.144965+i-0.156319, adj c ez, adj -0.000001+i0.000001, (0.500000, 0.000000,0.000000, 0.025000) 
fwd c ez, fwd -0.295754+i-0.590018, adj c ez, adj -0.000005+i0.000002, (0.500000, 0.000000,0.000000, 0.075000) 
fwd c ez, fwd -0.372778+i-0.470543, adj c ez, adj -0.000004+i0.000002, (0.550000, 0.000000,0.000000, -0.075000) 
fwd c ez, fwd -0.661254+i-1.214330, adj c ez, adj -0.000010+i0.000009, (0.550000, 0.000000,0.000000, -0.025000) 
fwd c ez, fwd -0.455460+i-1.192297, adj c ez, adj -0.000009+i0.000011, (0.550000, 0.000000,0.000000, 0.025000) 
fwd c ez, fwd -0.076187+i-0.446885, adj c ez, adj -0.000003+i0.000006, (0.550000, 0.000000,0.000000, 0.075000) 
fwd c ez, fwd -0.539074+i-0.550588, adj c ez, adj -0.000005+i-0.000002, (0.600000, 0.000000,0.000000, -0.075000) 
fwd c ez, fwd -0.099551+i-0.277188, adj c ez, adj -0.000003+i0.000001, (0.600000, 0.000000,0.000000, -0.025000) 
fwd c ez, fwd 0.001548+i-0.236501, adj c ez, adj -0.000002+i0.000003, (0.600000, 0.000000,0.000000, 0.025000) 
fwd c ez, fwd 0.127514+i-0.251088, adj c ez, adj -0.000000+i0.000008, (0.600000, 0.000000,0.000000, 0.075000) 
fwd c ez, fwd -0.313957+i-0.418766, adj c ez, adj -0.000004+i0.000000, (0.650000, 0.000000,0.000000, -0.075000) 
fwd c ez, fwd -0.143470+i-0.340765, adj c ez, adj -0.000003+i0.000002, (0.650000, 0.000000,0.000000, -0.025000) 
fwd c ez, fwd -0.032632+i-0.303925, adj c ez, adj -0.000002+i0.000003, (0.650000, 0.000000,0.000000, 0.025000) 
fwd c ez, fwd 0.049530+i-0.298294, adj c ez, adj -0.000001+i0.000005, (0.650000, 0.000000,0.000000, 0.075000) 

The fields after PR:

fwd c dr, fwd 0.645056+i0.153555, adj c dr, adj 0.000004+i-0.000002, (0.475000, 0.000000,0.000000, -0.050000) 
fwd c dr, fwd 0.643162+i0.383013, adj c dr, adj 0.000004+i-0.000001, (0.475000, 0.000000,0.000000, 0.000000) 
fwd c dr, fwd 0.602949+i0.602070, adj c dr, adj 0.000005+i-0.000001, (0.475000, 0.000000,0.000000, 0.050000) 
fwd c dr, fwd 0.405817+i0.497857, adj c dr, adj 0.000004+i-0.000001, (0.475000, 0.000000,0.000000, 0.100000) 
fwd c dr, fwd 0.651281+i-0.039765, adj c dr, adj 0.000004+i-0.000004, (0.525000, 0.000000,0.000000, -0.050000) 
fwd c dr, fwd 0.638741+i0.398589, adj c dr, adj 0.000005+i-0.000001, (0.525000, 0.000000,0.000000, 0.000000) 
fwd c dr, fwd 0.734200+i0.989445, adj c dr, adj 0.000009+i0.000001, (0.525000, 0.000000,0.000000, 0.050000) 
fwd c dr, fwd 0.230273+i0.344623, adj c dr, adj 0.000003+i-0.000001, (0.525000, 0.000000,0.000000, 0.100000) 
fwd c dr, fwd 1.118304+i0.707820, adj c dr, adj 0.000006+i0.000004, (0.575000, 0.000000,0.000000, -0.050000) 
fwd c dr, fwd 0.652416+i0.453383, adj c dr, adj 0.000005+i-0.000000, (0.575000, 0.000000,0.000000, 0.000000) 
fwd c dr, fwd 0.561694+i0.367975, adj c dr, adj 0.000004+i-0.000005, (0.575000, 0.000000,0.000000, 0.050000) 
fwd c dr, fwd 0.188903+i0.293060, adj c dr, adj 0.000003+i-0.000001, (0.575000, 0.000000,0.000000, 0.100000) 
fwd c dr, fwd 0.630064+i0.389666, adj c dr, adj 0.000004+i0.000002, (0.625000, 0.000000,0.000000, -0.050000) 
fwd c dr, fwd 0.528196+i0.387201, adj c dr, adj 0.000004+i-0.000000, (0.625000, 0.000000,0.000000, 0.000000) 
fwd c dr, fwd 0.420290+i0.369146, adj c dr, adj 0.000004+i-0.000002, (0.625000, 0.000000,0.000000, 0.050000) 
fwd c dr, fwd 0.256575+i0.360613, adj c dr, adj 0.000004+i-0.000001, (0.625000, 0.000000,0.000000, 0.100000) 
fwd c dp, fwd 0.092786+i-0.482891, adj c dp, adj 0.000000+i0.000002, (0.500000, 0.000000,0.000000, -0.050000) 
fwd c dp, fwd 0.221215+i-0.499613, adj c dp, adj 0.000001+i0.000002, (0.500000, 0.000000,0.000000, 0.000000) 
fwd c dp, fwd 0.332522+i-0.473199, adj c dp, adj 0.000001+i0.000001, (0.500000, 0.000000,0.000000, 0.050000) 
fwd c dp, fwd 0.378766+i-0.394397, adj c dp, adj 0.000002+i0.000002, (0.500000, 0.000000,0.000000, 0.100000) 
fwd c dp, fwd 0.375797+i-2.848804, adj c dp, adj 0.000005+i0.000017, (0.550000, 0.000000,0.000000, -0.050000) 
fwd c dp, fwd 1.271099+i-3.059732, adj c dp, adj 0.000010+i0.000017, (0.550000, 0.000000,0.000000, 0.000000) 
fwd c dp, fwd 2.042060+i-2.922385, adj c dp, adj 0.000014+i0.000016, (0.550000, 0.000000,0.000000, 0.050000) 
fwd c dp, fwd 0.335374+i-0.340894, adj c dp, adj 0.000002+i0.000002, (0.550000, 0.000000,0.000000, 0.100000) 
fwd c dp, fwd 0.011707+i-0.289568, adj c dp, adj 0.000001+i0.000003, (0.600000, 0.000000,0.000000, -0.050000) 
fwd c dp, fwd 0.114356+i-0.312847, adj c dp, adj 0.000001+i0.000003, (0.600000, 0.000000,0.000000, 0.000000) 
fwd c dp, fwd 0.207578+i-0.305733, adj c dp, adj 0.000002+i0.000003, (0.600000, 0.000000,0.000000, 0.050000) 
fwd c dp, fwd 0.279757+i-0.274860, adj c dp, adj 0.000002+i0.000003, (0.600000, 0.000000,0.000000, 0.100000) 
fwd c dp, fwd -0.002345+i-0.243960, adj c dp, adj 0.000001+i0.000003, (0.650000, 0.000000,0.000000, -0.050000) 
fwd c dp, fwd 0.085468+i-0.258471, adj c dp, adj 0.000002+i0.000003, (0.650000, 0.000000,0.000000, 0.000000) 
fwd c dp, fwd 0.166449+i-0.251492, adj c dp, adj 0.000002+i0.000003, (0.650000, 0.000000,0.000000, 0.050000) 
fwd c dp, fwd 0.234422+i-0.224610, adj c dp, adj 0.000003+i0.000003, (0.650000, 0.000000,0.000000, 0.100000) 
fwd c dz, fwd -0.112498+i-0.320694, adj c dz, adj 0.000000+i-0.000005, (0.500000, 0.000000,0.000000, -0.075000) 
fwd c dz, fwd -0.135251+i-0.123785, adj c dz, adj -0.000001+i-0.000002, (0.500000, 0.000000,0.000000, -0.025000) 
fwd c dz, fwd -0.144965+i-0.156319, adj c dz, adj -0.000002+i-0.000002, (0.500000, 0.000000,0.000000, 0.025000) 
fwd c dz, fwd -0.295754+i-0.590018, adj c dz, adj -0.000006+i-0.000004, (0.500000, 0.000000,0.000000, 0.075000) 
fwd c dz, fwd -0.372778+i-0.470543, adj c dz, adj -0.000001+i-0.000005, (0.550000, 0.000000,0.000000, -0.075000) 
fwd c dz, fwd -0.661254+i-1.214330, adj c dz, adj -0.000005+i-0.000013, (0.550000, 0.000000,0.000000, -0.025000) 
fwd c dz, fwd -0.455460+i-1.192297, adj c dz, adj -0.000007+i-0.000013, (0.550000, 0.000000,0.000000, 0.025000) 
fwd c dz, fwd -0.076187+i-0.446885, adj c dz, adj -0.000004+i-0.000005, (0.550000, 0.000000,0.000000, 0.075000) 
fwd c dz, fwd -0.539074+i-0.550588, adj c dz, adj -0.000002+i-0.000005, (0.600000, 0.000000,0.000000, -0.075000) 
fwd c dz, fwd -0.099551+i-0.277188, adj c dz, adj -0.000001+i-0.000002, (0.600000, 0.000000,0.000000, -0.025000) 
fwd c dz, fwd 0.001548+i-0.236501, adj c dz, adj -0.000001+i-0.000002, (0.600000, 0.000000,0.000000, 0.025000) 
fwd c dz, fwd 0.127514+i-0.251088, adj c dz, adj -0.000001+i-0.000005, (0.600000, 0.000000,0.000000, 0.075000) 
fwd c dz, fwd -0.313957+i-0.418766, adj c dz, adj -0.000000+i-0.000004, (0.650000, 0.000000,0.000000, -0.075000) 
fwd c dz, fwd -0.143470+i-0.340765, adj c dz, adj -0.000000+i-0.000003, (0.650000, 0.000000,0.000000, -0.025000) 
fwd c dz, fwd -0.032632+i-0.303925, adj c dz, adj -0.000001+i-0.000003, (0.650000, 0.000000,0.000000, 0.025000) 
fwd c dz, fwd 0.049530+i-0.298294, adj c dz, adj -0.000001+i-0.000004, (0.650000, 0.000000,0.000000, 0.075000) 

Metadata

Metadata

Assignees

No one assigned

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions