void MechanicalContactConstraint::computeOffDiagJacobian(unsigned int jvar) { getConnectedDofIndices(jvar); _Kee.resize(_test_slave.size(), _connected_dof_indices.size()); DenseMatrix<Number> & Knn = _assembly.jacobianBlockNeighbor(Moose::NeighborNeighbor, _master_var.number(), jvar); for (_i=0; _i<_test_slave.size(); _i++) // Loop over the connected dof indices so we can get all the jacobian contributions for (_j=0; _j<_connected_dof_indices.size(); _j++) _Kee(_i,_j) += computeQpOffDiagJacobian(Moose::SlaveSlave, jvar); if (_master_slave_jacobian) { DenseMatrix<Number> & Ken = _assembly.jacobianBlockNeighbor(Moose::ElementNeighbor, _var.number(), jvar); for (_i=0; _i<_test_slave.size(); _i++) for (_j=0; _j<_phi_master.size(); _j++) Ken(_i,_j) += computeQpOffDiagJacobian(Moose::SlaveMaster, jvar); _Kne.resize(_test_master.size(), _connected_dof_indices.size()); if (_Kne.m() && _Kne.n()) for (_i=0; _i<_test_master.size(); _i++) // Loop over the connected dof indices so we can get all the jacobian contributions for (_j=0; _j<_connected_dof_indices.size(); _j++) _Kne(_i,_j) += computeQpOffDiagJacobian(Moose::MasterSlave, jvar); } for (_i=0; _i<_test_master.size(); _i++) for (_j=0; _j<_phi_master.size(); _j++) Knn(_i,_j) += computeQpOffDiagJacobian(Moose::MasterMaster, jvar); }
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 DiracKernel::computeOffDiagJacobian(unsigned int jvar) { if (jvar == _var.number()) { computeJacobian(); } else { DenseMatrix<Number> & ke = _assembly.jacobianBlock(_var.number(), jvar); const std::vector<unsigned int> * multiplicities = _drop_duplicate_points ? NULL : &_local_dirac_kernel_info.getPoints()[_current_elem].second; unsigned int local_qp = 0; Real multiplicity = 1.0; for (_qp = 0; _qp < _qrule->n_points(); _qp++) { _current_point = _physical_point[_qp]; if (isActiveAtPoint(_current_elem, _current_point)) { if (!_drop_duplicate_points) multiplicity = (*multiplicities)[local_qp++]; for (_i=0; _i<_test.size(); _i++) for (_j=0; _j<_phi.size(); _j++) ke(_i, _j) += multiplicity * computeQpOffDiagJacobian(jvar); } } } }
void NodeFaceConstraint::computeOffDiagJacobian(unsigned int jvar) { getConnectedDofIndices(jvar); _Kee.resize(_test_slave.size(), _connected_dof_indices.size()); _Kne.resize(_test_master.size(), _connected_dof_indices.size()); DenseMatrix<Number> & Ken = _assembly.jacobianBlockNeighbor(Moose::ElementNeighbor, _var.number(), jvar); DenseMatrix<Number> & Knn = _assembly.jacobianBlockNeighbor(Moose::NeighborNeighbor, _master_var.number(), jvar); _phi_slave.resize(_connected_dof_indices.size()); _qp = 0; // Fill up _phi_slave so that it is 1 when j corresponds to this dof and 0 for every other dof // This corresponds to evaluating all of the connected shape functions at _this_ node for (unsigned int j=0; j<_connected_dof_indices.size(); j++) { _phi_slave[j].resize(1); if (_connected_dof_indices[j] == _var.nodalDofIndex()) _phi_slave[j][_qp] = 1.0; else _phi_slave[j][_qp] = 0.0; } for (_i=0; _i<_test_slave.size(); _i++) // Loop over the connected dof indices so we can get all the jacobian contributions for (_j=0; _j<_connected_dof_indices.size(); _j++) _Kee(_i,_j) += computeQpOffDiagJacobian(Moose::SlaveSlave, jvar); for (_i=0; _i<_test_slave.size(); _i++) for (_j=0; _j<_phi_master.size(); _j++) Ken(_i,_j) += computeQpOffDiagJacobian(Moose::SlaveMaster, jvar); if (_Kne.m() && _Kne.n()) for (_i=0; _i<_test_master.size(); _i++) // Loop over the connected dof indices so we can get all the jacobian contributions for (_j=0; _j<_connected_dof_indices.size(); _j++) _Kne(_i,_j) += computeQpOffDiagJacobian(Moose::MasterSlave, jvar); for (_i=0; _i<_test_master.size(); _i++) for (_j=0; _j<_phi_master.size(); _j++) Knn(_i,_j) += computeQpOffDiagJacobian(Moose::MasterMaster, jvar); }
void StressDivergenceRZ::computeOffDiagJacobian(unsigned int jvar) { if (jvar == _var.number()) computeJacobian(); else { if (_volumetric_locking_correction) { // calculate volume averaged value of shape function derivative _avg_grad_test.resize(_test.size()); for (_i = 0; _i < _test.size(); _i++) { _avg_grad_test[_i].resize(2); _avg_grad_test[_i][_component] = 0.0; for (_qp = 0; _qp < _qrule->n_points(); _qp++) { if (_component == 0) _avg_grad_test[_i][_component] += (_grad_test[_i][_qp](_component) + _test[_i][_qp] / _q_point[_qp](0)) * _JxW[_qp] * _coord[_qp]; else _avg_grad_test[_i][_component] += _grad_test[_i][_qp](_component) * _JxW[_qp] * _coord[_qp]; } _avg_grad_test[_i][_component] /= _current_elem_volume; } _avg_grad_phi.resize(_phi.size()); for (_i = 0; _i < _phi.size(); _i++) { _avg_grad_phi[_i].resize(3); for (unsigned int component = 0; component < 2; component++) { _avg_grad_phi[_i][component] = 0.0; for (_qp = 0; _qp < _qrule->n_points(); _qp++) { if (component == 0) _avg_grad_phi[_i][component] += (_grad_phi[_i][_qp](component) + _phi[_i][_qp] / _q_point[_qp](0)) * _JxW[_qp] * _coord[_qp]; else _avg_grad_phi[_i][component] += _grad_phi[_i][_qp](component) * _JxW[_qp] * _coord[_qp]; } _avg_grad_phi[_i][component] /= _current_elem_volume; } } } DenseMatrix<Number> & ke = _assembly.jacobianBlock(_var.number(), jvar); for (_i = 0; _i < _test.size(); _i++) for (_j = 0; _j < _phi.size(); _j++) for (_qp = 0; _qp < _qrule->n_points(); _qp++) ke(_i, _j) += _JxW[_qp] * _coord[_qp] * computeQpOffDiagJacobian(jvar); } }
void IntegratedBC::computeJacobianBlockScalar(unsigned int jvar) { DenseMatrix<Number> & ke = _assembly.jacobianBlock(_var.number(), jvar); MooseVariableScalar & jv = _sys.getScalarVariable(_tid, jvar); for (_qp = 0; _qp < _qrule->n_points(); _qp++) for (_i = 0; _i < _test.size(); _i++) for (_j = 0; _j < jv.order(); _j++) ke(_i, _j) += _JxW[_qp] * _coord[_qp] * computeQpOffDiagJacobian(jvar); }
void IntegratedBC::computeJacobianBlockScalar(unsigned int jvar) { prepareMatrixTag(_assembly, _var.number(), jvar); MooseVariableScalar & jv = _sys.getScalarVariable(_tid, jvar); for (_qp = 0; _qp < _qrule->n_points(); _qp++) for (_i = 0; _i < _test.size(); _i++) for (_j = 0; _j < jv.order(); _j++) _local_ke(_i, _j) += _JxW[_qp] * _coord[_qp] * computeQpOffDiagJacobian(jvar); accumulateTaggedLocalMatrix(); }
void KernelGrad::computeOffDiagJacobian(unsigned int jvar) { if (jvar == _var.number()) computeJacobian(); else { DenseMatrix<Number> & Ke = _assembly.jacobianBlock(_var.number(), jvar); for (_j = 0; _j < _phi.size(); _j++) for (_qp = 0; _qp < _qrule->n_points(); _qp++) for (_i = 0; _i < _test.size(); _i++) Ke(_i, _j) += _JxW[_qp] * _coord[_qp] * computeQpOffDiagJacobian(jvar); } }
void ODEKernel::computeOffDiagJacobian(unsigned int jvar) { if (_sys.isScalarVariable(jvar)) { DenseMatrix<Number> & ke = _assembly.jacobianBlock(_var.number(), jvar); MooseVariableScalar & var_j = _sys.getScalarVariable(_tid, jvar); for (_i = 0; _i < _var.order(); _i++) for (_j = 0; _j < var_j.order(); _j++) { if (jvar != _var.number()) ke(_i, _j) += computeQpOffDiagJacobian(jvar); } } }
void NodalKernel::computeOffDiagJacobian(unsigned int jvar) { if (jvar == _var.number()) computeJacobian(); else { _qp = 0; Real cached_val = computeQpOffDiagJacobian(jvar); dof_id_type cached_row = _var.nodalDofIndex(); // Note: this only works for Lagrange variables... dof_id_type cached_col = _current_node->dof_number(_sys.number(), jvar, 0); _assembly.cacheJacobianContribution(cached_row, cached_col, cached_val); } }
void DGKernel::computeOffDiagElemNeighJacobian(Moose::DGJacobianType type,unsigned int jvar) { const VariableTestValue & test_space = ( type == Moose::ElementElement || type == Moose::ElementNeighbor ) ? _test : _test_neighbor; const VariableTestValue & loc_phi = ( type == Moose::ElementElement || type == Moose::NeighborElement ) ? _phi : _phi_neighbor; DenseMatrix<Number> & Kxx = type == Moose::ElementElement ? _assembly.jacobianBlock(_var.number(), jvar) : type == Moose::ElementNeighbor ? _assembly.jacobianBlockNeighbor(Moose::ElementNeighbor, _var.number(), jvar) : type == Moose::NeighborElement ? _assembly.jacobianBlockNeighbor(Moose::NeighborElement, _var.number(), jvar) : _assembly.jacobianBlockNeighbor(Moose::NeighborNeighbor, _var.number(), jvar); for (_qp=0; _qp<_qrule->n_points(); _qp++) for (_i=0; _i<test_space.size(); _i++) for (_j=0; _j<loc_phi.size(); _j++) Kxx(_i,_j) += _JxW[_qp]*_coord[_qp]*computeQpOffDiagJacobian(type, jvar); }
void NodalBC::computeOffDiagJacobian(unsigned int jvar) { if (jvar == _var.number()) computeJacobian(); else { _qp = 0; Real cached_val = computeQpOffDiagJacobian(jvar); dof_id_type cached_row = _var.nodalDofIndex(); // Note: this only works for Lagrange variables... dof_id_type cached_col = _current_node->dof_number(_sys.number(), jvar, 0); // Cache the user's computeQpJacobian() value for later use. _fe_problem.assembly(0).cacheNodalBCJacobianEntry(cached_row, cached_col, cached_val); } }
void StressDivergence::computeOffDiagJacobian(MooseVariableFEBase & jvar) { size_t jvar_num = jvar.number(); if (jvar_num == _var.number()) computeJacobian(); else { if (_volumetric_locking_correction) { // calculate volume averaged value of shape function derivative _avg_grad_test.resize(_test.size()); for (_i = 0; _i < _test.size(); _i++) { _avg_grad_test[_i].resize(3); _avg_grad_test[_i][_component] = 0.0; for (_qp = 0; _qp < _qrule->n_points(); _qp++) _avg_grad_test[_i][_component] += _grad_test[_i][_qp](_component) * _JxW[_qp] * _coord[_qp]; _avg_grad_test[_i][_component] /= _current_elem_volume; } _avg_grad_phi.resize(jvar.phiSize()); for (_i = 0; _i < jvar.phiSize(); _i++) { _avg_grad_phi[_i].resize(3); for (unsigned int component = 0; component < _mesh.dimension(); component++) { _avg_grad_phi[_i][component] = 0.0; for (_qp = 0; _qp < _qrule->n_points(); _qp++) _avg_grad_phi[_i][component] += _grad_phi[_i][_qp](component) * _JxW[_qp] * _coord[_qp]; _avg_grad_phi[_i][component] /= _current_elem_volume; } } } DenseMatrix<Number> & ke = _assembly.jacobianBlock(_var.number(), jvar_num); for (_i = 0; _i < _test.size(); _i++) for (_j = 0; _j < jvar.phiSize(); _j++) for (_qp = 0; _qp < _qrule->n_points(); _qp++) ke(_i, _j) += _JxW[_qp] * _coord[_qp] * computeQpOffDiagJacobian(jvar_num); } }
void IntegratedBC::computeJacobianBlock(MooseVariableFEBase & jvar) { size_t jvar_num = jvar.number(); prepareMatrixTag(_assembly, _var.number(), jvar_num); for (_qp = 0; _qp < _qrule->n_points(); _qp++) for (_i = 0; _i < _test.size(); _i++) for (_j = 0; _j < jvar.phiFaceSize(); _j++) { if (_var.number() == jvar_num) _local_ke(_i, _j) += _JxW[_qp] * _coord[_qp] * computeQpJacobian(); else _local_ke(_i, _j) += _JxW[_qp] * _coord[_qp] * computeQpOffDiagJacobian(jvar_num); } accumulateTaggedLocalMatrix(); }
void ODEKernel::computeOffDiagJacobian(unsigned int jvar) { if (_sys.isScalarVariable(jvar)) { prepareMatrixTag(_assembly, _var.number(), jvar); MooseVariableScalar & var_j = _sys.getScalarVariable(_tid, jvar); for (_i = 0; _i < _var.order(); _i++) for (_j = 0; _j < var_j.order(); _j++) { if (jvar != _var.number()) _local_ke(_i, _j) += computeQpOffDiagJacobian(jvar); } accumulateTaggedLocalMatrix(); } }
void IntegratedBC::computeJacobianBlock(unsigned int jvar) { // Moose::perf_log.push("computeJacobianBlock()","IntegratedBC"); DenseMatrix<Number> & ke = _assembly.jacobianBlock(_var.number(), jvar); for (_qp=0; _qp<_qrule->n_points(); _qp++) for (_i=0; _i<_test.size(); _i++) for (_j=0; _j<_phi.size(); _j++) { if (_var.number() == jvar) ke(_i,_j) += _JxW[_qp]*_coord[_qp]*computeQpJacobian(); else ke(_i,_j) += _JxW[_qp]*_coord[_qp]*computeQpOffDiagJacobian(jvar); } // Moose::perf_log.pop("computeJacobianBlock()","IntegratedBC"); }
void IntegratedBC::computeJacobianBlock(unsigned int jvar) { mooseDeprecated("The computeJacobianBlock method signature has changed. Developers, please " "pass in a MooseVariableFEBase reference instead of the variable number"); prepareMatrixTag(_assembly, _var.number(), jvar); for (_qp = 0; _qp < _qrule->n_points(); _qp++) for (_i = 0; _i < _test.size(); _i++) for (_j = 0; _j < _phi.size(); _j++) { if (_var.number() == jvar) _local_ke(_i, _j) += _JxW[_qp] * _coord[_qp] * computeQpJacobian(); else _local_ke(_i, _j) += _JxW[_qp] * _coord[_qp] * computeQpOffDiagJacobian(jvar); } accumulateTaggedLocalMatrix(); }
void DiracKernel::computeOffDiagJacobian(unsigned int jvar) { if (jvar == _var.number()) { computeJacobian(); } else { DenseMatrix<Number> & ke = _assembly.jacobianBlock(_var.number(), jvar); for (_qp = 0; _qp < _qrule->n_points(); _qp++) { _current_point = _physical_point[_qp]; if (isActiveAtPoint(_current_elem, _current_point)) for (_i=0; _i<_test.size(); _i++) for (_j=0; _j<_phi.size(); _j++) ke(_i, _j) += computeQpOffDiagJacobian(jvar); } } }
void NodalBC::computeOffDiagJacobian(unsigned int jvar) { if (jvar == _var.number()) computeJacobian(); else { _qp = 0; Real cached_val = 0.0; cached_val = computeQpOffDiagJacobian(jvar); dof_id_type cached_row = _var.nodalDofIndex(); // Note: this only works for Lagrange variables... dof_id_type cached_col = _current_node->dof_number(_sys.number(), jvar, 0); // Cache the user's computeQpJacobian() value for later use. for (auto tag : _matrix_tags) if (_sys.hasMatrix(tag)) _fe_problem.assembly(0).cacheJacobianContribution(cached_row, cached_col, cached_val, tag); } }
Real PorousFlowHeatConduction::computeQpJacobian() { return computeQpOffDiagJacobian(_var.number()); }
Real PlasticHeatEnergy::computeQpJacobian() { return computeQpOffDiagJacobian(_var.number()); }