package riso.numerical; /** qagse.java, qags.java, qelg.java, qk21.java, and qpsrt.java are * derivative works (translations) of Fortran code by Robert Piessens * and Elise de Doncker. These five files are released under GPL * by permission of Robert Piessens. In response to my question, * <pre> * >I would like to have your permission to distribute my * >Java translation of your QUADPACK routines under the * >terms of the GPL. Do I have your permission to do so? * </pre> * Robert Piessens writes: * <pre> * Date: Mon, 28 Jan 2002 14:41:58 +0100 * To: "Robert Dodier" <robert_dodier@yahoo.com> * From: "Robert Piessens" <Robert.Piessens@cs.kuleuven.ac.be> * Subject: Re: Permission to redistribute QUADPACK translation? * * OK, You have my permission. * * Robert Piessens * </pre> */ public class qags implements java.io.Serializable { public int[] iwork = null; public double[] work = null; public int[] neval = new int[1], last = new int[1]; public boolean verbose_errors = false; public void do_qags ( Callback_1d f,double a,double b,double epsabs,double epsrel,double [ ] result,double [ ] abserr, int [ ] ier, int limit ) throws Exception { int lenw = 4*limit; if ( iwork == null || iwork.length != limit ) iwork = new int[ limit ]; if ( work == null || work.length != lenw ) work = new double[ lenw ]; int lvl = 0,l1,l2,l3; ier [ 0 ] = 6; neval[0] = 0; last[0] = 0; result [ 0 ] = 0; abserr [ 0 ] = 0; if ( ! ( limit < 1 || lenw < limit * 4 ) ) { l1 = limit+1; l2 = limit+l1; l3 = limit+l2; double[] alist = new double[ limit ]; double[] blist = new double[ limit ]; double[] rlist = new double[ limit ]; double[] elist = new double[ limit ]; qagse.do_qagse ( f , a , b , epsabs , epsrel , limit , result , abserr , neval , ier , alist , blist , rlist , elist , iwork , last ); System.arraycopy( alist, 0, work, 0, limit ); System.arraycopy( blist, 0, work, limit, limit ); System.arraycopy( rlist, 0, work, 2*limit, limit ); System.arraycopy( elist, 0, work, 3*limit, limit ); lvl = 0; } if ( ier [ 0 ] == 6 ) lvl = 1; if ( ier [ 0 ] != 0 && verbose_errors ) System.err.println ( xerror ( "abnormal return from do_qags" ,ier [ 0 ] ,lvl ) ); return; } public static String xerror ( String message, int errno, int level ) { String level_msg; switch ( level ) { case -1: level_msg = "(one-time warning)"; break; case 0: level_msg = "(warning)"; break; case 1: level_msg = "(recoverable error)"; break; case 2: level_msg = "(fatal error)"; break; default: level_msg = "(unknown level: " +level+ ")"; } return message+ ", error number: " +errno+ " " +level_msg; } public static void main( String[] args ) { double a, b; double epsabs = 1e-6, epsrel = 1e-6; double[] result = new double[1]; double[] abserr = new double[1]; double[] resabs = new double[1]; double[] resasc = new double[1]; a = Double.parseDouble( args[0] ); b = Double.parseDouble( args[1] ); int limit = Integer.parseInt( args[2] ); System.err.println( "a: "+a+" b: "+b+" limit: "+limit ); Callback_1d integrand = new Gaussian_bump(); int[] ier = new int[1]; int lenw = 4*limit; qags q = new qags(); try { q.do_qags( integrand, a, b, epsabs, epsrel, result, abserr, ier, limit ); } catch (Exception e) { e.printStackTrace(); return; } System.err.println( "result: "+result[0] ); System.err.println( "abserr: "+abserr[0] ); System.err.println( "neval: "+q.neval[0] ); System.err.println( "ier: "+ier[0] ); System.err.println( "limit: "+limit+" last: "+q.last[0] ); int i; System.err.print( "iwork: " ); for ( i = 0; i < q.iwork.length; i++ ) System.err.print( q.iwork[i]+" " ); System.err.println(""); System.err.println( "a\tb\tI\terr (from work):" ); for ( i = 0; i < q.last[0]; i++ ) { System.err.println( q.work[i]+"\t"+q.work[limit+i]+"\t"+q.work[2*limit+i]+"\t"+q.work[3*limit+i] ); } } } class Gaussian_bump implements Callback_1d { public double f( double x ) { return Math.exp( -(1/2.0)*x*x )/Math.sqrt( 2*Math.PI ); } }