Mercurial > octave-nkf
diff liboctave/CollocWt.cc @ 3:9a4c07481e61
[project @ 1993-08-08 01:20:23 by jwe]
Initial revision
author | jwe |
---|---|
date | Sun, 08 Aug 1993 01:21:46 +0000 |
parents | |
children | 1a48a1b91489 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/CollocWt.cc Sun Aug 08 01:21:46 1993 +0000 @@ -0,0 +1,339 @@ +// CollocWt.cc -*- C++ -*- +/* + +Copyright (C) 1992, 1993 John W. Eaton + +This file is part of Octave. + +Octave is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 2, or (at your option) any +later version. + +Octave is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with Octave; see the file COPYING. If not, write to the Free +Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. + +*/ + +#ifdef __GNUG__ +#pragma implementation +#endif + +#include <iostream.h> +#include "CollocWt.h" +#include "f77-uscore.h" + +extern "C" +{ + int F77_FCN (jcobi) (int*, int*, int*, int*, double*, double*, + double*, double*, double*, double*); + + int F77_FCN (dfopr) (int*, int*, int*, int*, int*, int*, + double*, double*, double*, double*, double*); +} + +// Error handling. + +void +CollocWt::error (const char* msg) +{ + cerr << "Fatal CollocWt error. " << msg << "\n"; + exit(1); +} + +CollocWt::CollocWt (void) +{ + n = 0; + inc_left = 0; + inc_right = 0; + lb = 0.0; + rb = 1.0; + + Alpha = 0.0; + Beta = 0.0; + + initialized = 0; +} + +CollocWt::CollocWt (int nc, int il, int ir) +{ + n = nc; + inc_left = il; + inc_right = ir; + lb = 0.0; + rb = 1.0; + + Alpha = 0.0; + Beta = 0.0; + + initialized = 0; +} + +CollocWt::CollocWt (int nc, int ir, int il, double l, double r) +{ + n = nc; + inc_left = il; + inc_right = ir; + lb = l; + rb = r; + + Alpha = 0.0; + Beta = 0.0; + + initialized = 0; +} + +CollocWt::CollocWt (int nc, double a, double b, int il, int ir) +{ + n = nc; + inc_left = il; + inc_right = ir; + lb = 0.0; + rb = 1.0; + + Alpha = a; + Beta = b; + + initialized = 0; +} + +CollocWt::CollocWt (int nc, double a, double b, int ir, int il, + double l, double r) +{ + n = nc; + inc_left = il; + inc_right = ir; + lb = l; + rb = r; + + Alpha = a; + Beta = b; + + initialized = 0; +} + +CollocWt::CollocWt (const CollocWt& a) +{ + n = a.n; + inc_left = a.inc_left; + inc_right = a.inc_right; + lb = a.lb; + rb = a.rb; + r = a.r; + q = a.q; + A = a.A; + B = a.B; + + nt = n + inc_left + inc_right; + + initialized = a.initialized; +} + +CollocWt& +CollocWt::operator = (const CollocWt& a) +{ + n = a.n; + inc_left = a.inc_left; + inc_right = a.inc_right; + lb = a.lb; + rb = a.rb; + r = a.r; + q = a.q; + A = a.A; + B = a.B; + + nt = a.nt; + + initialized = a.initialized; + + return *this; +} + +CollocWt& +CollocWt::resize (int ncol) +{ + n = ncol; + initialized = 0; + return *this; +} + +CollocWt& +CollocWt::add_left (void) +{ + inc_left = 1; + initialized = 0; + return *this; +} + +CollocWt& +CollocWt::delete_left (void) +{ + inc_left = 0; + initialized = 0; + return *this; +} + +CollocWt& +CollocWt::set_left (double val) +{ + if (val >= rb) + error ("left bound greater than right bound"); + + lb = val; + initialized = 0; + return *this; +} + +CollocWt& +CollocWt::add_right (void) +{ + inc_right = 1; + initialized = 0; + return *this; +} + +CollocWt& +CollocWt::delete_right (void) +{ + inc_right = 0; + initialized = 0; + return *this; +} + +CollocWt& +CollocWt::set_right (double val) +{ + if (val <= lb) + error ("right bound less than left bound"); + + rb = val; + initialized = 0; + return *this; +} + +CollocWt& +CollocWt::set_alpha (double val) +{ + Alpha = val; + initialized = 0; + return *this; +} + +CollocWt& +CollocWt::set_beta (double val) +{ + Beta = val; + initialized = 0; + return *this; +} + +void +CollocWt::init (void) +{ +// Check for possible errors. + + double wid = rb - lb; + if (wid <= 0.0) + error ("width less than or equal to zero"); + + nt = n + inc_left + inc_right; + if (nt < 0) + error ("total number of collocation points less than zero"); + else if (nt == 0) + return; + + double *dif1 = new double [nt]; + double *dif2 = new double [nt]; + double *dif3 = new double [nt]; + double *vect = new double [nt]; + + r.resize (nt); + q.resize (nt); + A.resize (nt, nt); + B.resize (nt, nt); + + double *pr = r.fortran_vec (); + +// Compute roots. + + F77_FCN (jcobi) (&nt, &n, &inc_left, &inc_right, &Alpha, &Beta, + dif1, dif2, dif3, pr); + + int id; + int i, j; + +// First derivative weights. + + id = 1; + for (i = 1; i <= nt; i++) + { + F77_FCN (dfopr) (&nt, &n, &inc_left, &inc_right, &i, &id, dif1, + dif2, dif3, pr, vect); + + for (j = 0; j < nt; j++) + A (i-1, j) = vect[j]; + } + +// Second derivative weights. + + id = 2; + for (i = 1; i <= nt; i++) + { + F77_FCN (dfopr) (&nt, &n, &inc_left, &inc_right, &i, &id, dif1, + dif2, dif3, pr, vect); + + for (j = 0; j < nt; j++) + B (i-1, j) = vect[j]; + } + +// Gaussian quadrature weights. + + id = 3; + double *pq = q.fortran_vec (); + F77_FCN (dfopr) (&nt, &n, &inc_left, &inc_right, &i, &id, dif1, + dif2, dif3, pr, pq); + + delete dif1; + delete dif2; + delete dif3; + delete vect; + + initialized = 1; +} + +ostream& +operator << (ostream& os, const CollocWt& a) +{ + if (a.left_included ()) + os << "left boundary is included\n"; + else + os << "left boundary is not included\n"; + + if (a.right_included ()) + os << "right boundary is included\n"; + else + os << "right boundary is not included\n"; + + os << "\n"; + + os << a.Alpha << " " << a.Beta << "\n\n" + << a.r << "\n\n" + << a.q << "\n\n" + << a.A << "\n" + << a.B << "\n"; + + return os; +} + +/* +;;; Local Variables: *** +;;; mode: C++ *** +;;; page-delimiter: "^/\\*" *** +;;; End: *** +*/