📄 oneprint.c
字号:
/**********Copyright 1992 Regents of the University of California. All rights reserved.Author: 1987 Kartikeya Mayaram, U. C. Berkeley CAD GroupAuthor: 1992 David A. Gates, U. C. Berkeley CAD Group**********/#include <math.h>#include "numglobs.h"#include "numconst.h"#include "numenum.h"#include "nummacs.h"#include "onemesh.h"#include "onedev.h"#include "carddefs.h"#include "spmatrix.h"voidONEprnSolution(file, pDevice, output) FILE *file; ONEdevice *pDevice; OUTPcard *output;{ int index, i; int numVars = 0; ONEnode **nodeArray; ONEnode *pNode; ONEelem *pElem, *pPrevElem; ONEmaterial *info; double data[50]; double eField, refPsi = 0.0, eGap, dGap; double mun, mup, jc, jd, jn, jp, jt; double coeff1, coeff2; if (output->OUTPnumVars == -1) { /* First pass. Need to count number of variables in output. */ numVars++; /* For the X scale */ if (output->OUTPdoping) { numVars++; } if (output->OUTPpsi) { numVars++; } if (output->OUTPequPsi) { numVars++; } if (output->OUTPvacPsi) { numVars++; } if (output->OUTPnConc) { numVars++; } if (output->OUTPpConc) { numVars++; } if (output->OUTPphin) { numVars++; } if (output->OUTPphip) { numVars++; } if (output->OUTPphic) { numVars++; } if (output->OUTPphiv) { numVars++; } if (output->OUTPeField) { numVars++; } if (output->OUTPjc) { numVars++; } if (output->OUTPjd) { numVars++; } if (output->OUTPjn) { numVars++; } if (output->OUTPjp) { numVars++; } if (output->OUTPjt) { numVars++; } if (output->OUTPuNet) { numVars++; } if (output->OUTPmun) { numVars++; } if (output->OUTPmup) { numVars++; } output->OUTPnumVars = numVars; } /* generate the work array for printing node info */ ALLOC(nodeArray, ONEnode *, 1 + pDevice->numNodes); /* store the nodes in this work array and print out later */ for (index = 1; index < pDevice->numNodes; index++) { pElem = pDevice->elemArray[index]; if (refPsi == 0.0 && pElem->matlInfo->type == SEMICON) { refPsi = pElem->matlInfo->refPsi; } for (i = 0; i <= 1; i++) { if (pElem->evalNodes[i]) { pNode = pElem->pNodes[i]; nodeArray[pNode->nodeI] = pNode; } } } /* Initialize rawfile */ numVars = output->OUTPnumVars; fprintf(file, "Title: Device %s internal state\n", pDevice->name); fprintf(file, "Plotname: Device Cross Section\n"); fprintf(file, "Flags: real\n"); fprintf(file, "Command: deftype p xs cross\n"); fprintf(file, "Command: deftype v distance m\n"); fprintf(file, "Command: deftype v concentration cm^-3\n"); fprintf(file, "Command: deftype v electric_field V/cm\n"); fprintf(file, "Command: deftype v current_density A/cm^2\n"); fprintf(file, "Command: deftype v concentration/time cm^-3/s\n"); fprintf(file, "Command: deftype v mobility cm^2/Vs\n"); fprintf(file, "No. Variables: %d\n", numVars); fprintf(file, "No. Points: %d\n", pDevice->numNodes); numVars = 0; fprintf(file, "Variables:\n"); fprintf(file, "\t%d x distance\n", numVars++); if (output->OUTPpsi) { fprintf(file, "\t%d psi voltage\n", numVars++); } if (output->OUTPequPsi) { fprintf(file, "\t%d equ.psi voltage\n", numVars++); } if (output->OUTPvacPsi) { fprintf(file, "\t%d vac.psi voltage\n", numVars++); } if (output->OUTPphin) { fprintf(file, "\t%d phin voltage\n", numVars++); } if (output->OUTPphip) { fprintf(file, "\t%d phip voltage\n", numVars++); } if (output->OUTPphic) { fprintf(file, "\t%d phic voltage\n", numVars++); } if (output->OUTPphiv) { fprintf(file, "\t%d phiv voltage\n", numVars++); } if (output->OUTPdoping) { fprintf(file, "\t%d dop concentration\n", numVars++); } if (output->OUTPnConc) { fprintf(file, "\t%d n concentration\n", numVars++); } if (output->OUTPpConc) { fprintf(file, "\t%d p concentration\n", numVars++); } if (output->OUTPeField) { fprintf(file, "\t%d e electric_field\n", numVars++); } if (output->OUTPjc) { fprintf(file, "\t%d jc current_density\n", numVars++); } if (output->OUTPjd) { fprintf(file, "\t%d jd current_density\n", numVars++); } if (output->OUTPjn) { fprintf(file, "\t%d jn current_density\n", numVars++); } if (output->OUTPjp) { fprintf(file, "\t%d jp current_density\n", numVars++); } if (output->OUTPjt) { fprintf(file, "\t%d jt current_density\n", numVars++); } if (output->OUTPuNet) { fprintf(file, "\t%d unet concentration/time\n", numVars++); } if (output->OUTPmun) { fprintf(file, "\t%d mun mobility\n", numVars++); } if (output->OUTPmup) { fprintf(file, "\t%d mup mobility\n", numVars++); } fprintf(file, "Binary:\n"); for (index = 1; index <= pDevice->numNodes; index++) { pNode = nodeArray[index]; if (index > 1 AND index < pDevice->numNodes) { pElem = pNode->pRightElem; pPrevElem = pNode->pLeftElem; if (pElem->evalNodes[0]) { info = pElem->matlInfo; } else if (pPrevElem->evalNodes[1]) { info = pPrevElem->matlInfo; } coeff1 = pPrevElem->dx / (pPrevElem->dx + pElem->dx); coeff2 = pElem->dx / (pPrevElem->dx + pElem->dx); eField = -coeff1 * pElem->pEdge->dPsi * pElem->rDx - coeff2 * pPrevElem->pEdge->dPsi * pPrevElem->rDx; mun = coeff1 * pElem->pEdge->mun + coeff2 * pPrevElem->pEdge->mun; mup = coeff1 * pElem->pEdge->mup + coeff2 * pPrevElem->pEdge->mup; jn = coeff1 * pElem->pEdge->jn + coeff2 * pPrevElem->pEdge->jn; jp = coeff1 * pElem->pEdge->jp + coeff2 * pPrevElem->pEdge->jp; jd = coeff1 * pElem->pEdge->jd + coeff2 * pPrevElem->pEdge->jd; } else if (index == 1) { info = pNode->pRightElem->matlInfo; eField = 0.0; mun = pNode->pRightElem->pEdge->mun; mup = pNode->pRightElem->pEdge->mup; jn = pNode->pRightElem->pEdge->jn; jp = pNode->pRightElem->pEdge->jp; jd = pNode->pRightElem->pEdge->jd; } else { info = pNode->pLeftElem->matlInfo; eField = 0.0; mun = pNode->pLeftElem->pEdge->mun; mup = pNode->pLeftElem->pEdge->mup; jn = pNode->pLeftElem->pEdge->jn; jp = pNode->pLeftElem->pEdge->jp; jd = pNode->pLeftElem->pEdge->jd; } jc = jn + jp; jt = jc + jd; /* Crude hack to get around the fact that the base node wipes out 'eg' */ if (index == pDevice->baseIndex) { eGap = info->eg0; dGap = 0.0; } else { eGap = pNode->eg * VNorm; dGap = 0.5 * (info->eg0 - eGap); } /* Now fill in the data array */ numVars = 0; data[numVars++] = pNode->x * 1e-2; if (output->OUTPpsi) { data[numVars++] = (pNode->psi - refPsi) * VNorm; } if (output->OUTPequPsi) { data[numVars++] = (pNode->psi0 - refPsi) * VNorm; } if (output->OUTPvacPsi) { data[numVars++] = pNode->psi * VNorm; } if (output->OUTPphin) { if (info->type != INSULATOR) { data[numVars++] = (pNode->psi - refPsi - log(pNode->nConc / pNode->nie)) * VNorm; } else { data[numVars++] = 0.0; } } if (output->OUTPphip) { if (info->type != INSULATOR) { data[numVars++] = (pNode->psi - refPsi + log(pNode->pConc / pNode->nie)) * VNorm; } else { data[numVars++] = 0.0; } } if (output->OUTPphic) { data[numVars++] = (pNode->psi + pNode->eaff) * VNorm + dGap; } if (output->OUTPphiv) { data[numVars++] = (pNode->psi + pNode->eaff) * VNorm + dGap + eGap; } if (output->OUTPdoping) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -