double* Engine_Interface_FDTD::GetRawInterpolatedField(const unsigned int* pos, double* out, int type) const { unsigned int iPos[] = {pos[0],pos[1],pos[2]}; int nP,nPP; double delta; switch (m_InterpolType) { default: case NO_INTERPOLATION: for (int n=0; n<3; ++n) out[n] = GetRawField(n,pos,type); break; case NODE_INTERPOLATE: for (int n=0; n<3; ++n) { delta = m_Op->GetEdgeLength(n,iPos); out[n] = GetRawField(n,iPos,type); if (delta==0) { out[n]=0; continue; } if (pos[n]==0) { out[n] *= 0.5; //make it consistant with upper PEC boundary continue; } --iPos[n]; double deltaDown = m_Op->GetEdgeLength(n,iPos); double deltaRel = delta / (delta+deltaDown); out[n] = out[n]*(1.0-deltaRel) + (double)GetRawField(n,iPos,type)*deltaRel; ++iPos[n]; } break; case CELL_INTERPOLATE: for (int n=0; n<3; ++n) { nP = (n+1)%3; nPP = (n+2)%3; if ((pos[0]==m_Op->GetOriginalNumLines(0)-1) || (pos[1]==m_Op->GetOriginalNumLines(1)-1) || (pos[2]==m_Op->GetOriginalNumLines(2)-1)) { out[n] = 0; //electric field outside the field domain is always zero continue; } out[n]=GetRawField(n,iPos,type); ++iPos[nP]; out[n]+=GetRawField(n,iPos,type); ++iPos[nPP]; out[n]+=GetRawField(n,iPos,type); --iPos[nP]; out[n]+=GetRawField(n,iPos,type); --iPos[nPP]; out[n]/=4; } break; } return out; }
double* Engine_Interface_FDTD::GetRawInterpolatedField(const unsigned int* pos, double* out, int type) const { unsigned int iPos[] = {pos[0],pos[1],pos[2]}; int nP,nPP; double delta; switch (m_InterpolType) { default: case NO_INTERPOLATION: for (int n=0; n<3; ++n) out[n] = GetRawField(n,pos,type); break; case NODE_INTERPOLATE: for (int n=0; n<3; ++n) { if (pos[n]==m_Op->GetNumberOfLines(n, true)-1) // use only the "lower value" at the upper bound { --iPos[n]; out[n] = (double)GetRawField(n,iPos,type); ++iPos[n]; continue; } delta = m_Op->GetEdgeLength(n,iPos); out[n] = GetRawField(n,iPos,type); if (delta==0) { out[n]=0; continue; } if (pos[n]==0) // use only the "upper value" at the lower bound continue; --iPos[n]; double deltaDown = m_Op->GetEdgeLength(n,iPos); double deltaRel = delta / (delta+deltaDown); out[n] = out[n]*(1.0-deltaRel) + (double)GetRawField(n,iPos,type)*deltaRel; ++iPos[n]; } break; case CELL_INTERPOLATE: for (int n=0; n<3; ++n) { nP = (n+1)%3; nPP = (n+2)%3; if ((pos[0]==m_Op->GetNumberOfLines(0,true)-1) || (pos[1]==m_Op->GetNumberOfLines(1,true)-1) || (pos[2]==m_Op->GetNumberOfLines(2,true)-1)) { out[n] = 0; //electric field outside the field domain is always zero continue; } out[n]=GetRawField(n,iPos,type); ++iPos[nP]; out[n]+=GetRawField(n,iPos,type); ++iPos[nPP]; out[n]+=GetRawField(n,iPos,type); --iPos[nP]; out[n]+=GetRawField(n,iPos,type); --iPos[nPP]; out[n]/=4; } break; } return out; }
/*! Get the value of the field specified by Name and place its value in buf. \param Name Name of field. \param buf Buffer to hold field value. Must be large enough to hold the entire field value. Use GetFieldLen() to determine the length of the field, if necessary. \returns One of the following: */ xbShort xbDbf::GetRawField(const char *Name, char *buf) const { return GetRawField(GetFieldNo(Name), buf); }