---
title: KmlMgSolverSetPreconditioner
description: "设置预条件子。"
url: https://www.hikunpeng.com/document/detail/zh/kunpenghpcs/hpckit/devg/kunpengaccel_kml_0971.html
sourcePath: /source/zh/kunpenghpcs/hpckit/devg/kunpengaccel_kml_0971.html
indexId: b472bfff6186dd4cad77305ec46908af97c0ab4ea73b74e9cbebff505fbaaf1561
---
# KmlMgSolverSetPreconditioner

设置预条件子。

#### 接口定义

C Interface：

KmlMgStatus KmlMgSolverSetPreconditioner(KmlMgSolverH solver, const KmlMgPreconditionerOptions* options);


#### 参数

| 参数名 | 类型 | 描述 | 输入/输出 |
| --- | --- | --- | --- |
| solver | KmlMgSolverH | 由KmlMgSolverCreate创建的求解器句柄 | 输入/输出 |
| options | const KmlMgPreconditionerOptions\* | 预条件子配置信息，即多重网格配置信息 | 输入 |


#### 返回值

| 返回值 | 类型 | 描述 |
| --- | --- | --- |
| KML\_MG\_OK | int | 正常执行 |
| KML\_MG\_ERR\_INVALID\_PARAM | int | 参数无效 |
| KML\_MG\_ERR\_UNSUPPORTED | int | 暂不支持的功能 |
| KML\_MG\_ERR\_NO\_MEMORY | int | 分配内存失败 |
| KML\_MG\_ERR\_EXCEEDS\_LIMIT | int | 超过设置限制 |
| KML\_MG\_ERR\_INCOMPATIBLE | int | 版本不兼容 |
| KML\_MG\_ERR\_NO\_REQUIRED\_FIELD | int | 未设置必填字段 |
| KML\_MG\_ERR\_UNKNOWN\_TYPE | int | 未知的类型 |
| KML\_MG\_ERR\_THIRD\_PART | int | 内部调用第三方错误 |
| KML\_MG\_ERR\_INCONSISTENT | int | 传递信息不一致 |
| KML\_MG\_ERR\_UNEXPECTED\_CALL\_ORDER | int | 预期之外的调用顺序 |
| KML\_MG\_ERR\_MATRIX\_VALUE\_IS\_NULL | int | 矩阵值为空 |
| KML\_MG\_ERR\_NO\_RESOURCE | int | 资源未就绪 |


#### 结构体说明

KmlMgPreconditionerOptions

