PETSc で LU 分解アプリをプログラムしようとしています。私の考えは、プログラムが因数分解されていない行列を出力し、次に因数分解された行列を出力し、因数分解自体にかかった時間をカウントするというものでした。
インターネットで見つけたほとんどの情報に従ってコードを作成しました (この投稿の情報を使用してマトリックスを初期化しました) が、残念ながらそれだけでは十分ではありません。コードはコンパイルされますが、実行しようとすると、次のエラーが表示されます。
[0]PETSC ERROR: --------------------- Error Message --------------------------------------------------------------
[0]PETSC ERROR: No support for this operation for this object type
[0]PETSC ERROR: Mat type mpiaij
[0]PETSC ERROR: See http://www.mcs.anl.gov/petsc/documentation/faq.html for trouble shooting.
[0]PETSC ERROR: Petsc Release Version 3.5.2, Sep, 08, 2014
[0]PETSC ERROR: ./petscLUFact on a arch-linux2-c-debug named martin-Aspire-E1-531 by martin Wed Oct 22 22:48:42 2014
[0]PETSC ERROR: Configure options
[0]PETSC ERROR: #1 MatLUFactor() line 2715 in /home/martin/petsc-3.5.2/src/mat/interface/matrix.c
[0]PETSC ERROR: #2 main() line 49 in petscLUFact.c
[0]PETSC ERROR: ----------------End of Error Message -------send entire error message to petsc-maint@mcs.anl.gov----------
application called MPI_Abort(MPI_COMM_WORLD, 56) - process 0
===================================================================================
= BAD TERMINATION OF ONE OF YOUR APPLICATION PROCESSES
= EXIT CODE: 56
= CLEANING UP REMAINING PROCESSES
= YOU CAN IGNORE THE BELOW CLEANUP MESSAGES
===================================================================================
このエラーは、インプレース LU 因数分解に使用したいMatLUFactor関数が原因です。問題は、私にはわかりませんが、コードの何が問題なのかということです。おそらく割り当てが悪いために、中心的な問題は行列変数自体にあると思いますが(私は MatMPIAIJSetPreallocation 関数について考えています)、よくわかりません。
MatLUFactor 関数をMatLUFactorNumericおよびMatLUFactorSymbolicに置き換えようとしましたが、MatLUFactor よりもさらにうまく機能しません。エラーははるかに「大きい」:-)
最後に、次のコマンドでプログラムを起動してみます。
mpiexec -n 4 ./petscLUFact
ですから、何か解決策をご存知でしたら、よろしくお願いします;-) ありがとうございます!
追伸: 私はかなり長い間可能な解決策を探していました.これまでに見つけた最も近い記事はこのメールリストでしたが、質問者は私が知る限り、私が使用していない ParMETIS および SuperLU パッケージを使用しています.
これは私のソースコードです:
static char help[] = "Reads a PETSc matrix and vector from a file and reorders it.\n\
f0 <input_file> : first file to load (small system)\n\
-f1 <input_file> : second file to load (larger system)\n\n";
#include <petscsys.h>
#include <petscmat.h>
int main( int argc, char **args ) {
Mat A; // 'main' matrix
PetscInt r = 2, c = 2; // matrix dimensions (row x col)
PetscInt i,j; // coordinates
PetscInt Istart, Iend;
PetscInt Ii; // counter
PetscScalar v; // 2-dimensional array ??? (I'm not sure)
PetscErrorCode ierr;
PetscInitialize( &argc, &args, (char*)0, help );
// Create matrix
ierr = MatCreate( PETSC_COMM_WORLD, &A );CHKERRQ( ierr );
ierr = MatSetSizes( A, PETSC_DECIDE, PETSC_DECIDE, r*c, r*c );CHKERRQ( ierr );
ierr = MatSetFromOptions(A);CHKERRQ( ierr );
ierr = MatMPIAIJSetPreallocation( A, 2, PETSC_NULL, 2, PETSC_NULL );CHKERRQ( ierr );
ierr = MatGetOwnershipRange(A,&Istart,&Iend);CHKERRQ( ierr );
// INIT matrix
ierr = MatSetValue( A, 0, 0, 1, INSERT_VALUES ); CHKERRQ( ierr );
ierr = MatSetValue( A, 0, 1, 2, INSERT_VALUES ); CHKERRQ( ierr );
ierr = MatSetValue( A, 1, 0, 3, INSERT_VALUES ); CHKERRQ( ierr );
ierr = MatSetValue( A, 1, 1, 1, INSERT_VALUES ); CHKERRQ( ierr );
ierr = MatAssemblyBegin( A, MAT_FINAL_ASSEMBLY ); CHKERRQ( ierr );
ierr = MatAssemblyEnd( A, MAT_FINAL_ASSEMBLY ); CHKERRQ( ierr );
// Print the matrix
ierr = MatView( A, PETSC_VIEWER_STDOUT_WORLD ); CHKERRQ( ierr );
// -----------------
// LU-decomposition
// -----------------
MatFactorInfo mfi;
// MatFactorInfo mfi INIT
ierr = MatFactorInfoInitialize( &mfi ); CHKERRQ( ierr );
mfi.fill = 2;
mfi.dtcol = 0;
IS rowPerm; // variable for row permutations
IS colPerm; // variable for column permutations
// Possible replace for MatLUFactor
/*
Mat Fact;
ierr = MatLUFactorSymbolic( Fact, A, rowPerm, colPerm, &mfi );
ierr = MatLUFactorNumeric( Fact, A, &mfi );
*/
// I've read somewhere, that zeros are enough for last three
// parameters, but it doesn't work too
//ierr = MatLUFactor( A, 0, 0, 0 ); CHKERRQ( ierr );
ierr = MatLUFactor( A, rowPerm, colPerm, &mfi );
ierr = MatView( A, PETSC_VIEWER_STDOUT_WORLD ); CHKERRQ( ierr );
MatDestroy(&A);
PetscFinalize();
return 0;
}
これは、MatLUFactorNumeric および MatLUFactorSymbolic 関数を使用した場合のエラーです。
[0]PETSC ERROR: --------------------- Error Message --------------------------------------------------------------
[0]PETSC ERROR: No support for this operation for this object type
[0]PETSC ERROR: Matrix format mpiaij does not have a built-in PETSc LU
[0]PETSC ERROR: See http://www.mcs.anl.gov/petsc/documentation/faq.html for trouble shooting.
[0]PETSC ERROR: Petsc Release Version 3.5.2, Sep, 08, 2014
[0]PETSC ERROR: ./petscLUFact on a arch-linux2-c-debug named martin-Aspire-E1-531 by martin Wed Oct 22 23:40:55 2014
[0]PETSC ERROR: Configure options
[0]PETSC ERROR: #1 MatGetFactor() line 3961 in /home/martin/petsc-3.5.2/src/mat/interface/matrix.c
[0]PETSC ERROR: ------------------------------------------------------------------------
[0]PETSC ERROR: Caught signal number 11 SEGV: Segmentation Violation, probably memory access out of range
[0]PETSC ERROR: Try option -start_in_debugger or -on_error_attach_debugger
[0]PETSC ERROR: or see http://www.mcs.anl.gov/petsc/documentation/faq.html#valgrind[0]PETSC ERROR: or try http://valgrind.org on GNU/linux and Apple Mac OS X to find memory corruption errors
[0]PETSC ERROR: likely location of problem given in stack below
[0]PETSC ERROR: --------------------- Stack Frames ------------------------------------
[0]PETSC ERROR: Note: The EXACT line numbers in the stack are not available,
[0]PETSC ERROR: INSTEAD the line number of the start of the function
[0]PETSC ERROR: is given.
[0]PETSC ERROR: [0] MatLUFactorSymbolic line 2825 /home/martin/petsc-3.5.2/src/mat/interface/matrix.c
[0]PETSC ERROR: [0] MatGetFactor line 3944 /home/martin/petsc-3.5.2/src/mat/interface/matrix.c
[0]PETSC ERROR: --------------------- Error Message --------------------------------------------------------------
[0]PETSC ERROR: Signal received
[0]PETSC ERROR: See http://www.mcs.anl.gov/petsc/documentation/faq.html for trouble shooting.
[0]PETSC ERROR: Petsc Release Version 3.5.2, Sep, 08, 2014
[0]PETSC ERROR: ./petscLUFact on a arch-linux2-c-debug named martin-Aspire-E1-531 by martin Wed Oct 22 23:40:55 2014
[0]PETSC ERROR: Configure options
[0]PETSC ERROR: #2 User provided function() line 0 in unknown file
application called MPI_Abort(MPI_COMM_WORLD, 59) - process 0
===================================================================================
= BAD TERMINATION OF ONE OF YOUR APPLICATION PROCESSES
= EXIT CODE: 59
= CLEANING UP REMAINING PROCESSES
= YOU CAN IGNORE THE BELOW CLEANUP MESSAGES
===================================================================================