pknumd.h

Go to the documentation of this file.
00001 
00002 /* ///////////////////////////////////////////////////////////////////////// */
00003 /* This file is a part of the BSTools package                                */
00004 /* written by Przemyslaw Kiciak                                              */
00005 /* ///////////////////////////////////////////////////////////////////////// */
00006 /* (C) Copyright by Przemyslaw Kiciak, 2005, 2013                            */
00007 /* this package is distributed under the terms of the                        */
00008 /* Lesser GNU Public License, see the file COPYING.LIB                       */
00009 /* ///////////////////////////////////////////////////////////////////////// */
00010 
00011 /* Header file for the libpknum library of C procedures - numerical methods */
00012 
00013 #ifndef CONST_  /* a dirty trick to suppress many compiler warning messages */
00014 #define CONST_ const
00015 #endif
00016 
00017 #ifndef PKNUMD_H
00018 #define PKNUMD_H
00019 
00020 #ifndef PKVARIA_H
00021 #include "pkvaria.h"
00022 #endif
00023 
00024 #ifdef __cplusplus
00025 extern "C" {
00026 #endif
00027 
00028 /* ///////////////////////////////////////////////////////////////////////// */
00029 #ifndef PKNUM_H
00030 typedef struct bandm_profile {
00031   int firstnz;  /* index of the first row with a nonzero  */
00032                 /* coefficient in the column */
00033   int ind;      /* index of this coefficient in the array */
00034 } bandm_profile;
00035 
00036 typedef struct { double x, y; } complexd;
00037 #endif
00038 
00039 /* ///////////////////////////////////////////////////////////////////////// */
00040 double pkn_ScalarProductd ( int spdimen, const double *a, const double *b );
00041 double pkn_SecondNormd ( int spdimen, const double *b );
00042 
00043 double pkn_detd ( int n, double *a );
00044 
00045 void pkn_AddMatrixd ( int nrows, int rowlen,
00046                       int inpitch1, const double *indata1,
00047                       int inpitch2, const double *indata2,
00048                       int outpitch, double *outdata );
00049 void pkn_AddMatrixMd ( int nrows, int rowlen,
00050                        int inpitch1, const double *indata1,
00051                        int inpitch2, const double *indata2,
00052                        double a,
00053                        int outpitch, double *outdata );
00054 void pkn_SubtractMatrixd ( int nrows, int rowlen,
00055                            int inpitch1, const double *indata1,
00056                            int inpitch2, const double *indata2,
00057                            int outpitch, double *outdata );
00058 void pkn_MatrixMDifferenced ( int nrows, int rowlen,
00059                               int inpitch1, const double *indata1,
00060                               int inpitch2, const double *indata2,
00061                               double a,
00062                               int outpitch, double *outdata );
00063 void pkn_MatrixLinCombd ( int nrows, int rowlen,
00064                           int inpitch1, const double *indata1,
00065                           double a,
00066                           int inpitch2, const double *indata2,
00067                           double b,
00068                           int outpitch, double *outdata );
00069 
00070 void pkn_MultMatrixNumd ( int nrows, int rowlen,
00071                           int inpitch, const double *indata, 
00072                           double a,
00073                           int outpitch, double *outdata );
00074 void pkn_MultArrayd ( int nrows, int rowlen, int pitch_a, CONST_ double *a,
00075                       int pitch_b, CONST_ double *b,
00076                       int pitch_c, double *c );
00077 
00078 void pkn_MultMatrixd ( int nrows_a, int rowlen_a, int pitch_a, CONST_ double *a,
00079                        int rowlen_b, int pitch_b, CONST_ double *b,
00080                        int pitch_c, double *c );
00081 void pkn_MultMatrixAddd ( int nrows_a, int rowlen_a, int pitch_a, CONST_ double *a,
00082                           int rowlen_b, int pitch_b, CONST_ double *b,
00083                           int pitch_c, double *c );
00084 void pkn_MultMatrixSubd ( int nrows_a, int rowlen_a, int pitch_a, CONST_ double *a,
00085                           int rowlen_b, int pitch_b, CONST_ double *b,
00086                           int pitch_c, double *c );
00087 
00088 void pkn_MultTMatrixd ( int nrows_a, int rowlen_a, int pitch_a, const double *a,
00089                         int rowlen_b, int pitch_b, const double *b,
00090                         int pitch_c, double *c );
00091 void pkn_MultTMatrixAddd ( int nrows_a, int rowlen_a, int pitch_a,
00092                            const double *a,
00093                            int rowlen_b, int pitch_b, const double *b,
00094                            int pitch_c, double *c );
00095 void pkn_MultTMatrixSubd ( int nrows_a, int rowlen_a, int pitch_a,
00096                            const double *a,
00097                            int rowlen_b, int pitch_b, const double *b,
00098                            int pitch_c, double *c );
00099 void pkn_MultMatrixTd ( int nrows_a, int rowlen_a, int pitch_a, const double *a,
00100                         int nrows_b, int pitch_b, const double *b,
00101                         int pitch_c, double *c );
00102 void pkn_MultMatrixTAddd ( int nrows_a, int rowlen_a, int pitch_a, const double *a,
00103                            int nrows_b, int pitch_b, const double *b,
00104                            int pitch_c, double *c );
00105 void pkn_MultMatrixTSubd ( int nrows_a, int rowlen_a, int pitch_a, const double *a,
00106                            int nrows_b, int pitch_b, const double *b,
00107                            int pitch_c, double *c );
00108 
00109 /* ///////////////////////////////////////////////////////////////////////// */
00110 void pkn_FindGivensRotationd ( double a, double b, double *c, double *s );
00111 void pkn_FindGivensRotXid ( double a, double b, double *c, double *s, double *xi );
00112 void pkn_FindXiGivensRotd ( double xi, double *c, double *s );
00113 void pkn_ApplyGivensRotationd ( double c, double s, double *a, double *b );
00114 void pkn_ApplySymGivensRotationd ( double c, double s,
00115                                    double *d, double *e, double *f );
00116 
00117 /* ///////////////////////////////////////////////////////////////////////// */
00118 void pkn_MVectorSumd ( int m, int n, double *sum, ... );
00119 void pkn_MVectorLinCombd ( int m, int n, double *sum, ... );
00120 
00121 /* ///////////////////////////////////////////////////////////////////////// */
00122 boolean pkn_GaussDecomposePLUQd ( int n, double *a, int *P, int *Q );
00123 void pkn_multiSolvePLUQd ( int n, const double *lu, const int *P, const int *Q,
00124                            int spdimen, int pitch, double *b );
00125 boolean pkn_multiGaussSolveLinEqd ( int n, const double *a,
00126                                     int spdimen, int pitch, double *b );
00127 boolean pkn_GaussInvertMatrixd ( int n, double *a );
00128 
00129 /* ///////////////////////////////////////////////////////////////////////// */
00130 boolean pkn_QRDecomposeMatrixd ( int nrows, int ncols, double *a, double *aa );
00131 void pkn_multiReflectVectord ( int nrows, int ncols,
00132                                const double *a, const double *aa,
00133                                int spdimen, int pitch, double *b );
00134 void pkn_multiInvReflectVectord ( int nrows, int ncols,
00135                                   const double *a, const double *aa,
00136                                   int spdimen, int pitch, double *b );
00137 void pkn_multiMultUTVectord ( int nrows, const double *a,
00138                               int spdimen, int bpitch, double *b,
00139                               int xpitch, double *x );
00140 void pkn_multiMultInvUTVectord ( int nrows, const double *a,
00141                                  int spdimen, int bpitch, double *b,
00142                                  int xpitch, double *x );
00143 void pkn_multiMultTrUTVectord ( int nrows, const double *a,
00144                                 int spdimen, int bpitch, double *b,   
00145                                 int xpitch, double *x );
00146 void pkn_multiMultInvTrUTVectord ( int nrows, const double *a,
00147                                    int spdimen, int bpitch, double *b,   
00148                                    int xpitch, double *x );
00149 boolean pkn_multiSolveRLSQd ( int nrows, int ncols, double *a,
00150                               int spdimen, int bpitch, double *b,
00151                               int xpitch, double *x );
00152 void pkn_QRGetReflectiond ( int nrows, int ncols,
00153                             const double *a, const double *aa,
00154                             int nrefl, double *w, double *gamma );
00155 
00156 
00157 /* ///////////////////////////////////////////////////////////////////////// */
00158 #ifndef PKNUM_H
00159 void pkn_BandmFindQRMSizes ( int ncols, const bandm_profile *aprof,
00160                              int *qsize, int *rsize );
00161 #endif
00162 
00163 void pkn_BandmQRDecomposeMatrixd ( int nrows, int ncols,
00164                                   const bandm_profile *aprof, const double *a,
00165                                   bandm_profile *qprof, double *q,
00166                                   bandm_profile *rprof, double *r );
00167 void pkn_multiBandmReflectVectord ( int ncols,
00168                                     const bandm_profile *qprof, const double *q,
00169                                     int spdimen, double *b );
00170 void pkn_multiBandmInvReflectVectord ( int ncols,
00171                                        const bandm_profile *qprof,
00172                                        const double *q,
00173                                        int spdimen, double *b );
00174 void pkn_multiBandmMultVectord ( int nrows, int ncols,
00175                                  const bandm_profile *aprof, const double *a,
00176                                  int spdimen, const double *x, double *y );
00177 void pkn_multiBandmMultInvUTMVectord ( int nrows,
00178                                        const bandm_profile *rprof,
00179                                        const double *r,
00180                                        int spdimen, const double *x, double *y );
00181 void pkn_multiBandmMultTrVectord ( int ncols,
00182                                    const bandm_profile *aprof, const double *a,
00183                                    int spdimen, const double *x, double *y );
00184 void pkn_multiBandmMultInvTrUTMVectord ( int nrows,
00185                                          const bandm_profile *rprof,
00186                                          const double *r,
00187                                          int spdimen, const double *x, double *y );
00188 
00189 void pkn_multiBandmSolveRLSQd ( int nrows, int ncols,
00190                                 const bandm_profile *aprof, const double *a,
00191                                 int nrsides, int spdimen,
00192                                 int bpitch, const double *b,
00193                                 int xpitch, double *x );
00194 void pkn_multiBandmSolveDLSQd ( int nrows, int ncols,
00195                                 const bandm_profile *atprof, const double *at,
00196                                 int nrsides, int spdimen,
00197                                 int bpitch, const double *b,
00198                                 int x0pitch, const double *x0,
00199                                 int xpitch, double *x );
00200 void pkn_multiBandmSolveCRLSQd ( int nrows, int ncols,
00201                                  const bandm_profile *aprof, const double *a,
00202                                  int nconstr, int cpitch, const double *c,
00203                                  int nrsides, int spdimen,
00204                                  int bpitch, const double *b,
00205                                  int dpitch, const double *d,
00206                                  int xpitch, double *x );
00207 
00208 void pkn_PrintBandmd ( int ncols, const bandm_profile *aprof, const double *a );
00209 void pkn_PrintBandmRowSumd ( int ncols, const bandm_profile *aprof, const double *a );
00210 void pkn_PrintMatd ( int nrows, int ncols, const double *a );
00211 
00212 #ifndef PKNUM_H
00213 void pkn_PrintProfile ( int ncols, const bandm_profile *prof );
00214 #endif
00215 
00216 /* ///////////////////////////////////////////////////////////////////////// */
00217 #ifndef PKNUM_H
00218 #define pkn_LowerTrMatIndex(i,j) \
00219   ( (i)*((i)+1)/2+(j) )
00220 #define pkn_SymMatIndex(i,j) \
00221   ( (i) >= (j) ? (i)*((i)+1)/2+(j) : (j)*((j)+1)/2+(i) )
00222 #endif
00223 
00224 boolean pkn_CholeskyDecompd ( int n, double *a );
00225 void pkn_SymMatrixMultd ( int n, CONST_ double *a, int spdimen,
00226                           int bpitch, CONST_ double *b,
00227                           int xpitch, double *x );
00228 void pkn_LowerTrMatrixMultd ( int n, CONST_ double *l, int spdimen,
00229                               int bpitch, CONST_ double *b,
00230                               int xpitch, double *x );
00231 void pkn_UpperTrMatrixMultd ( int n, CONST_ double *l, int spdimen,
00232                               int bpitch, CONST_ double *b,
00233                               int xpitch, double *x );
00234 void pkn_LowerTrMatrixSolved ( int n, const double *l, int spdimen,
00235                                int bpitch, const double *b,
00236                                int xpitch, double *x );
00237 void pkn_UpperTrMatrixSolved ( int n, const double *l, int spdimen,
00238                                int bpitch, const double *b,
00239                                int xpitch, double *x );
00240 
00241 void pkn_MatrixLowerTrMultd ( int m, int n, int bpitch, CONST_ double *b,
00242                               CONST_ double *l, int xpitch, double *x );  
00243 void pkn_MatrixUpperTrMultd ( int m, int n, int bpitch, CONST_ double *b,
00244                               CONST_ double *l, int xpitch, double *x );  
00245 void pkn_MatrixLowerTrSolved ( int m, int n, int bpitch, CONST_ double *b,
00246                                CONST_ double *l, int xpitch, double *x );  
00247 void pkn_MatrixUpperTrSolved ( int m, int n, int bpitch, CONST_ double *b,
00248                                CONST_ double *l, int xpitch, double *x );  
00249 void pkn_MatrixLowerTrMultAddd ( int m, int n, int bpitch, CONST_ double *b,
00250                                  CONST_ double *l, int xpitch, double *x );
00251 void pkn_MatrixUpperTrMultAddd ( int m, int n, int bpitch, CONST_ double *b,
00252                                  CONST_ double *l, int xpitch, double *x );  
00253 boolean pkn_MatrixLowerTrSolveAddd ( int m, int n, int bpitch, CONST_ double *b,
00254                                      CONST_ double *l, int xpitch, double *x );  
00255 boolean pkn_MatrixUpperTrSolveAddd ( int m, int n, int bpitch, CONST_ double *b,
00256                                      CONST_ double *l, int xpitch, double *x );  
00257 void pkn_MatrixLowerTrMultSubd ( int m, int n, int bpitch, CONST_ double *b,
00258                                  CONST_ double *l, int xpitch, double *x );  
00259 void pkn_MatrixUpperTrMultSubd ( int m, int n, int bpitch, CONST_ double *b,
00260                                  CONST_ double *l, int xpitch, double *x );  
00261 boolean pkn_MatrixLowerTrSolveSubd ( int m, int n, int bpitch, CONST_ double *b,
00262                                      CONST_ double *l, int xpitch, double *x );  
00263 boolean pkn_MatrixUpperTrSolveSubd ( int m, int n, int bpitch, CONST_ double *b,
00264                                      CONST_ double *l, int xpitch, double *x );  
00265 
00266 void pkn_SymToFullMatrixd ( int n, const double *syma,
00267                             int pitch, double *fulla );
00268 void pkn_FullToSymMatrixd ( int n, int pitch, const double *fulla,
00269                             double *syma );
00270 #define pkn_FullToLTrMatrixd(n,pitch,fulla,ltra) \
00271   pkn_FullToSymMatrixd(n,pitch,fulla,ltra)
00272 void pkn_LTrToFullMatrixd ( int n, const double *ltra,
00273                             int pitch, double *fulla );
00274 void pkn_UTrToFullMatrixd ( int n, const double *utra,
00275                             int pitch, double *fulla );
00276 void pkn_FullToUTrMatrixd ( int n, int pitch, const double *fulla,
00277                             double *utra );
00278 
00279 void pkn_ComputeQSQTd ( int m, const double *s,   
00280                         int n, const double *a, const double *aa,
00281                         double *b );
00282 void pkn_ComputeQTSQd ( int m, const double *s,
00283                         int n, const double *a, const double *aa,
00284                         double *b );
00285 
00286 void pkn_SymMatSubAATd ( int n, double *b, int m, int pitch_a, CONST_ double *a );
00287 
00288 void pkn_SymMatFindEigenvalueIntervald ( int n, double *a,
00289                                          double *lmin, double *lmax );
00290 boolean pkn_SymMatFindEigenvaluesd ( int n, double *a, double *eigenval );
00291 
00292 /* ///////////////////////////////////////////////////////////////////////// */
00293 #ifndef PKNUM_H
00294 #define pkn_LHessenbergMatIndex(i,j) \
00295   (pkn_LowerTrMatIndex(((i)+1),(j))-1)
00296 #define pkn_UHessenbergMatIndex(i,j) \
00297   (pkn_LowerTrMatIndex(((j)+1),(i))-1)
00298 #endif
00299 
00300 boolean pkn_QRDecompUHessenbergd ( int n, double *ah );
00301 void pkn_multiSolveQRUHessenbergd ( int n, double *qrh,
00302                                     int spdimen, int pitch, double *b );
00303 boolean pkn_multiSolveUHessenbergLinEqd ( int n, double *ah,
00304                                           int spdimen, int pitch, double *b );
00305 
00306 /* ///////////////////////////////////////////////////////////////////////// */
00307 double pkn_Illinoisd ( double (*f) (double), double a, double b, double eps,
00308                       boolean *error );
00309 
00310 boolean pkn_SolveSqEqd ( double p, double q, double *x1, double *x2 );
00311 
00312 double pkn_GoldenRatd ( double (*f) (double), double a, double b, double eps,     
00313                        boolean *error );
00314 
00315 
00316 /* ///////////////////////////////////////////////////////////////////////// */
00317 void pkn_Setup2DerA11Matrixd ( double xu, double yu, double xv, double yv,
00318                                double *A11 );
00319 
00320 void pkn_Setup2DerA21Matrixd ( double xuu, double yuu, double xuv,
00321                                double yuv, double xvv, double yvv,
00322                                double *A21 );
00323 void pkn_Setup2DerA22Matrixd ( double xu, double yu, double xv, double yv,
00324                                double *A22 );
00325 
00326 void pkn_Setup2DerA31Matrixd ( double xuuu, double yuuu, double xuuv, double yuuv,
00327                                double xuvv, double yuvv, double xvvv, double yvvv,
00328                                double *A31 );
00329 void pkn_Setup2DerA32Matrixd ( double xu, double yu, double xv, double yv,
00330                                double xuu, double yuu, double xuv,
00331                                double yuv, double xvv, double yvv,
00332                                double *A32 );
00333 void pkn_Setup2DerA33Matrixd ( double xu, double yu, double xv, double yv,
00334                                double *A33 );
00335 
00336 void pkn_Setup2DerA41Matrixd ( double xuuuu, double yuuuu, double xuuuv, double yuuuv,
00337                                double xuuvv, double yuuvv, double xuvvv, double yuvvv,
00338                                double xvvvv, double yvvvv,
00339                                double *A41 );
00340 void pkn_Setup2DerA42Matrixd ( double xu, double yu, double xv, double yv,
00341                                double xuu, double yuu, double xuv,
00342                                double yuv, double xvv, double yvv,
00343                                double xuuu, double yuuu, double xuuv, double yuuv,
00344                                double xuvv, double yuvv, double xvvv, double yvvv,
00345                                double *A42 );
00346 void pkn_Setup2DerA43Matrixd ( double xu, double yu, double xv, double yv,
00347                                double xuu, double yuu, double xuv,
00348                                double yuv, double xvv, double yvv,
00349                                double *A43 );
00350 void pkn_Setup2DerA44Matrixd ( double xu, double yu, double xv, double yv,
00351                                double *A44 );
00352 
00353 
00354 void pkn_Comp2Derivatives1d ( double xu, double yu, double xv, double yv,
00355                               int spdimen, const double *gx, const double *gy,
00356                               double *hu, double *hv );
00357 void pkn_Comp2Derivatives2d ( double xu, double yu, double xv, double yv,
00358                               double xuu, double yuu, double xuv,
00359                               double yuv, double xvv, double yvv,
00360                               int spdimen,
00361                               const double *gx, const double *gy,
00362                               const double *gxx, const double *gxy,
00363                               const double *gyy,
00364                               double *huu, double *huv, double *hvv );
00365 void pkn_Comp2Derivatives3d ( double xu, double yu, double xv, double yv,
00366                               double xuu, double yuu, double xuv,
00367                               double yuv, double xvv, double yvv,
00368                               double xuuu, double yuuu, double xuuv, double yuuv,
00369                               double xuvv, double yuvv, double xvvv, double yvvv,
00370                               int spdimen,
00371                               const double *gx, const double *gy,
00372                               const double *gxx, const double *gxy,
00373                               const double *gyy,
00374                               const double *gxxx, const double *gxxy,
00375                               const double *gxyy, const double *gyyy,
00376                               double *huuu, double *huuv,
00377                               double *huvv, double *hvvv );
00378 void pkn_Comp2Derivatives4d ( double xu, double yu, double xv, double yv,
00379                               double xuu, double yuu, double xuv,
00380                               double yuv, double xvv, double yvv,
00381                               double xuuu, double yuuu, double xuuv, double yuuv,
00382                               double xuvv, double yuvv, double xvvv, double yvvv,
00383                               double xuuuu, double yuuuu, double xuuuv,
00384                               double yuuuv, double xuuvv, double yuuvv,
00385                               double xuvvv, double yuvvv,
00386                               double xvvvv, double yvvvv,
00387                               int spdimen,
00388                               const double *gx, const double *gy,
00389                               const double *gxx, const double *gxy,
00390                               const double *gyy,
00391                               const double *gxxx, const double *gxxy,
00392                               const double *gxyy, const double *gyyy,
00393                               const double *gxxxx, const double *gxxxy,
00394                               const double *gxxyy, const double *gxyyy,
00395                               const double *gyyyy,
00396                               double *huuuu, double *huuuv, double *huuvv,
00397                               double *huvvv, double *hvvvv );
00398 
00399 
00400 void pkn_Comp2iDerivatives1d ( double xu, double yu, double xv, double yv,
00401                                int spdimen, const double *hu, const double *hv,
00402                                double *gx, double *gy );
00403 void pkn_Comp2iDerivatives2d ( double xu, double yu, double xv, double yv,
00404                                double xuu, double yuu, double xuv,
00405                                double yuv, double xvv, double yvv,
00406                                int spdimen,
00407                                const double *hu, const double *hv,
00408                                const double *huu, const double *huv,
00409                                const double *hvv,
00410                                double *gx, double *gy,
00411                                double *gxx, double *gxy, double *gyy );
00412 void pkn_Comp2iDerivatives3d ( double xu, double yu, double xv, double yv,
00413                                double xuu, double yuu, double xuv,
00414                                double yuv, double xvv, double yvv,
00415                                double xuuu, double yuuu, double xuuv, double yuuv,
00416                                double xuvv, double yuvv, double xvvv, double yvvv,
00417                                int spdimen,
00418                                const double *hu, const double *hv,
00419                                const double *huu, const double *huv,
00420                                const double *hvv,
00421                                const double *huuu, const double *huuv,
00422                                const double *huvv, const double *hvvv,
00423                                double *gx, double *gy,
00424                                double *gxx, double *gxy, double *gyy,
00425                                double *gxxx, double *gxxy,
00426                                double *gxyy, double *gyyy );
00427 void pkn_Comp2iDerivatives4d ( double xu, double yu, double xv, double yv,
00428                                double xuu, double yuu, double xuv,
00429                                double yuv, double xvv, double yvv,
00430                                double xuuu, double yuuu, double xuuv, double yuuv,
00431                                double xuvv, double yuvv, double xvvv, double yvvv,
00432                                double xuuuu, double yuuuu, double xuuuv,
00433                                double yuuuv, double xuuvv, double yuuvv,
00434                                double xuvvv, double yuvvv,
00435                                double xvvvv, double yvvvv,
00436                                int spdimen,
00437                                const double *hu, const double *hv,
00438                                const double *huu, const double *huv,
00439                                const double *hvv,
00440                                const double *huuu, const double *huuv,
00441                                const double *huvv, const double *hvvv,
00442                                const double *huuuu, const double *huuuv,
00443                                const double *huuvv, const double *huvvv,
00444                                const double *hvvvv,
00445                                double *gx, double *gy,
00446                                double *gxx, double *gxy, double *gyy,
00447                                double *gxxx, double *gxxy,
00448                                double *gxyy, double *gyyy,
00449                                double *gxxxx, double *gxxxy, double *gxxyy,
00450                                double *gxyyy, double *gyyyy );
00451 
00452 
00453 void pkn_f2iDerivatives1d ( double xu, double yu, double xv, double yv,
00454                             double *gx, double *gy );
00455 void pkn_f2iDerivatives2d ( double xu, double yu, double xv, double yv,
00456                             double xuu, double yuu, double xuv,
00457                             double yuv, double xvv, double yvv,
00458                             double *gx, double *gy,
00459                             double *gxx, double *gxy, double *gyy );
00460 void pkn_f2iDerivatives3d ( double xu, double yu, double xv, double yv,
00461                             double xuu, double yuu, double xuv,
00462                             double yuv, double xvv, double yvv,
00463                             double xuuu, double yuuu, double xuuv, double yuuv,
00464                             double xuvv, double yuvv, double xvvv, double yvvv,
00465                             double *gx, double *gy,
00466                             double *gxx, double *gxy, double *gyy,
00467                             double *gxxx, double *gxxy,
00468                             double *gxyy, double *gyyy );
00469 void pkn_f2iDerivatives4d ( double xu, double yu, double xv, double yv,
00470                             double xuu, double yuu, double xuv,
00471                             double yuv, double xvv, double yvv,
00472                             double xuuu, double yuuu, double xuuv, double yuuv,
00473                             double xuvv, double yuvv, double xvvv, double yvvv,
00474                             double xuuuu, double yuuuu, double xuuuv,
00475                             double yuuuv, double xuuvv, double yuuvv,
00476                             double xuvvv, double yuvvv,
00477                             double xvvvv, double yvvvv,
00478                             double *gx, double *gy,
00479                             double *gxx, double *gxy, double *gyy,
00480                             double *gxxx, double *gxxy,
00481                             double *gxyy, double *gyyy,
00482                             double *gxxxx, double *gxxxy, double *gxxyy,
00483                             double *gxyyy, double *gyyyy );
00484 
00485 
00486 /* ///////////////////////////////////////////////////////////////////////// */
00487 #ifndef PKNUM_H
00488 int pkn_Block1ArraySize ( int k, int r, int s );
00489 int pkn_Block1FindBlockPos ( int k, int r, int s, int i, int j );
00490 int pkn_Block1FindElemPos ( int k, int r, int s, int i, int j );
00491 #endif
00492 
00493 boolean pkn_Block1CholeskyDecompMd ( int k, int r, int s, double *A );
00494 void pkn_Block1LowerTrMSolved ( int k, int r, int s, CONST_ double *A,
00495                                 int spdimen, int xpitch, double *x );
00496 void pkn_Block1UpperTrMSolved ( int k, int r, int s, CONST_ double *A,
00497                                 int spdimen, int xpitch, double *x );
00498 void pkn_Block1SymMatrixMultd ( int k, int r, int s, CONST_ double *A,
00499                                 int spdimen, int xpitch, double *x,
00500                                 int ypitch, double *y );
00501 
00502 
00503 /* ///////////////////////////////////////////////////////////////////////// */
00504 int pkn_FFTPermuted ( int n, int rowlen, int pitch, complexd *a );
00505 boolean pkn_FFTd ( int n, int rowlen, int pitch, complexd *a );
00506 boolean pkn_InvFFTd ( int n, int rowlen, int pitch, complexd *a );
00507 
00508 
00509 /* ///////////////////////////////////////////////////////////////////////// */
00510 #ifndef PKNUM_H
00511 int pkn_Block2ArraySize ( int k, int r, int s, int t );
00512 int pkn_Block2FindBlockPos ( int k, int r, int s, int t, int i, int j );
00513 int pkn_Block2FindElemPos ( int k, int r, int s, int t, int i, int j );
00514 #endif
00515 
00516 boolean pkn_Block2CholeskyDecompMd ( int k, int r, int s, int t, double *A );
00517 void pkn_Block2LowerTrMSolved ( int k, int r, int s, int t, CONST_ double *L,
00518                                 int spdimen, int xpitch, double *x );
00519 void pkn_Block2UpperTrMSolved ( int k, int r, int s, int t, CONST_ double *L,
00520                                 int spdimen, int xpitch, double *x );
00521 void pkn_Block2SymMatrixMultd ( int k, int r, int s, int t, CONST_ double *A,
00522                                 int spdimen, int xpitch, CONST_ double *x,
00523                                 int ypitch, double *y );
00524 
00525 /* ///////////////////////////////////////////////////////////////////////// */
00526 #ifndef PKNUM_H
00527 int pkn_Block3ArraySize ( int k, int r, int s );
00528 int pkn_Block3FindBlockPos ( int k, int r, int s, int i, int j );
00529 int pkn_Block3FindElemPos ( int k, int r, int s, int i, int j );
00530 #endif
00531 
00532 boolean pkn_Block3CholeskyDecompMd ( int k, int r, int s, double *A );
00533 void pkn_Block3LowerTrMSolved ( int k, int r, int s, CONST_ double *L,
00534                                 int spdimen, int xpitch, double *x );
00535 void pkn_Block3UpperTrMSolved ( int k, int r, int s, CONST_ double *L,
00536                                 int spdimen, int xpitch, double *x );
00537 
00538 void pkn_Block3SymMatrixMultd ( int k, int r, int s, CONST_ double *A,
00539                                 int spdimen, int xpitch, CONST_ double *x,
00540                                 int ypitch, double *y );
00541 
00542 /* ///////////////////////////////////////////////////////////////////////// */
00543 #ifndef PKNUM_H
00544 int pkn_NRBArraySize ( int n, const int *prof );
00545 #endif
00546 
00547 boolean pkn_NRBFindRowsd ( int n, const int *prof, CONST_ double *a,
00548                            double **row );
00549 boolean pkn_NRBSymCholeskyDecompd ( int n, const int *prof, double *a,
00550                                     double **row, boolean *abort );
00551 boolean pkn_NRBSymMultd ( int n, const int *prof, CONST_ double *a,
00552                           double **row,
00553                           int spdimen, int xpitch, CONST_ double *x,
00554                           int ypitch, double *y );
00555 boolean pkn_NRBLowerTrMultd ( int n, const int *prof, CONST_ double *a,
00556                               double **row,
00557                               int spdimen, int xpitch, CONST_ double *x,
00558                               int ypitch, double *y );
00559 boolean pkn_NRBUpperTrMultd ( int n, const int *prof, CONST_ double *a,
00560                               double **row,
00561                               int spdimen, int xpitch, CONST_ double *x,
00562                               int ypitch, double *y );
00563 boolean pkn_NRBLowerTrSolved ( int n, const int *prof, CONST_ double *l,
00564                                double **row,
00565                                int spdimen, int bpitch, CONST_ double *b,
00566                                int xpitch, double *x );
00567 boolean pkn_NRBUpperTrSolved ( int n, const int *prof, CONST_ double *l,
00568                                double **row,
00569                                int spdimen, int bpitch, CONST_ double *b,
00570                                int xpitch, double *x );
00571 
00572 boolean pkn_NRBSymFindEigenvalueIntervald ( int n, const int *prof,
00573                                             double *a, double **row,
00574                                             double *amin, double *amax );
00575 
00576 boolean pkn_NRBComputeQTSQd ( int n, int *prof, double *Amat, double **Arows,
00577                               int w, double *Bmat, double *bb,
00578                               int *qaprof, double **QArows );
00579 boolean pkn_NRBComputeQSQTd ( int n, int *prof, double *Amat, double **Arows,
00580                               int w, double *Bmat, double *bb,
00581                               int *qaprof, double **QArows );
00582 
00583 boolean pkn_NRBComputeQTSQbld ( int n, int *prof, double *Amat, double **Arows,
00584                                 int w, double *Bmat, double *bb,
00585                                 int *qa11prof, double **QA11rows,
00586                                 int *qa22prof, double **QA22rows,
00587                                 double **QA21 );
00588 boolean pkn_NRBComputeQSQTbld ( int n, int *prof, double *Amat, double **Arows,
00589                                 int w, double *Bmat, double *bb,
00590                                 int *qa11prof, double **QA11rows,
00591                                 int *qa22prof, double **QA22rows,
00592                                 double **QA21 );
00593 
00594 /* ///////////////////////////////////////////////////////////////////////// */
00595 boolean pkn_PCGd ( int n, void *usrdata, double *b, double *x,
00596             boolean (*multAx)( int n, void *usrdata, const double *x, double *Ax ),
00597             boolean (*multQIx)( int n, void *usrdata, const double *x, double *Qix ),
00598             int maxit, double eps, double delta, int *itm );
00599 
00600 /* ///////////////////////////////////////////////////////////////////////// */
00601 boolean pkn_MultSPMVectord ( int nrows, int ncols, int nnz,
00602                              const index2 *ai, const double *ac,
00603                              int spdimen, const double *x,
00604                              double *y );
00605 boolean pkn_MultSPMTVectord ( int nrows, int ncols, int nnz,
00606                               const index2 *ai, const double *ac,
00607                               int spdimen, const double *x,
00608                               double *y );
00609 
00610 boolean pkn_MultSPsubMVectord ( int nrows, int ncols, int nnz,
00611                                 const index3 *ai, const double *ac,
00612                                 int spdimen, const double *x,
00613                                 double *y );
00614 boolean pkn_MultSPsubMTVectord ( int nrows, int ncols, int nnz,
00615                                  const index3 *ai, const double *ac,
00616                                  int spdimen, const double *x,
00617                                  double *y );
00618 
00619 /* fast sparse matrix multiplication - uses data produced by */
00620 /* one of the pkn_SPMFind*nnz* or pkn_SPsubMFind*nnz* procedures */
00621 void pkn_SPMFastMultMMd ( double *ac, double *bc,
00622                           int nnzab, int *abpos, index2 *aikbkj,
00623                           double *abc );
00624 
00625 /* slower (but still decent) matrix multiplication procedures */
00626 boolean pkn_SPMmultMMCd ( int nra, int nca, int ncb,
00627                           unsigned int nnza, index2 *ai, double *ac,
00628                           unsigned int *apermut, int *acols, boolean ca,
00629                           unsigned int nnzb, index2 *bi, double *bc,
00630                           unsigned int *bpermut, int *bcols, boolean cb,
00631                           index2 *abi, double *abc );
00632 boolean pkn_SPMmultMMTCd ( int nra, int nca, int nrb,
00633                            unsigned int nnza, index2 *ai, double *ac,
00634                            unsigned int *apermut, int *acols, boolean ca,
00635                            unsigned int nnzb, index2 *bi, double *bc,
00636                            unsigned int *bpermut, int *brows, boolean rb,
00637                            index2 *abi, double *abc );
00638 boolean pkn_SPMmultMTMCd ( int nra, int nca, int ncb,
00639                            unsigned int nnza, index2 *ai, double *ac,
00640                            unsigned int *apermut, int *arows, boolean ra,
00641                            unsigned int nnzb, index2 *bi, double *bc,
00642                            unsigned int *bpermut, int *bcols, boolean ba,
00643                            index2 *abi, double *abc );
00644 
00645 boolean pkn_SPsubMmultMMCd ( int nra, int nca, int ncb,
00646                              unsigned int nnza, index3 *ai, double *ac,
00647                              unsigned int *apermut, int *acols, boolean ca,
00648                              unsigned int nnzb, index3 *bi, double *bc,
00649                              unsigned int *bpermut, int *bcols, boolean cb,
00650                              index2 *abi, double *abc );
00651 boolean pkn_SPsubMmultMMTCd ( int nra, int nca, int nrb,
00652                               unsigned int nnza, index3 *ai, double *ac,
00653                               unsigned int *apermut, int *acols, boolean ca,
00654                               unsigned int nnzb, index3 *bi, double *bc,
00655                               unsigned int *bpermut, int *brows, boolean rb,
00656                               index2 *abi, double *abc );
00657 boolean pkn_SPsubMmultMTMCd ( int nra, int nca, int ncb,
00658                               unsigned int nnza, index3 *ai, double *ac,
00659                               unsigned int *apermut, int *arows, boolean ra,
00660                               unsigned int nnzb, index3 *bi, double *bc,
00661                               unsigned int *bpermut, int *bcols, boolean cb,
00662                               index2 *abi, double *abc );
00663 
00664 /* ///////////////////////////////////////////////////////////////////////// */
00665 boolean pkn_QuadRectanglesd ( double a, double b, int n,
00666                               double *qknots, double *qcoeff );
00667 boolean pkn_QuadSimpsond ( double a, double b, int n,
00668                            double *qknots, double *qcoeff );
00669 
00670 boolean pkn_QuadGaussLegendre4d ( double a, double b, int n,
00671                                   double *qknots, double *qcoeff );
00672 boolean pkn_QuadGaussLegendre6d ( double a, double b, int n,
00673                                   double *qknots, double *qcoeff );
00674 boolean pkn_QuadGaussLegendre8d ( double a, double b, int n,
00675                                   double *qknots, double *qcoeff );
00676 boolean pkn_QuadGaussLegendre10d ( double a, double b, int n,
00677                                    double *qknots, double *qcoeff );
00678 boolean pkn_QuadGaussLegendre12d ( double a, double b, int n,
00679                                    double *qknots, double *qcoeff );
00680 boolean pkn_QuadGaussLegendre14d ( double a, double b, int n,
00681                                    double *qknots, double *qcoeff );
00682 boolean pkn_QuadGaussLegendre16d ( double a, double b, int n,
00683                                    double *qknots, double *qcoeff );
00684 boolean pkn_QuadGaussLegendre18d ( double a, double b, int n,
00685                                    double *qknots, double *qcoeff );
00686 boolean pkn_QuadGaussLegendre20d ( double a, double b, int n,
00687                                    double *qknots, double *qcoeff );
00688 
00689 /* ///////////////////////////////////////////////////////////////////////// */
00690 #ifndef PKN_LMT_CONTINUE
00691 /* return values of pkn_NLMIterd */
00692 #define PKN_LMT_ERROR          -1
00693 #define PKN_LMT_CONTINUE_LM     0
00694 #define PKN_LMT_CONTINUE_N      1
00695 #define PKN_LMT_FOUND_MINIMUM   2
00696 #define PKN_LMT_FOUND_ZEROGRAD  3
00697 #define PKN_LMT_FOUND_BARRIER   4
00698 #endif
00699 
00700 typedef boolean (*pkn_NLMTevalfuncd)( int n, void *usrdata,
00701                                       double *x, double *f );
00702 typedef boolean (*pkn_NLMTevalfuncgd)( int n, void *usrdata,
00703                                        double *x, double *f, double *g );
00704 typedef boolean (*pkn_NLMTevalfuncghd)( int n, void *usrdata,
00705                                         double *x, double *f, double *g, double *h );
00706 typedef boolean (*pkn_NLMTtransfuncd)( int n, void *usrdata, double *x );
00707 typedef boolean (*pkn_NLMTtunnelfuncd)( int n, void *usrdata,
00708                                         double *x0, double *x1, boolean *went_out );
00709 
00710 int pkn_NLMIterd ( int n, void *usrdata, double *x,
00711                    pkn_NLMTevalfuncd funcf, pkn_NLMTevalfuncgd funcfg,
00712                    pkn_NLMTevalfuncghd funcfgh,
00713                    pkn_NLMTtransfuncd trans, pkn_NLMTtunnelfuncd tunnel,
00714                    double lowerbound, double eps, double delta,
00715                    double *nu );
00716 
00717 #ifdef __cplusplus
00718 }
00719 #endif
00720 
00721 #endif /* PKNUMD_H*/
00722