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)
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
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'] ])
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