Skip to content
Snippets Groups Projects
em-modes.mac 3.77 KiB
Newer Older
  • Learn to ignore specific revisions
  • kill(all);
    load("eigen");
    load("itensor");
    load("diag");
    
    /* -------------------------------------------------------------------------- */
    /* Utilities */
    /* -------------------------------------------------------------------------- */
    
    curl(x):=crossfunc(lambda([i,j], diff(x[j], coords[i])));
    div(f):=sum(diff(f[j], coords[j]), j, 1, length(coords));
    
    assert(condition):=if not condition then error("Assertion violated") else true$
    
    norm_2_squared(v):=v.v;
    
    crossfunc(f):=makelist(
      sum(sum(
          levi_civita([i,j,k])*f(j,k),
       j,1,3),k,1,3),i,1,3)$
    
    crossprod(a,b):=crossfunc(lambda([j,k], a[j]*b[k]));
    
    /* -------------------------------------------------------------------------- */
    /* Variable declarations */
    /* -------------------------------------------------------------------------- */
    
    coords:[x,y,z];
    allvars:append([t],coords);
    
    mu: 1;
    epsilon: 1;
    c: 1/sqrt(mu*epsilon);
    
    epsilon_0: 1;
    mu_0: 1;
    c_0: 1/sqrt(mu_0*epsilon_0);
    
    max_B(max_H):= mu*max_H;
    max_D(max_E):= epsilon*max_E;
    
    /* SI conventions, assumed time dep: exp(%i*omega*t) */
    faraday(max_E, max_H):= curl(max_E) + %i * omega * max_B(max_H);
    ampere(max_E, max_H):= curl(max_B(max_H)) - %i * omega / c_0**2 * max_E;
    
    div_e(max_E, max_H):= div(max_E);
    div_h(max_E, max_H):= div(max_H);
    
    maxwell_pde(max_E, max_H):=append(
        faraday(max_E, max_H),
        ampere(max_E, max_H),
        [div_e(max_E, max_H), div_h(max_E, max_H)]);
    
    /*
    spatial_deps:[
      exp(%i*m*x)*exp(%i*n*y),
      exp(%i*m*x)*exp(-%i*n*y),
      exp(-%i*m*x)*exp(%i*n*y),
      exp(-%i*m*x)*exp(-%i*n*y)
      ];
    */
    
    spatial_deps:[
      exp(+%i*m*x)*exp(+%i*n*y)*exp(+%i*l*z),
      exp(+%i*m*x)*exp(+%i*n*y)*exp(-%i*l*z),
      exp(+%i*m*x)*exp(-%i*n*y)*exp(+%i*l*z),
      exp(+%i*m*x)*exp(-%i*n*y)*exp(-%i*l*z)
    
      /*
      exp(-%i*m*x)*exp(+%i*n*y)*exp(+%i*l*z),
      exp(-%i*m*x)*exp(+%i*n*y)*exp(-%i*l*z),
      exp(-%i*m*x)*exp(-%i*n*y)*exp(+%i*l*z),
      exp(-%i*m*x)*exp(-%i*n*y)*exp(-%i*l*z)
      */
      ];
    
    declare(m, integer, n, integer, l, integer);
    
    get_maxwell_solution(spatial_dep):=block([
      max_B, max_D, coeffs, max_E, max_H, faraday, ampere, div_e, div_h, maxwell_pde, soln
      ],
      max_B: mu*max_H,
      max_D: epsilon*max_E,
    
      coeffs: [
        Exr, Eyr, Ezr, Hxr, Hyr, Hzr,
        Exi, Eyi, Ezi, Hxi, Hyi, Hzi
        ],
    
      max_E: [
          (Exr+%i*Exi)*spatial_dep,
          (Eyr+%i*Eyi)*spatial_dep,
          (Ezr+%i*Ezi)*spatial_dep
          ],
      max_H: [
          (Hxr+%i*Hxi)*spatial_dep,
          (Hyr+%i*Hyi)*spatial_dep,
          (Hzr+%i*Hzi)*spatial_dep
          ],
    
      soln:solve(
        maxwell_pde(max_E, max_H),
        append(coeffs, [omega])),
    
      family1: soln[1],
      omega_eq: family1[length(family1)],
      assert(lhs(omega_eq) = omega),
    
      [subst(family1, [max_E, max_H]), rhs(omega_eq)]
      );
    
    maxwell_solutions:makelist(
      get_maxwell_solution(spatial_deps[i]),
      i, 1, length(spatial_deps));
    
    omegas:makelist(
      maxwell_solutions[i][2],
      i, 1, length(maxwell_solutions));
    display(omegas);
    
    max_E:ratsimp(sum(
      maxwell_solutions[i][1][1],
      i, 1, length(maxwell_solutions)));
    max_H:ratsimp(sum(
      maxwell_solutions[i][1][2],
      i, 1, length(maxwell_solutions)));
    
    print("Check Maxwell:");
    print(ratsimp(subst([omega=omegas[1]],maxwell_pde(max_E,max_H))));
    
    pec_bcs:append(
        realpart(crossprod([-1,0,0], subst(x=0, max_E))),
        realpart(crossprod([1,0,0], subst(x=%pi, max_E))),
        realpart(crossprod([0,-1,0], subst(y=0, max_E))),
        realpart(crossprod([0,1,0], subst(y=%pi, max_E))),
        [
          realpart([-1,0,0].subst(x=0, max_H)),
          realpart([1,0,0].subst(x=%pi, max_H)),
          realpart([0,-1,0].subst(y=0, max_H)),
          realpart([0,1,0].subst(y=%pi, max_H))
        ]);
    
    freevars: sublist(
        listofvars([max_E, max_H]),
        lambda([rvar], substring(string(rvar),1,2) = "%"));
    
    ev_pec_bcs:append(
      subst([x=0, y=0, z=0], pec_bcs),
      subst([x=0, y=0, z=%pi], pec_bcs),
      subst([x=0, y=%pi, z=%pi], pec_bcs)
      );
    
    /*
    Fails:
    
    pec_soln:linsolve(pec_bcs, freevars);
    */