Ansys Lumerical | 使用 STACK 求解器优化 OLED

01 说明

此示例将使用 STACK 求解器来计算有机发光二极管(OLED)的提取效率和与角度相关的色偏。并在案例最后,将 Lumerical 优化后的结构光型输出用于 Ansys SPEOS,让设计人员可以在其中直接体验纳米级设计选择如何影响人类感知。

02 综述

首先在 STACK 求解器中搭建模型与参考文献比较,对萃取效率与色偏讨论。接着以一组优化的 RGB 像素发光特性为例,示范输出给 SPEOS 的光源档案。

步骤1:使用 STACK 重新创建测试微腔结果

在这一步中,我们模拟了来自文献中结构: 器件1~3阳极使用 ITO,器件4~6则使用铝,分别代表弱与强共振腔效应的器件,编号由小到大的器件分别对应电子传输层(ETL)厚度为[40,60,80]纳米。

下图为从 STACK 求解器与相关脚本 stackpurcell 函数得出的结果,是6个不同器件的辐射功率密度与波长、角度的关系。图中可看出强微腔效应的器件, 峰值发射波长发生了显着变化,且随着角度的增加峰向更短的波长弯曲,即所谓的蓝移,是强微腔中与角度相关的色偏主要原因。而弱微腔效应的器件峰值发射波长都为520纳米,整个带宽相对宽,如用于显示器应用代表色彩纯度差。而器件1~4,辐射功率密度在大角度下降很快,如在显示器应用代表视角小。器件5与6虽然解决了视角问题,但波长明显随着角度变化,会引发明显色偏。这些器件的差异证明了颜色纯度和颜色失真之间的权衡。

下图表示器件在极坐标下的归一化场型,蓝色曲线是 STACK 求解器的结果,与文献的绿色曲线相当一致。也可从器件4-6中观察到微腔效应如何影响视角范围。

接下来从 STACK 求解器相关函数 stackdipole 计算 X、Y、Z 三色值并转换为 u’ 和 v’ 以与论文直接比较。下图显示三色值随角度变化的轨迹。可看出弱微腔器件色偏范围很小,位置离色度图边界较远。而强微腔器件随角度变化轨迹长,但位置离色度图边界近。

颜色坐标对发光层的亮度光谱以及材料特性非常敏感,微小的材料差异就能导致较大的结果差异,因此正确的材料信息是必须的。

步骤2:计算优化的 RGB 结果

此步骤绘制了优化后的 RGB 像素的发射特性。案例展示了如何最小化每个像素颜色的角度依赖性,并讨论和演示如何将这些 STACK 结果导出到 SPEOS。

下图绘制了 RGB 像素发光层频谱范围,与器件的辐射功率密度与波长、角度关系图。两者重叠部分即是最后的发光频谱。请注意,即使红色腔确实在蓝色中有二次发射,但因与 EL 发射光谱不重叠;因此该像素不会发出蓝光。

再次从 stackdipole 算出 X、Y、Z 颜色坐标,并转换为 u’ 和 v’ 坐标。绘制在下面的色度图中。

显示器其他颜色将通过混合 RGB 产生,并且由这些点定义的区域(称为色域)将提供可以由该显示器表示的可能颜色空间。我们可以看到纯 RGB 像素色坐标与校正的与色度图边界相邻,表示这些像素提供出色的色纯度,让该显示设备的色域可几乎覆盖人类可感知的所有颜色。

在 u’ 和 v’ 的图中,我们可以看到存在一些不可避免的颜色偏移。但与我们上一步分析的测试设备相比,优化后的设备表现较佳。

接下来我们将结果生成RGB的 *.xmp 文件并导出到 SPEOS, 这是通过预先编写的函数完成的。请注意,绿色像素的峰值发射不是垂直入射。这是由于腔谐振的theta=0与发射光谱峰的没有对准导致。

