【问题标题】:How to pass array of PETSc Vec to a function如何将 PETSc Vec 数组传递给函数
【发布时间】:2020-07-22 05:33:53
【问题描述】:

我正在尝试将 PETSc 中 Vec 的 array 传递给一个函数,在内部对其进行修改并检索结果。伪代码如下:

    PetscErrorCode foo(Vec *y, int n) {

    // ...

       ierr = VecDuplicateVecs(x, n, &y);  CHKERRQ(ierr);
    // ...

       ierr = VecNorm(y[0],NORM_2,&norm); CHKERRQ(ierr);   // this prints out fine
       printf("norm = %f\n", norm);

    }

    int main(int argc,char **argv)
    {
        PetscErrorCode ierr;
        PetscScalar norm;
        Vec *y;

        foo(y, 3);

        ierr = VecNorm(y[0],NORM_2,&norm); CHKERRQ(ierr);     // this breaks: segfault

        ierr = VecDestroyVecs(3, &y); CHKERRQ(ierr);

        return 0;
    }

我确实从编译器收到一条消息,指出 variable "y" is used before its value is set,但我看不到如何通过引用传递这些家伙。 VecDuplicateVecs 必须在 main 中初始化?

【问题讨论】:

  • 当您尝试将 Vec *y 传递给另一个函数时,它没有被初始化。您希望该功能收到什么?您可能想传递它的 地址
  • @Chase:您的评论是否暗示我应该将其称为:foo(&y, 3);,然后例程的调用应该是PetscErrorCode foo(Vec **y, int n)?然后在例程中我必须将其修改为ierr = VecDuplicateVecs(x, n, y); CHKERRQ(ierr);。我在我的应用程序中尝试了这个,虽然适用于 Vec 数组的第一个条目,但它给了我其他条目的段错误。

标签: c petsc


【解决方案1】:

有两个问题:1)指针*y的地址没有传递给foo [@Chase]。 2) 双指针调用将解决VecNormfoo() 中的问题

PetscErrorCode foo(Vec **y, int n) {

// ...

   ierr = VecDuplicateVecs(x, n, y);  CHKERRQ(ierr);
// ...

   ierr = VecNorm((*y)[0],NORM_2,&norm); CHKERRQ(ierr); 

   printf("norm = %f\n", norm);

}

int main(int argc,char **argv)
{
    PetscErrorCode ierr;
    PetscScalar norm;
    Vec *y;

    foo(&y, 3);

    ierr = VecNorm(y[0],NORM_2,&norm); CHKERRQ(ierr);     
    ierr = VecDestroyVecs(3, &y); CHKERRQ(ierr);

    return 0;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-04-09
    • 1970-01-01
    • 2017-08-14
    • 2012-07-23
    • 2017-06-03
    • 2019-09-24
    相关资源
    最近更新 更多