void Grid::ApplyBoundaryConditions( int iDataIndex, DataType eDataType ) { for (int n = 0; n < GetActivePatchCount(); n++) { m_vecActiveGridPatches[n]-> ApplyBoundaryConditions(iDataIndex, eDataType); } }
void GridCartesianGLL::ApplyDSS( int iDataUpdate, DataType eDataType ) { // Exchange data between nodes Exchange(eDataType, iDataUpdate); // Post-process velocities across panel edges and // perform direct stiffness summation (DSS) for (int n = 0; n < GetActivePatchCount(); n++) { GridPatchCartesianGLL * pPatch = dynamic_cast<GridPatchCartesianGLL*>(GetActivePatch(n)); const PatchBox & box = pPatch->GetPatchBox(); // Patch-specific quantities int nElementCountA = pPatch->GetElementCountA(); int nElementCountB = pPatch->GetElementCountB(); // Apply panel transforms to velocity data if (eDataType == DataType_State) { pPatch->TransformHaloVelocities(iDataUpdate); } if (eDataType == DataType_TopographyDeriv) { pPatch->TransformTopographyDeriv(); } // Loop through all components associated with this DataType int nComponents; if (eDataType == DataType_State) { nComponents = m_model.GetEquationSet().GetComponents(); } else if (eDataType == DataType_Tracers) { nComponents = m_model.GetEquationSet().GetTracers(); } else if (eDataType == DataType_Vorticity) { nComponents = 1; } else if (eDataType == DataType_Divergence) { nComponents = 1; } else if (eDataType == DataType_TopographyDeriv) { nComponents = 2; } else { _EXCEPTIONT("Invalid DataType"); } // Apply BC only to state DSS if (eDataType == DataType_State) { pPatch->ApplyBoundaryConditions(iDataUpdate, DataType_State, n); } // Perform Direct Stiffness Summation (DSS) for (int c = 0; c < nComponents; c++) { // Obtain the array of working data int nRElements = GetRElements(); DataArray3D<double> pDataUpdate; if ((eDataType == DataType_State) && (GetVarLocation(c) == DataLocation_REdge) ) { nRElements++; } if (eDataType == DataType_TopographyDeriv) { nRElements = 2; } pDataUpdate.SetSize( nRElements, box.GetATotalWidth(), box.GetBTotalWidth()); // State data if (eDataType == DataType_State) { DataArray4D<double> & dState = pPatch->GetDataState(iDataUpdate, GetVarLocation(c)); pDataUpdate.AttachToData(&(dState[c][0][0][0])); // Tracer data } else if (eDataType == DataType_Tracers) { DataArray4D<double> & dTracers = pPatch->GetDataTracers(iDataUpdate); pDataUpdate.AttachToData(&(dTracers[c][0][0][0])); // Vorticity data } else if (eDataType == DataType_Vorticity) { DataArray3D<double> & dVorticity = pPatch->GetDataVorticity(); pDataUpdate.AttachToData(&(dVorticity[0][0][0])); // Divergence data } else if (eDataType == DataType_Divergence) { DataArray3D<double> & dDivergence = pPatch->GetDataDivergence(); pDataUpdate.AttachToData(&(dDivergence[0][0][0])); // Topographic derivative data } else if (eDataType == DataType_TopographyDeriv) { DataArray3D<double> & dTopographyDeriv = pPatch->GetTopographyDeriv(); pDataUpdate.AttachToData(&(dTopographyDeriv[0][0][0])); } // Averaging DSS across patch boundaries for (int k = 0; k < nRElements; k++) { // Average in the alpha direction for (int a = 0; a <= nElementCountA; a++) { int iA = a * m_nHorizontalOrder + box.GetHaloElements(); // Averaging done at the corners of the panel int jBegin = box.GetBInteriorBegin()-1; int jEnd = box.GetBInteriorEnd()+1; // Perform averaging across edge of patch for (int j = jBegin; j < jEnd; j++) { pDataUpdate[k][iA][j] = 0.5 * ( + pDataUpdate[k][iA ][j] + pDataUpdate[k][iA-1][j]); pDataUpdate[k][iA-1][j] = pDataUpdate[k][iA][j]; } } // Average in the beta direction for (int b = 0; b <= nElementCountB; b++) { int iB = b * m_nHorizontalOrder + box.GetHaloElements(); // Averaging done at the corners of the panel int iBegin = box.GetAInteriorBegin()-1; int iEnd = box.GetAInteriorEnd()+1; for (int i = iBegin; i < iEnd; i++) { pDataUpdate[k][i][iB] = 0.5 * ( + pDataUpdate[k][i][iB ] + pDataUpdate[k][i][iB-1]); pDataUpdate[k][i][iB-1] = pDataUpdate[k][i][iB]; } } } } } }