void KernelValue::computeOffDiagJacobian(unsigned int jvar) { // Moose::perf_log.push("computeOffDiagJacobian()",_name); DenseMatrix<Number> & Ke = _assembly.jacobianBlock(_var.number(), jvar); for (_j=0; _j<_phi.size(); _j++) for (_qp=0; _qp<_qrule->n_points(); _qp++) { if (jvar == _var.number()) { _value = _coord[_qp]*precomputeQpJacobian(); for (_i=0; _i<_test.size(); _i++) Ke(_i,_j) += _JxW[_qp]*_coord[_qp]*_value*_test[_i][_qp]; } else { for (_i=0; _i<_test.size(); _i++) { _value = _coord[_qp]*computeQpOffDiagJacobian(jvar); Ke(_i,_j) += _JxW[_qp]*_coord[_qp]*_value; } } } // Moose::perf_log.pop("computeOffDiagJacobian()",_name); }
void KernelGrad::computeJacobian() { DenseMatrix<Number> & ke = _assembly.jacobianBlock(_var.number(), _var.number()); _local_ke.resize(ke.m(), ke.n()); _local_ke.zero(); const unsigned int n_test = _test.size(); for (_qp = 0; _qp < _qrule->n_points(); _qp++) for (_j = 0; _j < _phi.size(); _j++) { RealGradient value = precomputeQpJacobian() * _JxW[_qp] * _coord[_qp]; for (_i = 0; _i < n_test; _i++) // target for auto vectorization _local_ke(_i, _j) += value * _grad_test[_i][_qp]; } ke += _local_ke; if (_has_diag_save_in) { const unsigned int rows = ke.m(); DenseVector<Number> diag(rows); for (unsigned int i = 0; i < rows; i++) // target for auto vectorization diag(i) = _local_ke(i,i); Threads::spin_mutex::scoped_lock lock(Threads::spin_mtx); for (unsigned int i = 0; i < _diag_save_in.size(); i++) _diag_save_in[i]->sys().solution().add_vector(diag, _diag_save_in[i]->dofIndices()); } }
void KernelValue::computeJacobian() { DenseMatrix<Number> & ke = _assembly.jacobianBlock(_var.number(), _var.number()); _local_ke.resize(ke.m(), ke.n()); _local_ke.zero(); for (_qp = 0; _qp < _qrule->n_points(); _qp++) { for (_j = 0; _j < _phi.size(); _j++) { // NOTE: is it possible to move this out of the for-loop and multiply the _value by _phi[_j][_qp] _value = precomputeQpJacobian(); for (_i = 0; _i < _test.size(); _i++) _local_ke(_i, _j) += _JxW[_qp]*_coord[_qp]*_value*_test[_i][_qp]; } } ke += _local_ke; if (_has_diag_save_in) { unsigned int rows = ke.m(); DenseVector<Number> diag(rows); for(unsigned int i=0; i<rows; i++) diag(i) = _local_ke(i,i); Threads::spin_mutex::scoped_lock lock(Threads::spin_mtx); for(unsigned int i=0; i<_diag_save_in.size(); i++) _diag_save_in[i]->sys().solution().add_vector(diag, _diag_save_in[i]->dofIndices()); } }