---
title: 迁移步骤
description: "PETSc提供C接口，KML_SOLVER同样也提供了C接口，但接口名及接收参数不一致，需要进行对应功能的切换，举例如下："
url: https://www.hikunpeng.com/document/detail/zh/kunpengboostkithistory/2200/accel/kunpengaccel_12_0051.html
sourcePath: /source/zh/kunpengboostkithistory/2200/accel/kunpengaccel_12_0051.html
indexId: 33ee9936153e3867d74e86635e8357bb90089198ecff83d0371103230e71691c70
---
# 迁移步骤

#### C语言迁移步骤

PETSc提供C接口，KML_SOLVER同样也提供了C接口，但接口名及接收参数不一致，需要进行对应功能的切换，举例如下：

1. 初始化。迁移前
  ：

```
KSP            ksp;
PetscErrorCode ierr;
ierr = KSPCreate(PETSC_COMM_WORLD,&ksp);
ierr = KSPSetOperators(ksp,A,A);
```


迁移后
  ：

```
int n = 8;
int ia[9];
int ja[17];
double a[17];
void* handle;
int error = KmlIssCgInitDI(&handle, &n, a, ja, ia);
```


2. 求解。迁移前
  ：

```
Vec            u,x,b;
ierr = VecCreate(PETSC_COMM_WORLD,&u);
ierr = VecSetSizes(u,PETSC_DECIDE,rdim);
ierr = VecSetFromOptions(u);CHKERRQ(ierr);
ierr = VecDuplicate(u,&b);CHKERRQ(ierr);
ierr = VecDuplicate(b,&x);CHKERRQ(ierr);
ierr = KSPSolve(ksp,b,x);CHKERRQ(ierr);
```


迁移后
  ：

```
double b[8];
/* Solution vector */
double x[8];
int nrhs = 1; /* Number of right-hand sides */
int ldx=n, ldb=n; /*!Leading dimension of B and X */
int error = KmlIssCgSolveDI(&handle, &nrhs, x, &ldx, b, &ldb);
```


3. 获取迭代参数。迁移前
  ：

```
PetscInt       its;
ierr = KSPGetIterationNumber(ksp,&its);CHKERRQ(ierr);
```


迁移后
  ：

```
int *data;  // user data.
int nd = 1;
int error = KmlIssCgGetDII(&handle, ITERATION_COUNT, data, nd);
```


4. 清除。迁移前
  ：

```
ierr = KSPDestroy(&ksp);
```


迁移后
  ：

```
int error = KmlIssCgCleanDI(&handle);
```


5. 头文件。
  迁移前：

```
#include "petscksp.h"
```


  迁移后：

```
#include "kml_iss.h"
```


6. 编译链接。
  替换PETSc相关的链接选项，具体选项请参见《鲲鹏数学库 开发指南(https://www.hikunpeng.com/document/detail/zh/kunpengboostkithistory/2200/accel/kunpengaccel_kml_16_0011.html)》中安装KML后验证章节。
