From: Ataollah M. <am...@ti...> - 2014-07-20 00:10:46
|
Thank Dmitry, I've seen the implementation in the NonlinearImplicitSystem. I've also made my own copy of your implementation in PETScNonlinearSolver::build_mat_null_space inside my own code to do the same thing for LinearImplicitSystems. I suspect there is something wrong with the BlockSize since even when I compile libMesh with enable-blocked-storage the block size for elasticity in 2D (even though I have 2 variables added) is 1 instead of 2!? The way I understood it was that if I compile with blocked storage the number of blocks would be equal to number of variables! Best, Ata On Sat, Jul 19, 2014 at 5:31 PM, Dmitry Karpeyev <ka...@mc...> wrote: > Ata, > > Note that you can attach a NearNullSpace calculation routine or an > equivalent callable object to your NonlinearSolver > (currently supported only for PetscNonlinearSolver, I believe). The > solver will detect the NearNullSpace calculator, > evaluate it and attach the resulting NearNullSpace to the Jacobian. > > For the calling sequence see > class > NonlinearImplicitSystem::ComputeVectorSubspace::operator()(std::vector<NumericVector<Number>*>&sp, > sys_type& s) > Set NonlinearSolver::nearnullspace to a pointer to a function with the > same calling sequence as the operator() above. > > The (pointers to the) vectors you want to put into sp above have the same > structure as the solution vector to your NonlinearImplicitSystem. > In the case of elasticity, for example, you can interpret the vector > components as nodal displacements if using a Lagrangian basis. > The easiest way to obtain these vectors is via > System::add_vector(name,projections=false,parallel_type=GHOSTED). > > Hope this helps, > Dmitry. > > > On Sat, Jul 19, 2014 at 8:45 PM, Ataollah Mesgarnejad < > am...@ti...> wrote: > >> Dear all, >> >> I was wondering if there is a way to create the coordinates vector for >> MatNullSpaceCreateRigidBody? I tried traversing all the nodes in the mesh >> by doing something like: >> >> coords->init (no_nodes*dim, no_local_nodes*dim, false, PARALLEL); >> >> coords->zero(); >> >> MeshBase::const_node_iterator n = mesh.nodes_begin(); >> >> const MeshBase::const_node_iterator end_n = mesh.nodes_end(); >> >> for (;n!=end_n;++n) >> >> { >> >> const Node* node = *n; >> >> const dof_id_type global_dof_u = node-dof_number(elasticity_system_no, >> 0,0); >> >> const dof_id_type global_dof_v = node-dof_number(elasticity_system_no, >> 1,0); >> >> const dof_id_type global_dof_w = node-dof_number(elasticity_system_no, >> 2,0); >> >> >> const Number x = (*node)(0); >> >> const Number y = (*node)(1); >> >> coords->set(global_dof_u,x); >> >> coords->set(global_dof_v,y); >> >> const Number z = (*node)(2); >> >> coords->set(global_dof_w,z); >> >> } >> >> >> >> with a first order elasticity system (I'm pretty sure the numbering for >> the >> variables in elasticity corresponds to those of the PETSc coordinate >> vector >> this way). >> >> But the Nullspace created by MatNullSpaceCreateRigidBody does not seem to >> be working (KSP diverges when I set it through KSPSetNullSpace)!!?? >> >> As always thank you for the help, >> Ata >> >> ------------------------------------------------------------------------------ >> Want fast and easy access to all the code in your enterprise? Index and >> search up to 200,000 lines of code with a free copy of Black Duck >> Code Sight - the same software that powers the world's largest code >> search on Ohloh, the Black Duck Open Hub! Try it now. >> http://p.sf.net/sfu/bds >> _______________________________________________ >> Libmesh-users mailing list >> Lib...@li... >> https://lists.sourceforge.net/lists/listinfo/libmesh-users >> > > -- A. Mesgarnejad PhD Student, Research Assistant Mechanical Engineering Department Louisiana State University 2203 Patrick F. Taylor Hall Baton Rouge, La 70803 www.mesgarnejad.com |