最后我们假设 100x100um 像素,电流密度为 1 A/m 2 ,相当于每个子像素 10 nA 的电流。每个子像素的发射功率可以稍后在 SPEOS 中进行调整。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
根提供的引用内容,程序中定义了一个名为boos的类,其中包括了栈的基本方法和走迷宫的方法。栈的基本方法包括InitStack(创建栈)、StackEmpty(判断是否空栈)、GetTop(获得栈顶)、Push(入栈)、Pop(出栈)以及free_Stack(释放栈空间)。走迷宫的方法是利用顺序栈求解迷宫中从入口到出口的一条路径,并输出结果。 迷宫的表示使用了一个二维数组maze,其中1表示路不通,0表示可以通过。具体的迷宫规模和初态可以自行定义。通过调用boos类的findMaze方法,可以找到迷宫中从入口到出口的一条路径。 以下是一个示例的C++代码,演示了如何利用栈求解迷宫问题: ```cpp #include <iostream> #include <cstdlib> #define STACK_INIT_SIZE 100 #define STACKINCREMENT 10 typedef struct { int x; // 坐标 int y; // 坐标 int di; // 方向 } position; typedef struct { position *base; position *top; int stacksize; } Stack; class boos { private: Stack sq_stack; public: void InitStack() { // 创建栈 sq_stack.base = new position[STACK_INIT_SIZE]; sq_stack.top = sq_stack.base; sq_stack.stacksize = STACK_INIT_SIZE; } bool StackEmpty() { // 判断是否空栈 return sq_stack.top == sq_stack.base; } bool GetTop(position &temp) { // 获得栈顶 if (sq_stack.top == sq_stack.base) { return false; } temp = *(sq_stack.top - 1); return true; } bool Push(position &temp) { // 入栈 if (sq_stack.top - sq_stack.base >= sq_stack.stacksize) { sq_stack.base = (position *)realloc(sq_stack.base, (sq_stack.stacksize + STACKINCREMENT) * sizeof(position)); if (!sq_stack.base) { return false; } sq_stack.top = sq_stack.base + sq_stack.stacksize; sq_stack.stacksize += STACKINCREMENT; } *sq_stack.top++ = temp; return true; } bool Pop(position &temp) { // 出栈 if (sq_stack.top == sq_stack.base) { return false; } temp = *--sq_stack.top; return true; } void free_Stack() { // 释放栈空间 delete[] sq_stack.base; } bool findMaze(int start_x, int start_y, int end_x, int end_y) { // 迷宫的入口和出口坐标 position curpos; curpos.x = start_x; curpos.y = start_y; curpos.di = -1; Push(curpos); while (!StackEmpty()) { GetTop(curpos); if (curpos.x == end_x && curpos.y == end_y) { while (!StackEmpty()) { Pop(curpos); std::cout << "(" << curpos.x << "," << curpos.y << ") "; } return true; } int i = curpos.x; int j = curpos.y; int di = curpos.di + 1; while (di < 4) { switch (di) { case 0: // 向右 i = curpos.x; j = curpos.y + 1; break; case 1: // 向下 i = curpos.x + 1; j = curpos.y; break; case 2: // 向左 i = curpos.x; j = curpos.y - 1; break; case 3: // 向上 i = curpos.x - 1; j = curpos.y; break; } if (Maze[i][j] == 0) { Maze[i][j] = -1; position nextpos; nextpos.x = i; nextpos.y = j; nextpos.di = 0; Push(nextpos); break; } else { di++; } } if (di == 4) { Maze[curpos.x][curpos.y] = -1; Pop(curpos); } } return false; } }; int main() { int start_x = 1; int start_y = 1; int end_x = 8; int end_y = 8; boos L1; L1.InitStack(); L1.findMaze(start_x, start_y, end_x, end_y); L1.free_Stack(); return 0; } ``` 以上代码实现了利用栈求解迷宫问题。在示例中,迷宫的入口坐标为(1, 1),出口坐标为(8, 8)。程序通过调用boos类的findMaze方法,找到了从入口到出口的一条路径,并将路径输出到控制台。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值