void GridPatchCartesianGLL::EvaluateTestCase( const TestCase & test, const Time & time, int iDataIndex ) { // Initialize the data at each node if (m_datavecStateNode.size() == 0) { _EXCEPTIONT("InitializeData must be called before InitialConditions"); } if (iDataIndex >= m_datavecStateNode.size()) { _EXCEPTIONT("Invalid iDataIndex (out of range)"); } // Check dimensionality if ((m_grid.GetModel().GetEquationSet().GetDimensionality() == 2) && (m_nVerticalOrder != 1) ) { _EXCEPTIONT("VerticalOrder / Dimensionality mismatch:\n" "For 2D problems vertical order must be 1."); } // Evaluate topography EvaluateTopography(test); // Physical constants const PhysicalConstants & phys = m_grid.GetModel().GetPhysicalConstants(); // Initialize the topography at each node for (int i = 0; i < m_box.GetATotalWidth(); i++) { for (int j = 0; j < m_box.GetBTotalWidth(); j++) { m_dataTopography[i][j] = test.EvaluateTopography( phys, m_dataLon[i][j], m_dataLat[i][j]); if (m_dataTopography[i][j] >= m_grid.GetZtop()) { _EXCEPTIONT("TestCase topography exceeds model top."); } // Gal-Chen and Sommerville vertical coordinate for (int k = 0; k < m_grid.GetRElements(); k++) { m_dataZLevels[k][i][j] = m_dataTopography[i][j] + m_grid.GetREtaLevel(k) * (m_grid.GetZtop() - m_dataTopography[i][j]); } for (int k = 0; k <= m_grid.GetRElements(); k++) { m_dataZInterfaces[k][i][j] = m_dataTopography[i][j] + m_grid.GetREtaInterface(k) * (m_grid.GetZtop() - m_dataTopography[i][j]); } /* // Schar Exponential Decay vertical coordinate for (int k = 0; k < m_grid.GetRElements(); k++) { m_dataZLevels[k][i][j] = m_grid.GetZtop() * m_grid.GetREtaLevel(k) + m_dataTopography[i][j] * sinh(m_grid.GetZtop() * (1.0 - m_grid.GetREtaLevel(k)) / m_dSL) / sinh(m_grid.GetZtop() / m_dSL); } for (int k = 0; k <= m_grid.GetRElements(); k++) { m_dataZInterfaces[k][i][j] = m_grid.GetZtop() * m_grid.GetREtaInterface(k) + m_dataTopography[i][j] * sinh(m_grid.GetZtop() * (1.0 - m_grid.GetREtaInterface(k)) / m_dSL) / sinh(m_grid.GetZtop() / m_dSL); } */ } } // Initialize the Rayleigh friction strength at each node if (test.HasRayleighFriction()) { for (int i = 0; i < m_box.GetATotalWidth(); i++) { for (int j = 0; j < m_box.GetBTotalWidth(); j++) { for (int k = 0; k < m_grid.GetRElements(); k++) { m_dataRayleighStrengthNode[k][i][j] = test.EvaluateRayleighStrength( m_dataZLevels[k][i][j], m_dataLon[i][j], m_dataLat[i][j]); } for (int k = 0; k < m_grid.GetRElements(); k++) { m_dataRayleighStrengthREdge[k][i][j] = test.EvaluateRayleighStrength( m_dataZInterfaces[k][i][j], m_dataLon[i][j], m_dataLat[i][j]); } } } } // Buffer vector for storing pointwise states const EquationSet & eqns = m_grid.GetModel().GetEquationSet(); int nComponents = eqns.GetComponents(); int nTracers = eqns.GetTracers(); DataVector<double> dPointwiseState; dPointwiseState.Initialize(nComponents); DataVector<double> dPointwiseRefState; dPointwiseRefState.Initialize(nComponents); DataVector<double> dPointwiseTracers; if (m_datavecTracers.size() > 0) { dPointwiseTracers.Initialize(nTracers); } // Evaluate the state on model levels for (int k = 0; k < m_grid.GetRElements(); k++) { for (int i = 0; i < m_box.GetATotalWidth(); i++) { for (int j = 0; j < m_box.GetBTotalWidth(); j++) { // Evaluate pointwise state test.EvaluatePointwiseState( m_grid.GetModel().GetPhysicalConstants(), time, m_dataZLevels[k][i][j], m_dataLon[i][j], m_dataLat[i][j], dPointwiseState, dPointwiseTracers); eqns.ConvertComponents(phys, dPointwiseState); for (int c = 0; c < dPointwiseState.GetRows(); c++) { m_datavecStateNode[iDataIndex][c][k][i][j] = dPointwiseState[c]; } // Evaluate reference state if (m_grid.HasReferenceState()) { test.EvaluateReferenceState( m_grid.GetModel().GetPhysicalConstants(), m_dataZLevels[k][i][j], m_dataLon[i][j], m_dataLat[i][j], dPointwiseRefState); eqns.ConvertComponents(phys, dPointwiseRefState); for (int c = 0; c < dPointwiseState.GetRows(); c++) { m_dataRefStateNode[c][k][i][j] = dPointwiseRefState[c]; } } // Evaluate tracers for (int c = 0; c < dPointwiseTracers.GetRows(); c++) { m_datavecTracers[iDataIndex][c][k][i][j] = dPointwiseTracers[c]; } } } } // Evaluate the state on model interfaces for (int k = 0; k <= m_grid.GetRElements(); k++) { for (int i = 0; i < m_box.GetATotalWidth(); i++) { for (int j = 0; j < m_box.GetBTotalWidth(); j++) { // Evaluate pointwise state test.EvaluatePointwiseState( phys, time, m_dataZInterfaces[k][i][j], m_dataLon[i][j], m_dataLat[i][j], dPointwiseState, dPointwiseTracers); eqns.ConvertComponents(phys, dPointwiseState); for (int c = 0; c < dPointwiseState.GetRows(); c++) { m_datavecStateREdge[iDataIndex][c][k][i][j] = dPointwiseState[c]; } if (m_grid.HasReferenceState()) { test.EvaluateReferenceState( phys, m_dataZInterfaces[k][i][j], m_dataLon[i][j], m_dataLat[i][j], dPointwiseRefState); eqns.ConvertComponents(phys, dPointwiseRefState); for (int c = 0; c < dPointwiseState.GetRows(); c++) { m_dataRefStateREdge[c][k][i][j] = dPointwiseRefState[c]; } } } } } }
void GridPatchCSGLL::EvaluateTestCase( const TestCase & test, const Time & time, int iDataIndex ) { // Initialize the data at each node if (m_datavecStateNode.size() == 0) { _EXCEPTIONT("InitializeData must be called before InitialConditions"); } if (iDataIndex >= m_datavecStateNode.size()) { _EXCEPTIONT("Invalid iDataIndex (out of range)"); } // 2D equation set bool fIs2DEquationSet = false; if (m_grid.GetModel().GetEquationSet().GetDimensionality() == 2) { fIs2DEquationSet = true; } // Check dimensionality if (fIs2DEquationSet && (m_nVerticalOrder != 1)) { _EXCEPTIONT("VerticalOrder / Dimensionality mismatch:\n" "For 2D problems vertical order must be 1."); } // Evaluate topography EvaluateTopography(test); // Physical constants const PhysicalConstants & phys = m_grid.GetModel().GetPhysicalConstants(); // Initialize the vertical height in each node if (fIs2DEquationSet) { for (int i = 0; i < m_box.GetATotalWidth(); i++) { for (int j = 0; j < m_box.GetBTotalWidth(); j++) { m_dataZLevels[0][i][j] = 0.0; m_dataZInterfaces[0][i][j] = 0.0; m_dataZInterfaces[1][i][j] = 1.0; } } } else { for (int i = 0; i < m_box.GetATotalWidth(); i++) { for (int j = 0; j < m_box.GetBTotalWidth(); j++) { // Gal-Chen and Sommerville (1975) vertical coordinate for (int k = 0; k < m_grid.GetRElements(); k++) { double dREta = m_grid.GetREtaLevel(k); /* double dREtaStretch; double dDxREtaStretch; m_grid.EvaluateVerticalStretchF( dREta, dREtaStretch, dDxREtaStretch); */ m_dataZLevels[k][i][j] = m_dataTopography[i][j] + dREta * (m_grid.GetZtop() - m_dataTopography[i][j]); } for (int k = 0; k <= m_grid.GetRElements(); k++) { double dREta = m_grid.GetREtaInterface(k); /* double dREtaStretch; double dDxREtaStretch; m_grid.EvaluateVerticalStretchF( dREta, dREtaStretch, dDxREtaStretch); */ m_dataZInterfaces[k][i][j] = m_dataTopography[i][j] + dREta * (m_grid.GetZtop() - m_dataTopography[i][j]); } } } } // Initialize the Rayleigh friction strength at each node if (test.HasRayleighFriction()) { for (int i = 0; i < m_box.GetATotalWidth(); i++) { for (int j = 0; j < m_box.GetBTotalWidth(); j++) { for (int k = 0; k < m_grid.GetRElements(); k++) { m_dataRayleighStrengthNode[k][i][j] = test.EvaluateRayleighStrength( m_dataZLevels[k][i][j], m_dataLon[i][j], m_dataLat[i][j]); } for (int k = 0; k < m_grid.GetRElements(); k++) { m_dataRayleighStrengthREdge[k][i][j] = test.EvaluateRayleighStrength( m_dataZInterfaces[k][i][j], m_dataLon[i][j], m_dataLat[i][j]); } } } } // Buffer vector for storing pointwise states const EquationSet & eqns = m_grid.GetModel().GetEquationSet(); int nComponents = m_grid.GetModel().GetEquationSet().GetComponents(); int nTracers = m_grid.GetModel().GetEquationSet().GetTracers(); DataArray1D<double> dPointwiseState(nComponents); DataArray1D<double> dPointwiseRefState(nComponents); DataArray1D<double> dPointwiseTracers; DataArray1D<double> dPointwiseRefTracers; if (m_datavecTracers.size() > 0) { if (nTracers > 0) { dPointwiseTracers.Allocate(nTracers); dPointwiseRefTracers.Allocate(nTracers); } } // Evaluate the state on model levels for (int k = 0; k < m_grid.GetRElements(); k++) { for (int i = 0; i < m_box.GetATotalWidth(); i++) { for (int j = 0; j < m_box.GetBTotalWidth(); j++) { // Evaluate pointwise state test.EvaluatePointwiseState( phys, time, m_dataZLevels[k][i][j], m_dataLon[i][j], m_dataLat[i][j], dPointwiseState, dPointwiseTracers); eqns.ConvertComponents( phys, dPointwiseState, dPointwiseTracers); for (int c = 0; c < dPointwiseState.GetRows(); c++) { m_datavecStateNode[iDataIndex][c][k][i][j] = dPointwiseState[c]; } // Transform state velocities double dUlon; double dUlat; dUlon = m_datavecStateNode[iDataIndex][0][k][i][j]; dUlat = m_datavecStateNode[iDataIndex][1][k][i][j]; dUlon *= phys.GetEarthRadius(); dUlat *= phys.GetEarthRadius(); CubedSphereTrans::CoVecTransABPFromRLL( tan(m_dANode[i]), tan(m_dBNode[j]), m_box.GetPanel(), dUlon, dUlat, m_datavecStateNode[iDataIndex][0][k][i][j], m_datavecStateNode[iDataIndex][1][k][i][j]); // Evaluate reference state if (m_grid.HasReferenceState()) { test.EvaluateReferenceState( m_grid.GetModel().GetPhysicalConstants(), m_dataZLevels[k][i][j], m_dataLon[i][j], m_dataLat[i][j], dPointwiseRefState, dPointwiseRefTracers); eqns.ConvertComponents( phys, dPointwiseRefState, dPointwiseRefTracers); for (int c = 0; c < dPointwiseRefState.GetRows(); c++) { m_dataRefStateNode[c][k][i][j] = dPointwiseRefState[c]; } for (int c = 0; c < dPointwiseRefTracers.GetRows(); c++) { m_dataRefTracers[c][k][i][j] = dPointwiseRefTracers[c]; } // Transform reference velocities dUlon = m_dataRefStateNode[0][k][i][j]; dUlat = m_dataRefStateNode[1][k][i][j]; dUlon *= phys.GetEarthRadius(); dUlat *= phys.GetEarthRadius(); CubedSphereTrans::CoVecTransABPFromRLL( tan(m_dANode[i]), tan(m_dBNode[j]), m_box.GetPanel(), dUlon, dUlat, m_dataRefStateNode[0][k][i][j], m_dataRefStateNode[1][k][i][j]); } // Evaluate tracers for (int c = 0; c < dPointwiseTracers.GetRows(); c++) { m_datavecTracers[iDataIndex][c][k][i][j] = dPointwiseTracers[c]; } } } } // Evaluate the state on model interfaces for (int k = 0; k <= m_grid.GetRElements(); k++) { for (int i = 0; i < m_box.GetATotalWidth(); i++) { for (int j = 0; j < m_box.GetBTotalWidth(); j++) { // Evaluate pointwise state test.EvaluatePointwiseState( m_grid.GetModel().GetPhysicalConstants(), time, m_dataZInterfaces[k][i][j], m_dataLon[i][j], m_dataLat[i][j], dPointwiseState, dPointwiseTracers); eqns.ConvertComponents( phys, dPointwiseState, dPointwiseTracers); for (int c = 0; c < dPointwiseState.GetRows(); c++) { m_datavecStateREdge[iDataIndex][c][k][i][j] = dPointwiseState[c]; } // Transform state velocities double dUlon; double dUlat; dUlon = m_datavecStateREdge[iDataIndex][0][k][i][j]; dUlat = m_datavecStateREdge[iDataIndex][1][k][i][j]; dUlon *= phys.GetEarthRadius(); dUlat *= phys.GetEarthRadius(); CubedSphereTrans::CoVecTransABPFromRLL( tan(m_dANode[i]), tan(m_dBNode[j]), m_box.GetPanel(), dUlon, dUlat, m_datavecStateREdge[iDataIndex][0][k][i][j], m_datavecStateREdge[iDataIndex][1][k][i][j]); if (m_grid.HasReferenceState()) { test.EvaluateReferenceState( m_grid.GetModel().GetPhysicalConstants(), m_dataZInterfaces[k][i][j], m_dataLon[i][j], m_dataLat[i][j], dPointwiseRefState, dPointwiseRefTracers); eqns.ConvertComponents( phys, dPointwiseRefState, dPointwiseRefTracers); for (int c = 0; c < dPointwiseState.GetRows(); c++) { m_dataRefStateREdge[c][k][i][j] = dPointwiseRefState[c]; } // Transform reference velocities dUlon = m_dataRefStateREdge[0][k][i][j]; dUlat = m_dataRefStateREdge[1][k][i][j]; dUlon *= phys.GetEarthRadius(); dUlat *= phys.GetEarthRadius(); CubedSphereTrans::CoVecTransABPFromRLL( tan(m_dANode[i]), tan(m_dBNode[j]), m_box.GetPanel(), dUlon, dUlat, m_dataRefStateREdge[0][k][i][j], m_dataRefStateREdge[1][k][i][j]); } } } } }