void StressDivergenceTruss::computeJacobian() { DenseMatrix<Number> & ke = _assembly.jacobianBlock(_var.number(), _var.number()); _local_ke.resize(ke.m(), ke.n()); _local_ke.zero(); ColumnMajorMatrix stiff_global(3,3); computeStiffness( stiff_global ); for (_i = 0; _i < _test.size(); _i++) { for (_j = 0; _j < _phi.size(); _j++) { int sign( _i == _j ? 1 : -1 ); _local_ke(_i, _j) += sign * stiff_global(_component, _component); } } 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()); } }
void StressDivergenceTruss::computeOffDiagJacobian(unsigned int jvar) { if (jvar == _var.number()) { computeJacobian(); } else { unsigned int coupled_component = 0; bool active(false); if ( _xdisp_coupled && jvar == _xdisp_var ) { coupled_component = 0; active = true; } else if ( _ydisp_coupled && jvar == _ydisp_var ) { coupled_component = 1; active = true; } else if ( _zdisp_coupled && jvar == _zdisp_var ) { coupled_component = 2; active = true; } DenseMatrix<Number> & ke = _assembly.jacobianBlock(_var.number(), jvar); if (active) { ColumnMajorMatrix stiff_global(3,3); computeStiffness( stiff_global ); for (_i=0; _i<_test.size(); _i++) { for (_j=0; _j<_phi.size(); _j++) { int sign( _i == _j ? 1 : -1 ); ke(_i,_j) += sign * stiff_global(_component, coupled_component); } } } else if ( false ) // Need some code here for coupling with temperature { } } }
void NeoHookeanMaterialNonLinear<Mesh>::apply ( const vector_Type& sol, vector_Type& res, const mapMarkerVolumesPtr_Type mapsMarkerVolumes ) { computeStiffness (sol, 0., this->M_dataMaterial, mapsMarkerVolumes, this->M_displayer); res += *M_stiff; }