Esempio n. 1
0
 def addTime(self, generator):
     qShape = (self.numberOf3DBasisFunctions(), self.numberOfQuantities())
     dQ0 = OptionalDimTensor('dQ(0)',
                             self.Q.optName(),
                             self.Q.optSize(),
                             self.Q.optPos(),
                             qShape,
                             alignStride=True)
     power = Scalar('power')
     derivatives = [dQ0]
     generator.add('derivativeTaylorExpansion(0)',
                   self.I['kp'] <= power * dQ0['kp'])
     for i in range(1, self.order):
         derivativeSum = Add()
         if self.sourceMatrix():
             derivativeSum += derivatives[-1]['kq'] * self.sourceMatrix(
             )['qp']
         for j in range(3):
             derivativeSum += self.db.kDivMT[j][self.t(
                 'kl')] * derivatives[-1]['lq'] * self.starMatrix(j)['qp']
         derivativeSum = DeduceIndices(
             self.Q['kp'].indices).visit(derivativeSum)
         derivativeSum = EquivalentSparsityPattern().visit(derivativeSum)
         dQ = OptionalDimTensor('dQ({})'.format(i),
                                self.Q.optName(),
                                self.Q.optSize(),
                                self.Q.optPos(),
                                qShape,
                                spp=derivativeSum.eqspp(),
                                alignStride=True)
         generator.add('derivative({})'.format(i),
                       dQ['kp'] <= derivativeSum)
         generator.add('derivativeTaylorExpansion({})'.format(i),
                       self.I['kp'] <= self.I['kp'] + power * dQ['kp'])
         derivatives.append(dQ)
Esempio n. 2
0
def add(g):
  db = parseXMLMatrixFile('seissol_matrices.xml')
  
  Q = Tensor('Q', (8, 20, 15))
  I = Tensor('I', (8, 20, 15))
  g.add('seissol_stiffness', Q['skp'] <= db.kXiTDivM['lk'] * I['slq'] * db.star['qp'])

  # Reproduces recursive generation of zero blocks in Cauchy-Kowalevski prodedure,
  # described in "Sustained Petascale Performance of Seismic Simulations with SeisSol on SuperMUC",
  # Breuer et al., ISC 2014.
  dQ_shape = (20, 9)
  dQ0 = Tensor('dQ(0)', dQ_shape)
  star_ela = Tensor('star_ela', (9,9), spp=db.star['qp'].spp().as_ndarray()[0:9,0:9])
  dQ_prev = dQ0
  for i in range(1,4):
    derivativeSum = Add()
    for j in range(3):
      derivativeSum += db.kDivMT[j]['kl'] * dQ_prev['lq'] * star_ela['qp']
    derivativeSum = DeduceIndices('kp').visit(derivativeSum)
    derivativeSum = EquivalentSparsityPattern().visit(derivativeSum)
    dQ = Tensor('dQ({})'.format(i), dQ_shape, spp=derivativeSum.eqspp())
    g.add('derivative({})'.format(i), dQ['kp'] <= derivativeSum)
    dQ_prev = dQ
Esempio n. 3
0
  def addLocal(self, generator):
    volumeSum = Add()
    for i in range(3):
      volumeSum += self.db.kDivM[i][self.t('kl')] * self.I['lq'] * self.db.star[i]['qp']
    volumeExt = (self.Qext['kp'] <= volumeSum)
    generator.add('volumeExt', volumeExt)

    localFluxExt = lambda i: self.Qext['kp'] <= self.Qext['kp'] + self.db.rDivM[i][self.t('km')] * self.db.fMrT[i][self.t('ml')] * self.I['lq'] * self.AplusT['qp']
    localFluxExtPrefetch = lambda i: self.I if i == 0 else (self.Q if i == 1 else None)
    generator.addFamily('localFluxExt', simpleParameterSpace(4), localFluxExt, localFluxExtPrefetch)

    generator.add('local', [
      self.Qane['kpm'] <= self.Qane['kpm'] + self.w['m'] * self.Qext['kq'] * self.selectAne['qp'] + self.Iane['kpl'] * self.W['lm'],
      self.Q['kp'] <= self.Q['kp'] + self.Qext['kq'] * self.selectEla['qp'] + self.Iane['kqm'] * self.E['qmp']
    ])
Esempio n. 4
0
 def derivative(kthDer):
   derivativeSum = Add()
   for j in range(3):
     derivativeSum += self.db.kDivMT[j][self.t('kl')] * dQ[kthDer-1]['lq'] * self.db.star[j]['qp']
   return derivativeSum