疎な複雑な行列をコードからPETScに効率的に取得する方法
FortranコードからPETScに複雑なスパース行列を取得する最も効率的な方法は何ですか?これは問題に依存することを理解しているので、以下に関連する詳細をできるだけ多く記載するようにしました。 私は一緒に遊んでてきたFEAST固有値ソルバー[1]タイプの問題のためのの次元は行列AとBがあるN、およびほとんどすべての時間が解決費やされているN × N複素線形をM0右側のシステム。Nは大きく(3DでのFE基底関数の数)、M0は小さい(私の場合はM0〜20に興味がある)。行列AとBは実対称でスパースであり、解を必要とする複雑な問題はz A − Bであり、ここでzA X = λ B Xあバツ=λBバツA x = \lambda B xああABBBNNNN× NN×NN \times NああABBBzA − Bzあ−BzA-Bzzzは複素数です。FEASTの作成者は、この正確な固有値と固有ベクトルを取得するために、この線形システムの解の精度をそれほど高くする必要がないことを示唆しているようです。そのため、いくつかの高速反復ソルバーは、これに対する優れたソリューションとなる可能性があります。 これまでのところ、複雑なシステムにLapackを使用してきましたが、これは私のコンピューターでにうまく機能します。Nが大きい場合、最適なソルバーがまだわからないので、PETScを使用して、そこで反復ソルバーを試してみたかったのです。N< 1500N<1500N < 1500NNN 私は単純なCドライバーを作成し、それをFortranから呼び出しました。すべてのコードについては[2]を参照してください。問題はこの部分にあります(更新:マトリックスを作成するためにすべての行をここに配置しました。これが関連していること): ierr = MatCreate(PETSC_COMM_WORLD,&A);CHKERRQ(ierr); ierr = MatSetSizes(A,PETSC_DECIDE,PETSC_DECIDE,n,n);CHKERRQ(ierr); ierr = MatSetFromOptions(A);CHKERRQ(ierr); ierr = MatSetOption(A,MAT_IGNORE_ZERO_ENTRIES,PETSC_TRUE);CHKERRQ(ierr); ierr = MatSetUp(A);CHKERRQ(ierr); for (i=0; i<n; i++) col[i] = i; ierr …