void seissol::model::getTransposedRiemannSolver( seissol::model::Material const& local, seissol::model::Material const& neighbor, enum ::faceType type, //real const Atransposed[STAR_NNZ], DenseMatrixView<NUMBER_OF_QUANTITIES, NUMBER_OF_QUANTITIES> Flocal, DenseMatrixView<NUMBER_OF_QUANTITIES, NUMBER_OF_QUANTITIES> Fneighbor ) { real QgodNeighborData[NUMBER_OF_QUANTITIES * NUMBER_OF_QUANTITIES]; real QgodLocalData[NUMBER_OF_QUANTITIES * NUMBER_OF_QUANTITIES]; DenseMatrixView<NUMBER_OF_QUANTITIES, NUMBER_OF_QUANTITIES> QgodNeighbor(QgodNeighborData); DenseMatrixView<NUMBER_OF_QUANTITIES, NUMBER_OF_QUANTITIES> QgodLocal(QgodLocalData); seissol::model::getTransposedElasticGodunovState(local, neighbor, QgodLocal, QgodNeighbor); // \todo Generate a kernel for this and use Atransposed instead of the following. real AtData[NUMBER_OF_QUANTITIES * NUMBER_OF_QUANTITIES]; MatrixView At(AtData, sizeof(AtData)/sizeof(real), &colMjrIndex<NUMBER_OF_QUANTITIES>); seissol::model::getTransposedElasticCoefficientMatrix(local, 0, At); Flocal.setZero(); Fneighbor.setZero(); for (unsigned j = 0; j < NUMBER_OF_QUANTITIES; ++j) { for (unsigned i = 0; i < NUMBER_OF_QUANTITIES; ++i) { for (unsigned k = 0; k < NUMBER_OF_QUANTITIES; ++k) { Flocal(i,j) += QgodLocal(i,k) * At(k,j); Fneighbor(i,j) += QgodNeighbor(i,k) * At(k,j); } } } seissol::model::applyBoundaryConditionToElasticFluxSolver(type, Fneighbor.block<NUMBER_OF_QUANTITIES, 9>(0, 0)); }
void seissol::model::getTransposedRiemannSolver( seissol::model::Material const& local, seissol::model::Material const& neighbor, enum faceType type, //real const Atransposed[STAR_NNZ], DenseMatrixView<NUMBER_OF_QUANTITIES, NUMBER_OF_QUANTITIES> Flocal, DenseMatrixView<NUMBER_OF_QUANTITIES, NUMBER_OF_QUANTITIES> Fneighbor ) { real QgodNeighborData[9 * 9]; real QgodLocalData[9 * 9]; DenseMatrixView<9, 9> QgodNeighbor(QgodNeighborData); DenseMatrixView<9, 9> QgodLocal(QgodLocalData); seissol::model::getTransposedElasticGodunovState(local, neighbor, QgodLocal, QgodNeighbor); // \todo Generate a kernel for this and use Atransposed instead of the following. real tmp[9 * NUMBER_OF_QUANTITIES]; MatrixView At(tmp, sizeof(tmp)/sizeof(real), &colMjrIndex<9>); seissol::model::getTransposedElasticCoefficientMatrix(local, 0, At); Flocal.setZero(); Fneighbor.setZero(); for (unsigned j = 0; j < 9; ++j) { for (unsigned i = 0; i < 9; ++i) { for (unsigned k = 0; k < 9; ++k) { Flocal(i,j) += QgodLocal(i,k) * At(k,j); Fneighbor(i,j) += QgodNeighbor(i,k) * At(k,j); } } } for (unsigned mech = 0; mech < NUMBER_OF_RELAXATION_MECHANISMS; ++mech) { getTransposedViscoelasticCoefficientMatrix(local.omega[mech], 0, mech, At); for (unsigned j = 0; j < 6; ++j) { unsigned col = 9 + mech * 6 + j; for (unsigned i = 0; i < 9; ++i) { for (unsigned k = 0; k < 9; ++k) { Flocal(i,col) += QgodLocal(i,k) * At(k,col); Fneighbor(i,col) += QgodNeighbor(i,k) * At(k,col); } } } } seissol::model::applyBoundaryConditionToElasticFluxSolver(type, Fneighbor.block<NUMBER_OF_QUANTITIES, 9>(0, 0)); }
void seissol::model::getTransposedElasticGodunovState( seissol::model::ElasticMaterial const& local, seissol::model::ElasticMaterial const& neighbor, MatrixView<9, 9> QgodLocal, MatrixView<9, 9> QgodNeighbor ) { QgodNeighbor.setZero(); real cpL = sqrt((local.lambda + 2.0 * local.mu) / local.rho); real cpN = sqrt((neighbor.lambda + 2.0 * neighbor.mu) / neighbor.rho); real csL = sqrt(local.mu / local.rho); real csN = sqrt(neighbor.mu / neighbor.rho); real constP = cpN * (local.lambda + 2.0 * local.mu) + cpL * (neighbor.lambda + 2.0 * neighbor.mu); real constS = csN * local.mu + csL * neighbor.mu; QgodNeighbor(0,0) = cpN * (local.lambda + 2.0 * local.mu) / constP; QgodNeighbor(6,0) = (local.lambda + 2.0 * local.mu) * (neighbor.lambda + 2.0 * neighbor.mu) / constP; QgodNeighbor(0,1) = cpN * local.lambda / constP; QgodNeighbor(6,1) = local.lambda * (neighbor.lambda + 2.0 * neighbor.mu) / constP; QgodNeighbor(0,2) = QgodNeighbor(0,1); QgodNeighbor(6,2) = QgodNeighbor(6,1); QgodNeighbor(3,3) = csN * local.mu / constS; QgodNeighbor(7,3) = local.mu * neighbor.mu / constS; QgodNeighbor(5,5) = QgodNeighbor(3,3); QgodNeighbor(8,5) = QgodNeighbor(7,3); QgodNeighbor(0,6) = cpL * cpN / constP; QgodNeighbor(6,6) = cpL * (neighbor.lambda + 2.0 * neighbor.mu) / constP; QgodNeighbor(3,7) = csL * csN / constS; QgodNeighbor(7,7) = csL * neighbor.mu / constS; QgodNeighbor(5,8) = QgodNeighbor(3,7); QgodNeighbor(8,8) = QgodNeighbor(7,7); // QgodLocal = I - QgodNeighbor for (unsigned idx = 0; idx < QgodLocal.rows() * QgodLocal.cols(); ++idx) { QgodLocal.data[idx] = -QgodNeighbor.data[idx]; } for (unsigned idx = 0; idx < QgodLocal.rows() && idx < QgodLocal.cols(); ++idx) { QgodLocal(idx, idx) += 1.0; } }