搜索附件  
头雁微网 附件中心 技术应用 情报信息 2D快速多极子代码: nero2d.zip
板块导航
附件中心&附件聚合2.0
For Discuz! X3.5 © hgcad.com

2D快速多极子代码: nero2d.zip

 

2D快速多极子代码:
  1. /***************************************************************************
  2. *   Copyright (C) 2006 by Jan Fostier                                      *
  3. *   jan.fostier@intec.ugent.be                                              *
  4. *                                                                         *
  5. *   This program is free software; you can redistribute it and/or modify  *
  6. *   it under the terms of the GNU General Public License as published by  *
  7. *   the Free Software Foundation; either version 2 of the License, or     *
  8. *   (at your option) any later version.                                   *
  9. *                                                                         *
  10. *   This program is distributed in the hope that it will be useful,       *
  11. *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
  12. *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
  13. *   GNU General Public License for more details.                          *
  14. *                                                                         *
  15. *   You should have received a copy of the GNU General Public License     *
  16. *   along with this program; if not, write to the                         *
  17. *   Free Software Foundation, Inc.,                                       *
  18. *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
  19. ***************************************************************************/

  20. #include "excitation.h"
  21. #include "scene2d.h"
  22. #include "mathlib.h"

  23. // ========================================================================
  24. // POINT SOURCES
  25. // ========================================================================

  26. dcomplex Excitation::pointSourceExField(const Point& r) const
  27. {
  28.         dcomplex H2;
  29.         fastHankel0(medium->gamma*(orig-r).norm(), &H2);
  30.         return -0.25*2*pi*medium->frequency*medium->mu*I0*H2;
  31. }

  32. dcomplex Excitation::pointSourceHtField(const Point& r, const Point& t) const
  33. {
  34.         Point arg = orig-r;
  35.         double narg = arg.norm();
  36.         dcomplex result[2];
  37.         fastHankel01(medium->gamma*narg, result);
  38.         dcomplex H2 = result[1];
  39.         Point tmp(arg.getY(), -arg.getX());
  40.         double dt = t.dot(tmp)/narg;
  41.         return -0.25*I*I0*medium->gamma*dt*H2;
  42. }

  43. // ========================================================================
  44. // TM-WAVES
  45. // ========================================================================

  46. dcomplex Excitation::planeWaveTMExField(const Point& r) const
  47. {
  48.         Point u(cos(angle), sin(angle));
  49.         return Ex0*exp(-I*medium->gamma*r.dot(u));
  50. }

  51. dcomplex Excitation::planeWaveTMHtField(const Point& r, const Point& t) const
  52. {
  53.         Point u(cos(angle), sin(angle));
  54.         Point tmp(u.getY(), -u.getX());
  55.         return Ex0/medium->Z*t.dot(tmp)*exp(-I*medium->gamma*r.dot(u));
  56. }

  57. // ========================================================================
  58. // GAUSSIAN BUNDLES
  59. // ========================================================================

  60. dcomplex Excitation::gaussBundleExField(const Point& r) const
  61. {
  62.         // perform coordinate transformation to gauss bundle intrinsic coords
  63.         double cphi = cos(angle);
  64.         double sphi = sin(angle);
  65.         Point arg(r.getX()*cphi+r.getY()*sphi, -r.getX()*sphi+r.getY()*cphi);
  66.         arg = arg-orig;

  67.         dcomplex RR = 0.5*medium->gamma*gaussW*gaussW;
  68.         dcomplex q = arg.getX()+I*RR;
  69.         return Ex0/sqrt(q)*exp(-I*medium->gamma*(0.5*arg.getY()*
  70.                         arg.getY()/q+arg.getX()));
  71. }

  72. dcomplex Excitation::gaussBundleHtField(const Point& r, const Point& t) const
  73. {
  74.         // perform coordinate transformation to gauss bundle intrinsic coords
  75.         double cphi = cos(angle);
  76.         double sphi = sin(angle);
  77.         Point arg(r.getX()*cphi+r.getY()*sphi, -r.getX()*sphi+r.getY()*cphi);
  78.         arg = arg-orig;
  79.         Point ta(t.getX()*cphi+t.getY()*sphi, -t.getX()*sphi+t.getY()*cphi);

  80.         dcomplex RR = 0.5*medium->gamma*gaussW*gaussW;
  81.         dcomplex q = arg.getX()+I*RR;
  82.         dcomplex GB = Ex0/sqrt(q)*exp(-I*medium->gamma*(0.5*arg.getY()*
  83.                         arg.getY()/q+arg.getX()));

  84.         dcomplex Htx = -I*medium->gamma*arg.getY()/q*GB;
  85.         dcomplex Hty = -(0.5*I*medium->gamma*arg.getY()*arg.getY()/q/q
  86.                         -0.5/q-medium->gamma*I)*GB;
  87.         return Ex0*I/2.0/pi/medium->frequency/medium->mu*
  88.                         (ta.getX()*Htx+ta.getY()*Hty);
  89. }

  90. // ========================================================================
  91. // PUBLIC FUNCTIONS
  92. // ========================================================================

  93. dcomplex Excitation::calcExField(const Point& r) const
  94. {
  95.         switch (source) {
  96.                 case POINTSOURCE:
  97.                         return pointSourceExField(r);
  98.                 case GAUSSBUNDLE:
  99.                         return gaussBundleExField(r);
  100.                 case PLANEWAVE:
  101.                         return planeWaveTMExField(r);
  102.         }
  103. }

  104. dcomplex Excitation::calcHtField(const Point& r, const Point& t) const
  105. {
  106.         switch (source) {
  107.                 case POINTSOURCE:
  108.                         return pointSourceHtField(r, t);
  109.                 case GAUSSBUNDLE:
  110.                         return gaussBundleHtField(r, t);
  111.                 case PLANEWAVE:
  112.                         return planeWaveTMHtField(r, t);
  113.         }
  114. }

  115. std::ostream& operator<<(std::ostream& os, const Excitation& E)
  116. {
  117.         // shortcuts
  118.         Point r = E.orig;
  119.         dcomplex E0 = E.Ex0; dcomplex I0 = E.I0;
  120.         double w = E.gaussW; double angle = E.angle;

  121.         switch(E.source) {
  122.                 case POINTSOURCE:
  123.                         os << "PointSrc at (" << r << "), I = " << I0;
  124.                         break;
  125.                 case GAUSSBUNDLE:
  126.                         os << "GaussB at (" << r << "), E0 = " << E0
  127.                                 << " angle = " << angle << " width = " << w;
  128.                         break;
  129.                 case PLANEWAVE:
  130.                         os << "PlaneWave E0 = " << E0 << ", angle = " << angle;
  131.                         break;
  132.         }
  133.         return os;
  134. }
复制代码
支持代码分享
很好的东西,许多人都在寻找!
好东西啊,元柱辛苦了
谢谢!正在学习。
谢谢分享,支持源代码
缺文件了,楼主有完整版的程序吗?
客服中心 搜索
关于我们
关于我们
关注我们
联系我们
帮助中心
资讯中心
企业生态
社区论坛
服务支持
资源下载
售后服务
推广服务
关注我们
官方微博
官方空间
官方微信
返回顶部