Go to the source code of this file.
Data Structures | |
struct | mlblock_desc |
struct | mesh_ml_optdata |
struct | mesh_ml_cg_data |
Defines | |
#define | _CONST const |
#define | MIN_NVCP 100 |
#define | MAX_NVCP 3500 |
#define | MAX_NVCPS 10000 |
#define | SUBBLOCK_STEP 4 |
#define | SUBBLOCK_STEP_CP 5 |
#define | MYINFINITY 1.0e+308 |
#define | EPS1 1.0e-4 |
#define | EPS2 1.0e-7 |
#define | EPS3 1.0e-8 |
#define | EPS4 1.0e-8 |
#define | DELTA4 1.0e-7 |
#define | BETA 0.125 |
#define | CG_EPS 1.0e-3 |
#define | CG_DELTA 1.0e-20 |
#define | MAXCGN 512 |
#define | MAXNTN 16 |
#define | MAXBTN 20 |
#define | MAXCTN 24 |
#define | MAXGTN 10 |
#define | GRTHR 0.02 |
#define | FLAG_F 0x0001 |
#define | FLAG_G 0x0002 |
#define | FLAG_H 0x0004 |
#define | FLAG_LH 0x0008 |
#define | FLAG_CH 0x0010 |
#define | FLAG_CMH 0x0020 |
#define | FLAG_CMLH 0x0040 |
#define | FLAG_ADVANCE 0x0080 |
#define | GRDIV(a, b) (exp((1.0-TAU)*log(a)+TAU*log(b))) |
Typedefs | |
typedef boolean(* | cg_mult )(int nvars, void *usrdata, const double *x, double *Ax) |
Functions | |
boolean | _g2mbl_MLDivideBlock (int nv, BSMvertex *mv, int *mvhei, int nhe, BSMhalfedge *mhe, int nfac, BSMfacet *mfac, int *mfhei, int nvcp, int *vncpi, int *nvbcp1, int **vnbcp1, int *seed1, int *nvbcp2, int **vnbcp2, int *seed2, int step) |
boolean | _g2mbl_MLAssignMeshd (mesh_ml_optdata *d, int nv, BSMvertex *mv, int *mvhei, point3d *mvcp, int nhe, BSMhalfedge *mhe, int nfac, BSMfacet *mfac, int *mfhei, byte *mkcp) |
boolean | _g2mbl_MLSetupBlocksd (mesh_ml_optdata *d, short nlevels, short bsize, int step) |
boolean | _g2mbl_MLOptAllocBFArraysd (mesh_ml_optdata *d, int nkn1, int nkn2, boolean reparam) |
boolean | _g2mbl_MLFindElementsd (mesh_ml_optdata *d, int bls, boolean dnkn) |
boolean | _g2mbl_MLFindBlockElementsd (mesh_ml_optdata *d) |
boolean | _g2mbl_MLFindVCPNeighboursd (mesh_ml_optdata *d, nzHbl_rowdesc **vn, int **vni) |
boolean | _g2mbl_MLSetupBlockCGHessiand (mesh_ml_optdata *d, int bn) |
boolean | _g2mbl_MLSetupBlockCholHessiand (mesh_ml_optdata *d, int bn) |
boolean | _g2mbl_MLSetupBlockHessiansd (mesh_ml_optdata *d) |
boolean | _g2mbl_MLSetupElemConstd (mesh_ml_optdata *d, double dM, double dO, double C) |
double | g2mbl_MLFuncd (int nkn, double *qcoeff, double **Nitabs, double **Jac, int nv, point3d *mvcp, int ndomel, int *domelind, meshdom_elem *domelem, int *domelcpind, boolean recalc, double *ftab) |
boolean | g2mbl_MLFuncGradd (int nkn, double *qcoeff, double **Nitabs, double **Jac, int nv, point3d *mvcp, int ndomel, int *domelind, meshdom_elem *domelem, int *domelcpind, int nvcp, int *vncpi, boolean recalc, double *ftab, double *gtab, double *func, double *grad) |
boolean | g2mbl_MLFuncGradHessianAd (int nkn, double *qcoeff, double **Nitabs, double **Nijtabs, double **Mijtabs, double **Jac, int nv, point3d *mvcp, int ndomel, int *domelind, meshdom_elem *domelem, int *domelcpind, int nvcp, int *vncpi, boolean recalc, double *ftab, double *gtab, double *htab, double *func, double *grad, int nHbl, nzHbl_rowdesc *iHbl, int *cHbl, int *tHbl, double *Hbl) |
boolean | g2mbl_MLFuncGradHessianBd (int nkn, double *qcoeff, double **Nitabs, double **Nijtabs, double **Mijtabs, double **Jac, int nv, point3d *mvcp, int ndomel, int *domelind, meshdom_elem *domelem, int *domelcpind, int nvcp, int *vncpi, boolean recalc, double *ftab, double *gtab, double *htab, double *func, double *grad, int hsize, int *hprof, double **hrows) |
boolean | g2mbl_MLGetHessianRowsd (int nv, int nvcp1, int *vncpi1, int nHbl, nzHbl_rowdesc *iHbl, int *cHbl, int *tHbl, double *Hbl, int nvcp, int *vncpi, int hsize, int *hprof, double **hrows) |
boolean | _g2mbl_MLmultAxd (int nvars, void *usrdata, _CONST double *x, double *Ax) |
boolean | _g2mbl_MLmultQIxd (int nvars, void *usrdata, _CONST double *x, double *Qix) |
boolean | _g2mbl_MLDecomposeBlockPrecond (mesh_ml_optdata *d, short int bl, double nu, boolean *positive) |
boolean | g2mbl_MLOptBlockAd (void *data, int bl) |
boolean | g2mbl_MLOptBlockBd (void *data, int bl) |
boolean | _g2mbl_CMPAssignMeshd (mesh_ml_optdata *d, int fnv, BSMvertex *fmv, int *fmvhei, point3d *fmvcp, int fnhe, BSMhalfedge *fmhe, int fnfac, BSMfacet *fmfac, int *fmfhei, byte *fmkcp, int cnv, int rmnnz, index2 *rmnzi, double *rmnzc) |
boolean | _g2mbl_CMPFindCoarseMeshBlock (int fnv, int cnv, int rmnnz, index2 *rmnzi, int nvbcp, int *vnbcp, int *nwbcp, int **wnbcp) |
boolean | _g2mbl_CMPFindBlockCGPmatrix (int fnv, int cnv, int rmnnz, index2 *rmnzi, int nvbcp, int *vnbcp, int nwbcp, int *wnbcp, int *smnnz, index3 **smi) |
boolean | _g2mbl_CMPOrderCoarsePoints (int nwcp, int nnz, index2 *nzci, int brmnnz, index3 *brmnzi, int blsize, int *hsize, int *hprof) |
boolean | _g2mbl_CMPSetupBlockCGPrecondd (mesh_ml_optdata *d, int bn) |
boolean | _g2mbl_CMPSetupBlockHessiansd (mesh_ml_optdata *d) |
boolean | _g2mbl_CMPMultRTHR3x3d (int nrowsa, int nnza, index3 *ai, double *ac, int ncolsb, int nnzb, index3 *bi, double *bc, int nnz1, double nu, int hsize, int *hprof, double **hrows) |
boolean | _g2mbl_CMPSetupCoarseHessiand (mesh_ml_optdata *d, int bl, double nu) |
boolean | g2mbl_MLSFuncGradd (int nkn, double *qcoeff, double **Nitabs, double **Jac, int nv, point3d *mvcp, vector3d *mvcpn, int ndomel, int *domelind, meshdom_elem *domelem, int *domelcpind, int nvcp, int *vncpi, boolean recalc, double *ftab, double *gtab, double *func, double *grad) |
boolean | g2mbl_MLSFuncGradHessianAd (int nkn, double *qcoeff, double **Nitabs, double **Nijtabs, double **Mijtabs, double **Jac, int nv, point3d *mvcp, vector3d *mvcpn, int ndomel, int *domelind, meshdom_elem *domelem, int *domelcpind, int nvcp, int *vncpi, boolean recalc, double *ftab, double *gtab, double *htab, double *func, double *grad, int nHbl, nzHbl_rowdesc *iHbl, int *cHbl, int *tHbl, double *Hbl) |
boolean | g2mbl_MLSFuncGradHessianBd (int nkn, double *qcoeff, double **Nitabs, double **Nijtabs, double **Mijtabs, double **Jac, int nv, point3d *mvcp, vector3d *mvcpn, int ndomel, int *domelind, meshdom_elem *domelem, int *domelcpind, int nvcp, int *vncpi, boolean recalc, double *ftab, double *gtab, double *htab, double *func, double *grad, int hsize, int *hprof, double **hrows) |
boolean | g2mbl_MLSGetHessianRowsd (int nv, int nvcp1, int *vncpi1, int nHbl, nzHbl_rowdesc *iHbl, int *cHbl, int *tHbl, double *Hbl, int nvcp, int *vncpi, int hsize, int *hprof, double **hrows) |
boolean | _g2mbl_MLSSetupBlockCGHessiand (mesh_ml_optdata *d, int bn) |
boolean | _g2mbl_MLSSetupBlockCholHessiand (mesh_ml_optdata *d, int bn) |
boolean | _g2mbl_MLSSetupBlockHessiansd (mesh_ml_optdata *d) |
boolean | _g2mbl_MLSFindCPNormalsd (mesh_ml_optdata *d) |
boolean | _g2mbl_CMPSSetupCoarseHessiand (mesh_ml_optdata *d, int bl, double nu) |
void | _g2mbl_MLInvalSmallBlocks (mesh_ml_optdata *d, int bl) |
boolean | _g2mbl_MLSmultAxd (int nvars, void *usrdata, double *x, double *Ax) |
boolean | _g2mbl_MLSmultQIxd (int nvars, void *usrdata, double *x, double *Qix) |
boolean | _g2mbl_MLSDecomposeBlockPrecond (mesh_ml_optdata *d, short int bl, double nu, boolean *positive) |
void | _g2mbl_MLSAddCPIncrement (int nvcp, int *vncpi, point3d *mvcp, vector3d *mvcpn, double *incr, point3d *omvcp) |
boolean | g2mbl_MLSOptBlockAd (void *data, int bl) |
boolean | g2mbl_MLSOptBlockBd (void *data, int bl) |
boolean | _g2mbl_CMPSSetupBlockCGPrecondd (mesh_ml_optdata *d, int bn) |
boolean | _g2mbl_CMPSSetupBlockHessiansd (mesh_ml_optdata *d) |
int | _g2mbl_MLNextBlockNumd (mesh_ml_optdata *d, boolean advance) |
#define _CONST const |
#define BETA 0.125 |
#define CG_DELTA 1.0e-20 |
#define CG_EPS 1.0e-3 |
#define DELTA4 1.0e-7 |
#define EPS1 1.0e-4 |
#define EPS2 1.0e-7 |
#define EPS3 1.0e-8 |
#define EPS4 1.0e-8 |
#define FLAG_ADVANCE 0x0080 |
#define FLAG_CH 0x0010 |
#define FLAG_CMH 0x0020 |
#define FLAG_CMLH 0x0040 |
#define FLAG_F 0x0001 |
#define FLAG_G 0x0002 |
#define FLAG_H 0x0004 |
#define FLAG_LH 0x0008 |
#define GRDIV | ( | a, | ||
b | ||||
) | (exp((1.0-TAU)*log(a)+TAU*log(b))) |
#define GRTHR 0.02 |
#define MAX_NVCP 3500 |
#define MAX_NVCPS 10000 |
#define MAXBTN 20 |
#define MAXCGN 512 |
#define MAXCTN 24 |
#define MAXGTN 10 |
#define MAXNTN 16 |
#define MIN_NVCP 100 |
#define MYINFINITY 1.0e+308 |
#define SUBBLOCK_STEP 4 |
#define SUBBLOCK_STEP_CP 5 |
boolean _g2mbl_CMPAssignMeshd | ( | mesh_ml_optdata * | d, | |
int | fnv, | |||
BSMvertex * | fmv, | |||
int * | fmvhei, | |||
point3d * | fmvcp, | |||
int | fnhe, | |||
BSMhalfedge * | fmhe, | |||
int | fnfac, | |||
BSMfacet * | fmfac, | |||
int * | fmfhei, | |||
byte * | fmkcp, | |||
int | cnv, | |||
int | rmnnz, | |||
index2 * | rmnzi, | |||
double * | rmnzc | |||
) |
boolean _g2mbl_CMPFindBlockCGPmatrix | ( | int | fnv, | |
int | cnv, | |||
int | rmnnz, | |||
index2 * | rmnzi, | |||
int | nvbcp, | |||
int * | vnbcp, | |||
int | nwbcp, | |||
int * | wnbcp, | |||
int * | smnnz, | |||
index3 ** | smi | |||
) |
boolean _g2mbl_CMPFindCoarseMeshBlock | ( | int | fnv, | |
int | cnv, | |||
int | rmnnz, | |||
index2 * | rmnzi, | |||
int | nvbcp, | |||
int * | vnbcp, | |||
int * | nwbcp, | |||
int ** | wnbcp | |||
) |
boolean _g2mbl_CMPMultRTHR3x3d | ( | int | nrowsa, | |
int | nnza, | |||
index3 * | ai, | |||
double * | ac, | |||
int | ncolsb, | |||
int | nnzb, | |||
index3 * | bi, | |||
double * | bc, | |||
int | nnz1, | |||
double | nu, | |||
int | hsize, | |||
int * | hprof, | |||
double ** | hrows | |||
) |
boolean _g2mbl_CMPOrderCoarsePoints | ( | int | nwcp, | |
int | nnz, | |||
index2 * | nzci, | |||
int | brmnnz, | |||
index3 * | brmnzi, | |||
int | blsize, | |||
int * | hsize, | |||
int * | hprof | |||
) |
boolean _g2mbl_CMPSetupBlockCGPrecondd | ( | mesh_ml_optdata * | d, | |
int | bn | |||
) |
boolean _g2mbl_CMPSetupBlockHessiansd | ( | mesh_ml_optdata * | d | ) |
boolean _g2mbl_CMPSetupCoarseHessiand | ( | mesh_ml_optdata * | d, | |
int | bl, | |||
double | nu | |||
) |
boolean _g2mbl_CMPSSetupBlockCGPrecondd | ( | mesh_ml_optdata * | d, | |
int | bn | |||
) |
boolean _g2mbl_CMPSSetupBlockHessiansd | ( | mesh_ml_optdata * | d | ) |
boolean _g2mbl_CMPSSetupCoarseHessiand | ( | mesh_ml_optdata * | d, | |
int | bl, | |||
double | nu | |||
) |
boolean _g2mbl_MLAssignMeshd | ( | mesh_ml_optdata * | d, | |
int | nv, | |||
BSMvertex * | mv, | |||
int * | mvhei, | |||
point3d * | mvcp, | |||
int | nhe, | |||
BSMhalfedge * | mhe, | |||
int | nfac, | |||
BSMfacet * | mfac, | |||
int * | mfhei, | |||
byte * | mkcp | |||
) |
boolean _g2mbl_MLDecomposeBlockPrecond | ( | mesh_ml_optdata * | d, | |
short int | bl, | |||
double | nu, | |||
boolean * | positive | |||
) |
boolean _g2mbl_MLDivideBlock | ( | int | nv, | |
BSMvertex * | mv, | |||
int * | mvhei, | |||
int | nhe, | |||
BSMhalfedge * | mhe, | |||
int | nfac, | |||
BSMfacet * | mfac, | |||
int * | mfhei, | |||
int | nvcp, | |||
int * | vncpi, | |||
int * | nvbcp1, | |||
int ** | vnbcp1, | |||
int * | seed1, | |||
int * | nvbcp2, | |||
int ** | vnbcp2, | |||
int * | seed2, | |||
int | step | |||
) |
boolean _g2mbl_MLFindBlockElementsd | ( | mesh_ml_optdata * | d | ) |
boolean _g2mbl_MLFindElementsd | ( | mesh_ml_optdata * | d, | |
int | bls, | |||
boolean | dnkn | |||
) |
boolean _g2mbl_MLFindVCPNeighboursd | ( | mesh_ml_optdata * | d, | |
nzHbl_rowdesc ** | vn, | |||
int ** | vni | |||
) |
void _g2mbl_MLInvalSmallBlocks | ( | mesh_ml_optdata * | d, | |
int | bl | |||
) |
boolean _g2mbl_MLmultAxd | ( | int | nvars, | |
void * | usrdata, | |||
_CONST double * | x, | |||
double * | Ax | |||
) |
boolean _g2mbl_MLmultQIxd | ( | int | nvars, | |
void * | usrdata, | |||
_CONST double * | x, | |||
double * | Qix | |||
) |
int _g2mbl_MLNextBlockNumd | ( | mesh_ml_optdata * | d, | |
boolean | advance | |||
) |
boolean _g2mbl_MLOptAllocBFArraysd | ( | mesh_ml_optdata * | d, | |
int | nkn1, | |||
int | nkn2, | |||
boolean | reparam | |||
) |
void _g2mbl_MLSAddCPIncrement | ( | int | nvcp, | |
int * | vncpi, | |||
point3d * | mvcp, | |||
vector3d * | mvcpn, | |||
double * | incr, | |||
point3d * | omvcp | |||
) |
boolean _g2mbl_MLSDecomposeBlockPrecond | ( | mesh_ml_optdata * | d, | |
short int | bl, | |||
double | nu, | |||
boolean * | positive | |||
) |
boolean _g2mbl_MLSetupBlockCGHessiand | ( | mesh_ml_optdata * | d, | |
int | bn | |||
) |
boolean _g2mbl_MLSetupBlockCholHessiand | ( | mesh_ml_optdata * | d, | |
int | bn | |||
) |
boolean _g2mbl_MLSetupBlockHessiansd | ( | mesh_ml_optdata * | d | ) |
boolean _g2mbl_MLSetupBlocksd | ( | mesh_ml_optdata * | d, | |
short | nlevels, | |||
short | bsize, | |||
int | step | |||
) |
boolean _g2mbl_MLSetupElemConstd | ( | mesh_ml_optdata * | d, | |
double | dM, | |||
double | dO, | |||
double | C | |||
) |
boolean _g2mbl_MLSFindCPNormalsd | ( | mesh_ml_optdata * | d | ) |
boolean _g2mbl_MLSmultAxd | ( | int | nvars, | |
void * | usrdata, | |||
double * | x, | |||
double * | Ax | |||
) |
boolean _g2mbl_MLSmultQIxd | ( | int | nvars, | |
void * | usrdata, | |||
double * | x, | |||
double * | Qix | |||
) |
boolean _g2mbl_MLSSetupBlockCGHessiand | ( | mesh_ml_optdata * | d, | |
int | bn | |||
) |
boolean _g2mbl_MLSSetupBlockCholHessiand | ( | mesh_ml_optdata * | d, | |
int | bn | |||
) |
boolean _g2mbl_MLSSetupBlockHessiansd | ( | mesh_ml_optdata * | d | ) |
double g2mbl_MLFuncd | ( | int | nkn, | |
double * | qcoeff, | |||
double ** | Nitabs, | |||
double ** | Jac, | |||
int | nv, | |||
point3d * | mvcp, | |||
int | ndomel, | |||
int * | domelind, | |||
meshdom_elem * | domelem, | |||
int * | domelcpind, | |||
boolean | recalc, | |||
double * | ftab | |||
) |
boolean g2mbl_MLFuncGradd | ( | int | nkn, | |
double * | qcoeff, | |||
double ** | Nitabs, | |||
double ** | Jac, | |||
int | nv, | |||
point3d * | mvcp, | |||
int | ndomel, | |||
int * | domelind, | |||
meshdom_elem * | domelem, | |||
int * | domelcpind, | |||
int | nvcp, | |||
int * | vncpi, | |||
boolean | recalc, | |||
double * | ftab, | |||
double * | gtab, | |||
double * | func, | |||
double * | grad | |||
) |
boolean g2mbl_MLFuncGradHessianAd | ( | int | nkn, | |
double * | qcoeff, | |||
double ** | Nitabs, | |||
double ** | Nijtabs, | |||
double ** | Mijtabs, | |||
double ** | Jac, | |||
int | nv, | |||
point3d * | mvcp, | |||
int | ndomel, | |||
int * | domelind, | |||
meshdom_elem * | domelem, | |||
int * | domelcpind, | |||
int | nvcp, | |||
int * | vncpi, | |||
boolean | recalc, | |||
double * | ftab, | |||
double * | gtab, | |||
double * | htab, | |||
double * | func, | |||
double * | grad, | |||
int | nHbl, | |||
nzHbl_rowdesc * | iHbl, | |||
int * | cHbl, | |||
int * | tHbl, | |||
double * | Hbl | |||
) |
boolean g2mbl_MLFuncGradHessianBd | ( | int | nkn, | |
double * | qcoeff, | |||
double ** | Nitabs, | |||
double ** | Nijtabs, | |||
double ** | Mijtabs, | |||
double ** | Jac, | |||
int | nv, | |||
point3d * | mvcp, | |||
int | ndomel, | |||
int * | domelind, | |||
meshdom_elem * | domelem, | |||
int * | domelcpind, | |||
int | nvcp, | |||
int * | vncpi, | |||
boolean | recalc, | |||
double * | ftab, | |||
double * | gtab, | |||
double * | htab, | |||
double * | func, | |||
double * | grad, | |||
int | hsize, | |||
int * | hprof, | |||
double ** | hrows | |||
) |
boolean g2mbl_MLGetHessianRowsd | ( | int | nv, | |
int | nvcp1, | |||
int * | vncpi1, | |||
int | nHbl, | |||
nzHbl_rowdesc * | iHbl, | |||
int * | cHbl, | |||
int * | tHbl, | |||
double * | Hbl, | |||
int | nvcp, | |||
int * | vncpi, | |||
int | hsize, | |||
int * | hprof, | |||
double ** | hrows | |||
) |
boolean g2mbl_MLOptBlockAd | ( | void * | data, | |
int | bl | |||
) |
boolean g2mbl_MLOptBlockBd | ( | void * | data, | |
int | bl | |||
) |
boolean g2mbl_MLSFuncGradd | ( | int | nkn, | |
double * | qcoeff, | |||
double ** | Nitabs, | |||
double ** | Jac, | |||
int | nv, | |||
point3d * | mvcp, | |||
vector3d * | mvcpn, | |||
int | ndomel, | |||
int * | domelind, | |||
meshdom_elem * | domelem, | |||
int * | domelcpind, | |||
int | nvcp, | |||
int * | vncpi, | |||
boolean | recalc, | |||
double * | ftab, | |||
double * | gtab, | |||
double * | func, | |||
double * | grad | |||
) |
boolean g2mbl_MLSFuncGradHessianAd | ( | int | nkn, | |
double * | qcoeff, | |||
double ** | Nitabs, | |||
double ** | Nijtabs, | |||
double ** | Mijtabs, | |||
double ** | Jac, | |||
int | nv, | |||
point3d * | mvcp, | |||
vector3d * | mvcpn, | |||
int | ndomel, | |||
int * | domelind, | |||
meshdom_elem * | domelem, | |||
int * | domelcpind, | |||
int | nvcp, | |||
int * | vncpi, | |||
boolean | recalc, | |||
double * | ftab, | |||
double * | gtab, | |||
double * | htab, | |||
double * | func, | |||
double * | grad, | |||
int | nHbl, | |||
nzHbl_rowdesc * | iHbl, | |||
int * | cHbl, | |||
int * | tHbl, | |||
double * | Hbl | |||
) |
boolean g2mbl_MLSFuncGradHessianBd | ( | int | nkn, | |
double * | qcoeff, | |||
double ** | Nitabs, | |||
double ** | Nijtabs, | |||
double ** | Mijtabs, | |||
double ** | Jac, | |||
int | nv, | |||
point3d * | mvcp, | |||
vector3d * | mvcpn, | |||
int | ndomel, | |||
int * | domelind, | |||
meshdom_elem * | domelem, | |||
int * | domelcpind, | |||
int | nvcp, | |||
int * | vncpi, | |||
boolean | recalc, | |||
double * | ftab, | |||
double * | gtab, | |||
double * | htab, | |||
double * | func, | |||
double * | grad, | |||
int | hsize, | |||
int * | hprof, | |||
double ** | hrows | |||
) |
boolean g2mbl_MLSGetHessianRowsd | ( | int | nv, | |
int | nvcp1, | |||
int * | vncpi1, | |||
int | nHbl, | |||
nzHbl_rowdesc * | iHbl, | |||
int * | cHbl, | |||
int * | tHbl, | |||
double * | Hbl, | |||
int | nvcp, | |||
int * | vncpi, | |||
int | hsize, | |||
int * | hprof, | |||
double ** | hrows | |||
) |
boolean g2mbl_MLSOptBlockAd | ( | void * | data, | |
int | bl | |||
) |
boolean g2mbl_MLSOptBlockBd | ( | void * | data, | |
int | bl | |||
) |