| 字段名 | 字段类型 | 字段说明 |
| --- | --- | --- |
| fieldMask | uint64\_t | 配置生效的字段掩码。非0的位代表配置对应字段指定的值，0的位代表使用默认值，可配置的掩码位请参见具体字段的说明。 |
| indexType | KmlMgIndexType | 坐标类型，有如下值。 KML\_MG\_INDEX\_INT32（目前只支持32位int） KML\_MG\_INDEX\_INT64 掩码位：KML\_MG\_PRECONDITIONER\_OPTIONS\_INDEX\_TYPE |
| kspValueType | KmlMgValueType | 输入矩阵的数值类型，有如下值。（目前实现要求与KmlMgSolverOptions中的kspValueType字段保持一致，支持的精度组合请看下方精度组合表） KML\_MG\_VALUE\_FP16 KML\_MG\_VALUE\_FP32 KML\_MG\_VALUE\_FP64 掩码位：KML\_MG\_PRECONDITIONER\_OPTIONS\_KSP\_VALUE\_TYPE |
| valueType | KmlMgValueType | 预条件子（多重网格）的数值类型，有如下值。（目前实现要求与KmlMgSolverOptions中的pcValueType字段保持一致） KML\_MG\_VALUE\_FP16 KML\_MG\_VALUE\_FP32 KML\_MG\_VALUE\_FP64 掩码位：KML\_MG\_PRECONDITIONER\_OPTIONS\_VALUE\_TYPE |
| calcType | KmlMgValueType | 预条件子（多重网格）的计算数值类型，有如下值。（目前实现要求与KmlMgSolverOptions中的pcCalcType字段保持一致） KML\_MG\_VALUE\_FP16 KML\_MG\_VALUE\_FP32 KML\_MG\_VALUE\_FP64 掩码位：KML\_MG\_PRECONDITIONER\_OPTIONS\_CALC\_TYPE |
| numLevels | int64\_t | 多重网格层数 掩码位：KML\_MG\_PRECONDITIONER\_OPTIONS\_NUM\_LEVEL |
| shiftLevelId | int64\_t | 混合精度向单一精度转换的层数 掩码位：KML\_MG\_PRECONDITIONER\_OPTIONS\_SHIFT\_LEVEL |
| cycle | KmlMgCycleType | 有如下值 KML\_MG\_CYCLE\_V KML\_MG\_CYCLE\_W（暂不支持） 掩码位：KML\_MG\_PRECONDITIONER\_OPTIONS\_CYCLE\_TYPE |
| gridSweep | void\* | 多重网格的sweep数组，类型为坐标类型indexType，长度为2 掩码位：KML\_MG\_PRECONDITIONER\_OPTIONS\_SWEEP |
| xpss | void\* | XPSS数组为X\-Process Shrink Strides，表示X方向进程减少的步长，类型由坐标类型indexType指定，长度为网格层数numLevels 掩码位：KML\_MG\_PRECONDITIONER\_OPTIONS\_XPSS |
| smoother | KmlMgSmootherType\* | 每层网格的光滑子类型数组，长度为网格层数numLevels，有如下值 KML\_MG\_SMOOTHER\_POINT\_JACOBI KML\_MG\_SMOOTHER\_POINT\_GS KML\_MG\_SMOOTHER\_LINE\_JACOBI KML\_MG\_SMOOTHER\_LINE\_GS KML\_MG\_SMOOTHER\_PLANE\_ILU KML\_MG\_SMOOTHER\_SHUFFLE\_PLANE\_ILU KML\_MG\_SMOOTHER\_BLOCK\_ILU KML\_MG\_SMOOTHER\_ADI KML\_MG\_SMOOTHER\_BLOCK\_LU（暂不支持） KML\_MG\_SMOOTHER\_LU（暂不支持） KML\_MG\_SMOOTHER\_CUSTOM（暂不支持） 掩码位：KML\_MG\_PRECONDITIONER\_OPTIONS\_SMOOTHER |
| weight | void\* | 光滑子权值，类型由计算数值类型calcType指定，长度为网格层数numLevels 掩码位：KML\_MG\_PRECONDITIONER\_OPTIONS\_WEIGHT |
| coarsen | KmlMgCoarsenType\* | 粗化网格方法，长度为网格层数numLevels，有如下值 KML\_MG\_COARSEN\_FULL\_XYZ KML\_MG\_COARSEN\_SEMI\_XY KML\_MG\_COARSEN\_SEMI\_XZ（暂不支持） KML\_MG\_COARSEN\_SEMI\_YZ（暂不支持） KML\_MG\_COARSEN\_SEMI\_Z（暂不支持） KML\_MG\_COARSEN\_FULL\_XZ（暂不支持） 掩码位：KML\_MG\_PRECONDITIONER\_OPTIONS\_COARSEN |
| rest | KmlMgRestInteType\* | 限制算子，长度为网格层数numLevels，有如下值 KML\_MG\_REST\_INTE\_VTX\_1D1（暂不支持） KML\_MG\_REST\_INTE\_VTX\_1D3（暂不支持） KML\_MG\_REST\_INTE\_VTX\_2D1（暂不支持） KML\_MG\_REST\_INTE\_VTX\_2D5（暂不支持） KML\_MG\_REST\_INTE\_VTX\_2D9（暂不支持） KML\_MG\_REST\_INTE\_CELL\_2D4 KML\_MG\_REST\_INTE\_CELL\_2D16 KML\_MG\_REST\_INTE\_CELL\_3D8 KML\_MG\_REST\_INTE\_CELL\_3D64 掩码位：KML\_MG\_PRECONDITIONER\_OPTIONS\_RESTRICT |
| interp | KmlMgRestInteType\* | 插值算子，长度为网格层数numLevels，有如下值 KML\_MG\_REST\_INTE\_VTX\_1D1（暂不支持） KML\_MG\_REST\_INTE\_VTX\_1D3（暂不支持） KML\_MG\_REST\_INTE\_VTX\_2D1（暂不支持） KML\_MG\_REST\_INTE\_VTX\_2D5（暂不支持） KML\_MG\_REST\_INTE\_VTX\_2D9（暂不支持） KML\_MG\_REST\_INTE\_CELL\_2D4 KML\_MG\_REST\_INTE\_CELL\_2D16 KML\_MG\_REST\_INTE\_CELL\_3D8 KML\_MG\_REST\_INTE\_CELL\_3D64 掩码位：KML\_MG\_PRECONDITIONER\_OPTIONS\_PROLONG |
| alpha | void\* | Galerkin算子调整系数，类型由计算数值类型calcType指定，长度为网格层数numLevels 掩码位：KML\_MG\_PRECONDITIONER\_OPTIONS\_ALPHA |
| control | bool\* | 控制粗化后的网格的stencil是否与上一层保持一致，若为true保持一致，若为false则可能膨胀，长度为网格层数numLevels。 掩码位：KML\_MG\_PRECONDITIONER\_OPTIONS\_CONTROL |


使用暂不支持的参数会导致程序异常退出。


#### 依赖

#include "mg.h"

示例代码请参见示例。
