如何将 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;
}
我正在尝试将 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;
}