履歴 ログイン

Modes of a ring resonator

#include <meep.hpp>
using namespace meep;

const double n = 3.4;
const double w = 1.0;
const double r = 1.0;
const double pad = 4.0;
const double dpml = 2.0;
const double sxy = 2 * (r + w + pad + dpml);
const double origin = 0.5 * sxy;

const double fcen = 0.15;
const double df = 0.1;
const double freq_max = fcen + 0.5 * df;
const double freq_min = fcen - 0.5 * df;
const double resolution = 10.0;

const double harminv_time = 200.0;

inline double max(double a, double b) { return (a > b ? a : b); }

double eps (const vec &p)
{
  vec xx = p - vec(origin, origin);
  double pa = abs(xx);
  if (pa > r && pa <= r + w)
    return n * n;
  return 1.0;
}

int main(int argc, char **argv)
{
  initialize mpi(argc, argv);
  const volume v = vol2d(sxy, sxy, resolution);
  structure s(v, eps, pml(dpml), mirror(Y,v));
  s.set_epsilon(eps, true); // averaging
  fields f(&s);
  gaussian_src_time src(fcen, 1.0 / df, 0.0, 10.0 / df);
  f.add_point_source(Hx, src, vec(origin + r + 0.1, origin));
  f.output_hdf5(Dielectric, v.surroundings());
  h5file *ez_data = f.open_h5file("ez");
  int itot = f.last_source_time() / f.dt;
  int i = 0;
  while (f.time() < f.last_source_time()) {
    f.step();
    if (i%10 == 0) f.output_hdf5(Ez, v.surroundings(), ez_data, true);
    i++;
  }
  delete ez_data;
  int maxbands = 5;
  int ttot = int(harminv_time / f.dt)+1;
  complex<double> *mon_data = new complex<double>[ttot];
  complex<double> *amps = new complex<double>[maxbands];
  double *freq_re = new double[maxbands];
  double *freq_im = new double[maxbands];
  double *errors = new double[maxbands];
  i = 0;
  master_printf("ttot = %d\n", ttot);

  while (f.time() < f.last_source_time() + harminv_time) {
    f.step();
    mon_data[i++] = f.get_field(Ez, vec(origin + r + 0.1, origin));
  }

  int nfreq = do_harminv(mon_data, ttot, f.dt, freq_min, freq_max,
		 maxbands, amps, freq_re, freq_im, errors); 
  for (int i = 0; i < nfreq; ++i)
    master_printf("harminv0: %g, %g, %g, %g, %g+%gi, %g \n",
	  freq_re[i], freq_im[i], - 0.5 * freq_re[i] / freq_im[i],
		  abs(amps[i]), real(amps[i]), imag(amps[i]), errors[i]);
 
  delete[] errors;
  delete[] freq_im;
  delete[] freq_re;
  delete[] amps;
  delete[] mon_data;
  return 0;
}

アニメーションの作成

$ mkdir figs
$ cd figs
$ h5topng -t 0:199 -R -Zc dkbluered -a yarg -A ../eps-000000.00.h5 -d ez.r ../ez.h5
$ convert -loop 0 ez.t*.png ../rr.gif

rr.gif

戻る

最終更新時間:2009年06月26日 16時12分57秒