#include <meep.hpp>
using namespace meep;
const double eps_inf = 2.25;
const double sigma1 = 0.5;
const double omega1 = 1.1;
const double gamma1 = 1e-5;
const double sigma2 = 2e-5;
const double omega2 = 0.5;
const double gamma2 = 0.1;
const double fcen = 1.0;
const double df = 2.0;
const double freq_max = fcen + 0.5 * df;
const double freq_min = fcen - 0.5 * df;
const double resolution = 20.0;
const int maxbands = 5;
const double harminv_time = 200.0;
const double kmin = 0.3;
const double kmax = 2.2;
const int k_num = 101;
const double dk = (kmax - kmin) / (k_num - 1);
inline double max(double a, double b) { return (a > b ? a : b); }
inline double sqr(double a) { return a*a; }
double feps (const vec &p)
{
return eps_inf;
}
double fsigma1 (const vec &p)
{
return sigma1;
}
double fsigma2 (const vec &p)
{
return sigma2;
}
int main(int argc, char **argv)
{
initialize mpi(argc, argv);
const volume v = vol3d(0.0, 0.0, 0.0, resolution);
structure s(v, feps);
s.set_epsilon(feps, true); // averaging
s.add_polarizability(fsigma1, omega1, gamma1);
s.add_polarizability(fsigma2, omega2, gamma2);
complex<double> *amps = new complex<double>[maxbands];
double *freq_re = new double[maxbands];
double *freq_im = new double[maxbands];
double *errors = new double[maxbands];
for (int j = 0; j < k_num; j++) {
double k = kmin + j * dk;
fields f(&s);
f.use_bloch(vec(k,0.0,0.0));
gaussian_src_time src(fcen, 1.0 / df, 0.0, 10.0 / df);
f.add_point_source(Ez, src, v.center());
while (f.time() < f.last_source_time()) f.step();
int ttot = int(harminv_time / f.dt)+1;
complex<double> *mon_data = new complex<double>[ttot];
int i = 0;
while (f.time() < f.last_source_time() + harminv_time) {
f.step();
mon_data[i++] = f.get_field(Ez, v.center());
}
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) {
complex<double> freq = complex<double>(freq_re[i], freq_im[i]);
complex<double> e = pow(k / freq, 2);
master_printf("eps:, %g, %g, %g, %g, %g\n",
k, freq_re[i], freq_im[i], real(e), imag(e));
}
delete[] mon_data;
}
delete[] errors;
delete[] freq_im;
delete[] freq_re;
delete[] amps;
return 0;
}
最終更新時間:2009年06月26日 17時20分24秒