Works like a charm. Thank you again. Roman
2015-10-06 17:49 GMT+03:00 David Knezevic <david.kneze...@akselos.com>: > On Tue, Oct 6, 2015 at 10:46 AM, Вася Бубликов <gream...@gmail.com> wrote: > >> David >> >> >> It pains me to trouble you again but >> dynamic_cast<PetscMatrix<Number>*>(system.matrix); >> returns NULL! >> > > > Make sure you do the cast after equation_systems.init(); > > David > > > > > >> 2015-10-06 17:11 GMT+03:00 David Knezevic <david.kneze...@akselos.com>: >> >>> 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