如何将 PETSc Vec 数组传递给函数

How to pass array of PETSc Vec to a function

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

    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 中初始化吗?

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

VecNorm 中的问题
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;
}