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

#### C语言迁移步骤

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

1. 初始化。
  迁移前： 1 2 3 4 KSP ksp; PetscErrorCode ierr; ierr = KSPCreate(PETSC_COMM_WORLD,&ksp); ierr = KSPSetOperators(ksp,A,A);

  迁移后： 1 2 3 4 5 6 7 8 9 10 int n = 8; int nstripes = 1； int stripeWidth[1]; int stripeRow[1]; int ia[9]; int ja[17]; double a[17]; KmlScasolverTask* handle; int err; err = KmlScaissCgInitStripesDI(&handle, n, nstripes , stripeWidth, stripeRow, a, ja, ia, MPI_COMM_WORLD);

2. 设定求解参数
  迁移前： 1 ierr = KSPSetTolerances(ksp,1e-4,PETSC_DEFAULT,PETSC_DEFAULT,2000);

  迁移后： 1 2 3 4 double eps = 1e-4; err = KmlScaissCgSetDID(&handle, KMLSS_THRESHOLD, &eps, 1); assert(err == 0); int max_iters = 2000; err = KmlScaissCgSetDII(&handle, KMLSS_MAX_ITERATION_COUNT, &max_iters, 1);

3. 求解。
  迁移前： 1 2 3 4 5 6 7 8 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);

  迁移后： 1 2 3 4 5 6 int nb=1; double* x[8]; double* b[8]; int ldx=4; int ldb=4; err = KmlScaissCgSolveDI(&handle, nb, x, ldx, b, ldb);

4. 获取迭代参数。
  迁移前： 1 2 3 4 PetscInt its; PetscScalar norm; ierr = KSPGetIterationNumber(ksp,&its);CHKERRQ(ierr); ierr = KSPGetResidualNorm(ksp,&norm);CHKERRQ(ierr);

  迁移后： 1 2 3 4 int idata[] = {max_iters}; err = KmlScaissCgGetDII(&handle, KMLSS_ITERATION_COUNT, data, 1); double ddata[] = {eps}; err = KmlScaissCgGetDID(&handle, KMLSS_TOLERANCE, ddata, 1);

5. 清除。
  迁移前： 1 ierr = KSPDestroy(&ksp);

  迁移后： 1 err = KmlScaissCgCleanDI(&handle);

6. 头文件。
  迁移前：

  #include "petscksp.h"

  迁移后：

  #include "kml_scaiss.h"

7. 编译链接。
  替换PETSc相关的链接选项，具体选项请参见《鲲鹏数学库 开发指南(https://www.hikunpeng.com/document/detail/zh/kunpengaccel/math-lib/devg-kml/kunpengaccel_kml_16_0011.html)》中“安装KML”章节的安装后验证内容。《Kunpeng HPCKit 24.0.0 安装指南》(https://www.hikunpeng.com/document/detail/zh/kunpenghpcs/hpckit/instg/KunpengHPCKit_install_004.html)安装KML。
