From 4d6b563e03f986054106015af5b3ad7ebf0375da Mon Sep 17 00:00:00 2001 From: Andreas Kloeckner <inform@tiker.net> Date: Sat, 16 Sep 2017 00:29:11 -0500 Subject: [PATCH] Add aborted experiment to have Maxima find Maxwell waveguide/cavity modes --- contrib/maxima/em-modes.mac | 157 ++++++++++++++++++++++++++++++++++++ 1 file changed, 157 insertions(+) create mode 100644 contrib/maxima/em-modes.mac diff --git a/contrib/maxima/em-modes.mac b/contrib/maxima/em-modes.mac new file mode 100644 index 0000000..6482ec1 --- /dev/null +++ b/contrib/maxima/em-modes.mac @@ -0,0 +1,157 @@ +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); +*/ -- GitLab