这学期的激光课设,要求编程实现一个Fox-Li(福克斯-李)迭代算法,用于模拟激光谐振腔中的自再现模式。同时要求有友好的界面,和三维的模场分布图。
大学里面的课设嘛,一般都是用Matlab做,不过这次我想好好弄一弄,想要用C++写(计算速度快),想要有真正的3D图像(用OpenGL),当然,也许我只是想装B。
一、理论基础
激光谐振腔中的模式分部,往往没有解析解,因此只能通过数值计算的方式研究其分部。Fox-Li迭代算法是最常用的方法,其本质是菲涅耳衍射积分:
对当前源光场u做积分,得到下一个反射镜上的光场,再将该光场作为源光场再积分,得到再下一个反射镜上的光场,以此类推,如此反复,直到光场u的分布趋于稳定。
对于上面的积分,用Matlab的话是轻而易举的,但我既然选择了使用C++,就有必要对上面的积分进行一些变换了,方便代码的编写。
很显然的,我们需要将上式的实部和虚部分开,由于u(x,y)本身是一个复场,因此我们设:
将积分离散化后,变为求和,即下式:
其中u0为下一平面的光场分部。
再将上式的实部与虚部合并在一起,并令左边实部等于右边实部,左边虚部等于右边虚部,可得:
使用以上两式,就可以分别计算光场的实部和虚部,其中在以上各式中:
为简单起见,我只考虑了不同形状的平面腔,因此:
,L为谐振腔的腔长。
在实现上述算法时,一定要注意归一化,即每迭代完一次后,需将所有点的幅值均除以最大值,否则每次迭代都会使幅值减小,最终整个光场就什么也没有了。当然也可以对相位进行归一化,每个相位都减去最小值,由于是否对相位归一化对计算没有影响,所以不是必须的。
二、程序编写
为了获得真正的3D分布图,需要使用OpenGL,这里我选择熟悉的Openframeworks作为开发框架。不管其他的,先把Fox-Li迭代算法写出来才行啊!
void testApp::FoxLiIntegral()
{
vector<ofVec4f> src_field;
src