Please reply to the list as well. Instead of creating a new matrix, you should cast system.matrix to a PetscMatrix and then call MatSetOption on that.
David On Tue, Oct 6, 2015 at 10:06 AM, Вася Бубликов <gream...@gmail.com> wrote: > David > > Thank you for your answer. Here is a short program to try out your first > suggestion: > > #include <iostream> > #include <vector> > #include <set> > #include <algorithm> > #include <fstream> > #include <string> > #include <ctime> > // libmesh includes > #include "libmesh/libmesh.h" > #include "libmesh/mesh.h" > #include "libmesh/linear_implicit_system.h" > #include "libmesh/equation_systems.h" > #include "libmesh/fe.h" > #include "libmesh/quadrature_trap.h" > #include "libmesh/dof_map.h" > #include "libmesh/sparse_matrix.h" > #include "libmesh/petsc_matrix.h" > #include "libmesh/numeric_vector.h" > #include "libmesh/dense_matrix.h" > #include "libmesh/dense_submatrix.h" > #include "libmesh/dense_vector.h" > #include "libmesh/dense_subvector.h" > #include "libmesh/perf_log.h" > #include "libmesh/elem.h" > #include "libmesh/boundary_info.h" > #include "libmesh/string_to_enum.h" > #include "libmesh/getpot.h" > #include "libmesh/vtk_io.h" > #include "libmesh/mesh_data.h" > #include "libmesh/mesh_base.h" > > using namespace libMesh; > > int main (int argc, char** argv) > { > LibMeshInit init (argc, argv); > SerialMesh mesh(init.comm()); > mesh.read("SquareWithCircle.unv"); > mesh.print_info(); > EquationSystems equation_systems (mesh); > LinearImplicitSystem& system = > equation_systems.add_system<LinearImplicitSystem> ("Elasticity"); > PetscMatrix<Number> Matrix(init.comm()); > std::cout << "Enable non neighbours interactions" << std::endl; > MatSetOption( Matrix.mat(), MAT_NEW_NONZERO_ALLOCATION_ERR, > PETSC_FALSE); > unsigned int u_var = system.add_variable("u", FIRST, LAGRANGE); // > displacement X > unsigned int v_var = system.add_variable("v", FIRST, LAGRANGE); // > displacement Y > equation_systems.init(); > equation_systems.print_info(); > Matrix.attach_dof_map(system.get_dof_map()); > std::cout << "Initialize matrix" << std::endl; > Matrix.init(); > std::cout << "Make my matrix the system matrix" << std::endl; > system.matrix = &Matrix; > return 0; > } > > > it compiles fine but then I run it MatSetOption command causes an error: > > [0]PETSC ERROR: --------------------- Error Message > -------------------------------------------------------------- > [0]PETSC ERROR: Corrupt argument: > http://www.mcs.anl.gov/petsc/documentation/faq.html#valgrind > [0]PETSC ERROR: Invalid Pointer to Object: Parameter # 1 > [0]PETSC ERROR: See http://www.mcs.anl.gov/petsc/documentation/faq.html > for trouble shooting. > [0]PETSC ERROR: Petsc Release Version 3.6.1, Jul, 22, 2015 > [0]PETSC ERROR: ./error.o on a arch-linux-c-opt named izmailovo by gream > Tue Oct 6 17:01:25 2015 > [0]PETSC ERROR: Configure options --prefix=/opt/petsc/linux-c-opt > --PETSC_ARCH=arch-linux-c-opt --with-shared-libraries=1 --COPTFLAGS=-O3 > --CXXOPTFLAGS=-O3 --with-mumps=1 --with-hdf5=1 --with-scalapack=1 > --with-suitesparse=1 --with-metis=1 --with-parmetis=1 --with-ptscotch=1 > --with-ptscotch-lib="[libesmumps.so,libptscotch.so,libptscotcherr.so,libscotch.so,libscotcherr.so,libbz2.so]" > --with-ptscotch-include=/usr/include/scotch --with-superlu=1 > --with-superlu-lib=-lsuperlu --with-superlu-include=/usr/include/superlu > --with-ml=1 > [0]PETSC ERROR: #1 MatSetOption() line 5261 in > /tmp/yaourt-tmp-gream/aur-petsc/src/petsc-3.6.1/src/mat/interface/matrix.c > > Roman > > 2015-10-06 13:20 GMT+03:00 David Knezevic <david.kneze...@akselos.com>: > >> This is a PETSc error that you're hitting because you're adding new >> non-zeros in the matrix. PETSc tries to help you by throwing an error if >> you do this, because allocating new non-zeros (outside the specified >> sparsity pattern) can slow down your program a lot. >> >> The easy fix is indicated in the PETSc error message: >> "Use MatSetOption(A, MAT_NEW_NONZERO_ALLOCATION_ERR, PETSC_FALSE) to turn >> off this check" >> To do this, you need to cast your matrix to a PetscMatrix, then do >> petsc_matrix->mat() to get the PETSc Mat that you can pass to MatSetOption. >> >> The more involved fix is to augment your sparsity pattern (e.g. see >> miscellaneous_ex9). >> >> David >> >> >> >> On Tue, Oct 6, 2015 at 6:13 AM, Вася Бубликов <gream...@gmail.com> wrote: >> >>> Dear Sirs, >>> >>> I'm trying to make Libmesh work with a simple linear elasticity problem >>> using linear systems example 4 as an example. I need to force the top >>> boundary remain flat, i.e. all normal displacements are of the same value >>> to be computed. >>> To obtain this, for example to make the displacements for DOFs >>> i1,i2,i3..in >>> the same as for the DOF j, I add penalty (1e10) to K(in,in) and subtract >>> it >>> from K(in,j) meaning to add 1e10*(U_in - U_j) = 0 to the in'th equation >>> in the assembly function. But as soon as in and j are on different finite >>> elements I get the same error no matter which particular c++ function I >>> use >>> (system.matrix->add(i,j,value) system.matrix->add_matrix(DenseMatrix) >>> or system.matrix->add(SparseMatrix) ). I would be very mush obliged if >>> you >>> helped me. >>> >>> Kind regards, >>> Roman Khudobin >>> Research Assistant ICHPH RAS >>> >>> [0]PETSC ERROR: --------------------- Error Message >>> -------------------------------------------------------------- >>> [0]PETSC ERROR: Argument out of range >>> [0]PETSC ERROR: New nonzero at (17,47) caused a malloc >>> Use MatSetOption(A, MAT_NEW_NONZERO_ALLOCATION_ERR, PETSC_FALSE) to turn >>> off this check >>> [0]PETSC ERROR: See http://www.mcs.anl.gov/petsc/documentation/faq.html >>> for >>> trouble shooting. >>> [0]PETSC ERROR: Petsc Release Version 3.6.1, Jul, 22, 2015 >>> [0]PETSC ERROR: ./constrain.o on a arch-linux-c-opt named izmailovo by >>> gream Tue Oct 6 12:55:21 2015 >>> [0]PETSC ERROR: Configure options --prefix=/opt/petsc/linux-c-opt >>> --PETSC_ARCH=arch-linux-c-opt --with-shared-libraries=1 --COPTFLAGS=-O3 >>> --CXXOPTFLAGS=-O3 --with-mumps=1 --with-hdf5=1 --with-scalapack=1 >>> --with-suitesparse=1 --with-metis=1 --with-parmetis=1 --with-ptscotch=1 >>> >>> --with-ptscotch-lib="[libesmumps.so,libptscotch.so,libptscotcherr.so,libscotch.so,libscotcherr.so,libbz2.so]" >>> --with-ptscotch-include=/usr/include/scotch --with-superlu=1 >>> --with-superlu-lib=-lsuperlu --with-superlu-include=/usr/include/superlu >>> --with-ml=1 >>> [0]PETSC ERROR: #1 MatSetValues_SeqAIJ() line 485 in >>> >>> /tmp/yaourt-tmp-gream/aur-petsc/src/petsc-3.6.1/src/mat/impls/aij/seq/aij.c >>> [0]PETSC ERROR: #2 MatSetValues() line 1173 in >>> >>> /tmp/yaourt-tmp-gream/aur-petsc/src/petsc-3.6.1/src/mat/interface/matrix.c >>> >>> -------------------------------------------------------------------------- >>> MPI_ABORT was invoked on rank 0 in communicator MPI_COMM_WORLD >>> with errorcode 1. >>> >>> NOTE: invoking MPI_ABORT causes Open MPI to kill all MPI processes. >>> You may or may not see output from other processes, depending on >>> exactly when Open MPI kills them. >>> >>> -------------------------------------------------------------------------- >>> >>> >>> ------------------------------------------------------------------------------ >>> >>> _______________________________________________ >>> Libmesh-users mailing list >>> Libmesh-users@lists.sourceforge.net >>> https://lists.sourceforge.net/lists/listinfo/libmesh-users >>> >>> >> > ------------------------------------------------------------------------------ _______________________________________________ Libmesh-users mailing list Libmesh-users@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/libmesh-users