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