void GradDpElement :: computeStiffnessMatrix_kk(FloatMatrix &answer, MatResponseMode rMode, TimeStep *tStep) { StructuralElement *elem = this->giveStructuralElement(); double dV; FloatMatrix lStiff; FloatArray Nk; FloatMatrix Bk, LBk; StructuralCrossSection *cs = elem->giveStructuralCrossSection(); answer.clear(); for ( auto &gp: *elem->giveIntegrationRule(0) ) { GradDpMaterialExtensionInterface *dpmat = dynamic_cast< GradDpMaterialExtensionInterface * >( cs->giveMaterialInterface(GradDpMaterialExtensionInterfaceType, gp) ); if ( !dpmat ) { OOFEM_ERROR("Material doesn't implement the required DpGrad interface!"); } this->computeNkappaMatrixAt(gp, Nk); this->computeBkappaMatrixAt(gp, Bk); dV = elem->computeVolumeAround(gp); dpmat->givePDGradMatrix_kk(lStiff, rMode, gp, tStep); answer.plusProductUnsym(Nk, Nk, dV); if ( dpmat->giveAveragingType() == 0 || dpmat->giveAveragingType() == 1 ) { double l = lStiff.at(1, 1); answer.plusProductUnsym(Bk, Bk, l * l * dV); } else if ( dpmat->giveAveragingType() == 2 ) { LBk.beProductOf(lStiff, Bk); answer.plusProductUnsym(Bk, LBk, dV); } } }