Beispiel #1
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[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));
}
Beispiel #2
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));
}
Beispiel #3
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;
  }
}