back up next contents bibliography Listing

Here is a listing of the most important methods used in the JBONE applet; to obtain a complete version of the source code, qualifying users are kindly requested to use the download service.

jbone: /* $Id: jbone.java,v 1.46 2001/01/16 18:35:55 andrej Exp $ */
jbone: 
jbone: import java.util.*;
jbone: import java.text.*;
jbone: import java.awt.*;
jbone: import java.lang.Math;
jbone: import java.applet.Applet;
jbone: 
jbone: 
jbone: 
jbone: /*****************************************************************************
jbone: * Java Bed for ONE dimensional partial differential equations.
jbone: *  
jbone: *  Andre JAUN (jaun@kth.se) and Johan HEDIN (johanh@fusion.kth.se)
jbone: *  Royal Institute of Technology, SE-100 44 Stockholm.
jbone: *  Copyright 1998-2004. All Rights Reserved.
jbone: *  @version 4.2 (CVS/RCS $Revision: 1.47 $)
jbone: *  Educational software distributed by www.lifelong-learners.com.
jbone: *  
jbone: *  This shareware can be obtained by e-mail from the authors.
jbone: *  Permission to use, copy, and modify the source and its documentation 
jbone: *  for your own personal use is hereby granted provided that this copyright 
jbone: *  notice appears in all copies. The authors makes no representations or 
jbone: *  warranties about the suitability of the software, either express or 
jbone: *  implied, including but not limited to the implied warranties of 
jbone: *  merchantability, fitness for a particular purpose, or non-infringement. 
jbone: *  The authors shall not be liable for any damages suffered by licensee 
jbone: *  as a result of using or modifying this software or its derivatives.
jbone: ******************************************************************************/
jbone: public class jbone extends Applet implements RunDataNotable, Runnable {
jbone: 
jbone:   // Constant for the different PDEs, inital condition, methods and schemes
jbone: 
jbone:   
jbone:   /** The advection diffusion equation */
jbone:   final static String ADVECTION = "Advection";
jbone:   /** The wave equation */
jbone:   final static String WAVE = "Wave";
jbone:   /** The Burger equation for shock waves */
jbone:   final static String BURGER = "Burger (shock)";
jbone:   /** The Korteweg-De Vrie's equation for solitons */
jbone:   final static String KDV = "KdV (solitons)";
jbone:   /** The Schroedinger equation in quantum mechanics */
jbone:   final static String SCHROED = "Schroedinger";
jbone:   /** The Black-Scholes equation for option pricing */
jbone:   final static String BSCHOLES = "Black-Scholes";
jbone:   /** Student equation 1 */
jbone:   final static String MY_PDE_1 = "My project  1";
jbone:   /** Student equation 2 */
jbone:   final static String MY_PDE_2 = "My project  2";
jbone:   /** Solution of the exercises */
jbone:   final static String EXERCISE = "Exercise";
jbone:   /** Vector of the names of the PDE types @see Solution */
jbone:   final static String[] pdeNames = {ADVECTION, WAVE, BURGER, KDV, SCHROED,
jbone:                                      BSCHOLES, MY_PDE_1, MY_PDE_2, EXERCISE };
jbone:   /** GUI list of all the pdes */
jbone:   private MyChoice pdeSelection;
jbone: 
jbone:   
jbone:   /** Solve with finite differances */
jbone:   final static String FD =  "Finite differences";
jbone:   /** Solve with finite elements method */
jbone:   final static String FEM = "Finite elements";
jbone:   /** Solve with Fourier transformations */
jbone:   final static String FFT = "Fourier transform";
jbone:   /** Solve with Lagrangian scheme */
jbone:   final static String CHA = "Lagrangian methods";
jbone:   /** Solve with particle methods */
jbone:   final static String PPP = "Particle methods";
jbone:   /** Solve with particle methods */
jbone:   final static String PPPS= "Particle methods*";
jbone:   /** Solve with sampling methods */
jbone:   final static String SMP = "Sampling methods";
jbone:   /** Solve with sampling methods */
jbone:   final static String SMPS= "Sampling methods*";
jbone:   /** Vector of the names of all the solvers @see Solution */
jbone:   static String[] methodNames  = {FD, FEM, FFT, CHA, PPP, PPPS, SMP, SMPS};
jbone:   /** GUI list of all the methods */
jbone:   private MyChoice methodSelection;
jbone: 
jbone:   
jbone:   /** Solve with Standard scheme */
jbone:   final static String DEFAULT = "Standard scheme";
jbone:   /** Solve with Explicit 2-level */
jbone:   final static String EXP2LVL = "Explicit 2-level";
jbone:   /** Solve with Explicit 3-level */
jbone:   final static String EXP3LVL = "Explicit 3-level";
jbone:   /** Solve with Implicit 2-level */
jbone:   final static String IMP2LVL = "Implicit 2-level";
jbone:   /** Solve with Expl-LaxWendroff */
jbone:   final static String EXPLAX = "Expl-LaxWendroff";
jbone:   /** Solve with Impl-LaxWendroff */
jbone:   final static String IMPLAX = "Impl-LaxWendroff";
jbone:   /** Solve with Lax-Friedrichs */
jbone:   final static String LAXFRIED = "Lax-Friedrichs";
jbone:   /** Solve with Leap-frog (FDTD) */
jbone:   final static String LPFROG = "Leap-frog (FDTD)";
jbone:   /** FDTD with out-going and perfectly matched layer BC */
jbone:   final static String FDTDABS = "FDTD <out--pml>";
jbone:   /** European put without normalizing */
jbone:   final static String EUNAIVE = "European naive";
jbone:   /** European put in normalized variables */
jbone:   final static String EUPUT = "European vanilla";
jbone:   /** American put without normalizing */
jbone:   final static String AMNAIVE = "American naive";
jbone:   /** American put in normalized variables */
jbone:   final static String AMPUT = "American vanilla";
jbone:   /** Solve with Tunable Integration */
jbone:   final static String TUNFEM = "Tune Integration";
jbone:   /** Solve with Expanded  convolution */
jbone:   final static String EXPAND = "Expanded convol.";
jbone:   /** Solve with Aliased convolution */
jbone:   final static String ALIASED = "Aliased convol.";
jbone:   /** Solve with CubicHermite FEM */
jbone:   final static String CUBFEM = "CubicHermite FEM";
jbone:   /** Solve with Cubic -- Splines */
jbone:   final static String CUBSPL = "Cubic---Splines";
jbone:   /** Solve with Monte-Carlo using a normally distributed random walkers */
jbone:   final static String MCNORM =  "MC norm. walk";
jbone:   /** Solve with Monte-Carlo using log-normally distributed random walkers */
jbone:   final static String MCLOGN =  "MC log-normal";
jbone:   /** Solve by sampling with a tree */
jbone:   final static String TREE2 = "Binomial tree";
jbone:   /** Solve with My scheme */
jbone:   final static String MY_SCHEME = "My scheme";
jbone:   /** Solve with My scheme 2 */
jbone:   final static String MY_SCHEME_2 = "My scheme 2";
jbone:   /** Solution of exercise 1.01 */ final static String EXC1_01="Exercise 1.01";
jbone:   /** Solution of exercise 1.02 */ final static String EXC1_02="Exercise 1.02";
jbone:   /** Solution of exercise 1.03 */ final static String EXC1_03="Exercise 1.03";
jbone:   /** Solution of exercise 1.04 */ final static String EXC1_04="Exercise 1.04";
jbone:   /** Solution of exercise 1.05 */ final static String EXC1_05="Exercise 1.05";
jbone:   /** Solution of exercise 1.06 */ final static String EXC1_06="Exercise 1.06";
jbone:   /** Solution of exercise 1.07 */ final static String EXC1_07="Exercise 1.07";
jbone:   /** Solution of exercise 1.08 */ final static String EXC1_08="Exercise 1.08";
jbone:   /** Solution of exercise 1.09 */ final static String EXC1_09="Exercise 1.09";
jbone:   /** Solution of exercise 1.10 */ final static String EXC1_10="Exercise 1.10";
jbone:   /** Solution of exercise 2.01 */ final static String EXC2_01="Exercise 2.01";
jbone:   /** Solution of exercise 2.02 */ final static String EXC2_02="Exercise 2.02";
jbone:   /** Solution of exercise 2.03 */ final static String EXC2_03="Exercise 2.03";
jbone:   /** Solution of exercise 2.04 */ final static String EXC2_04="Exercise 2.04";
jbone:   /** Solution of exercise 2.05 */ final static String EXC2_05="Exercise 2.05";
jbone:   /** Solution of exercise 2.06 */ final static String EXC2_06="Exercise 2.06";
jbone:   /** Solution of exercise 2.07 */ final static String EXC2_07="Exercise 2.07";
jbone:   /** Solution of exercise 2.08 */ final static String EXC2_08="Exercise 2.08";
jbone:   /** Solution of exercise 2.09 */ final static String EXC2_09="Exercise 2.09";
jbone:   /** Solution of exercise 2.10 */ final static String EXC2_10="Exercise 2.10";
jbone:   /** Solution of exercise 3.01 */ final static String EXC3_01="Exercise 3.01";
jbone:   /** Solution of exercise 3.02 */ final static String EXC3_02="Exercise 3.02";
jbone:   /** Solution of exercise 3.03 */ final static String EXC3_03="Exercise 3.03";
jbone:   /** Solution of exercise 3.04 */ final static String EXC3_04="Exercise 3.04";
jbone:   /** Solution of exercise 3.05 */ final static String EXC3_05="Exercise 3.05";
jbone:   /** Solution of exercise 3.06 */ final static String EXC3_06="Exercise 3.06";
jbone:   /** Solution of exercise 3.07 */ final static String EXC3_07="Exercise 3.07";
jbone:   /** Solution of exercise 3.08 */ final static String EXC3_08="Exercise 3.08";
jbone:   /** Solution of exercise 3.09 */ final static String EXC3_09="Exercise 3.09";
jbone:   /** Solution of exercise 3.10 */ final static String EXC3_10="Exercise 3.10";
jbone:   /** Solution of exercise 4.01 */ final static String EXC4_01="Exercise 4.01";
jbone:   /** Solution of exercise 4.02 */ final static String EXC4_02="Exercise 4.02";
jbone:   /** Solution of exercise 4.03 */ final static String EXC4_03="Exercise 4.03";
jbone:   /** Solution of exercise 4.04 */ final static String EXC4_04="Exercise 4.04";
jbone:   /** Solution of exercise 4.05 */ final static String EXC4_05="Exercise 4.05";
jbone:   /** Solution of exercise 4.06 */ final static String EXC4_06="Exercise 4.06";
jbone:   /** Solution of exercise 4.07 */ final static String EXC4_07="Exercise 4.07";
jbone:   /** Solution of exercise 4.08 */ final static String EXC4_08="Exercise 4.08";
jbone:   /** Solution of exercise 4.09 */ final static String EXC4_09="Exercise 4.09";
jbone:   /** Solution of exercise 4.10 */ final static String EXC4_10="Exercise 4.10";
jbone:   /** Solution of exercise 5.01 */ final static String EXC5_01="Exercise 5.01";
jbone:   /** Solution of exercise 5.02 */ final static String EXC5_02="Exercise 5.02";
jbone:   /** Solution of exercise 5.03 */ final static String EXC5_03="Exercise 5.03";
jbone:   /** Solution of exercise 5.04 */ final static String EXC5_04="Exercise 5.04";
jbone:   /** Solution of exercise 5.05 */ final static String EXC5_05="Exercise 5.05";
jbone:   /** Solution of exercise 5.06 */ final static String EXC5_06="Exercise 5.06";
jbone:   /** Solution of exercise 5.07 */ final static String EXC5_07="Exercise 5.07";
jbone:   /** Solution of exercise 5.08 */ final static String EXC5_08="Exercise 5.08";
jbone:   /** Solution of exercise 5.09 */ final static String EXC5_09="Exercise 5.09";
jbone:   /** Solution of exercise 5.10 */ final static String EXC5_10="Exercise 5.10";
jbone:   /** Solution of exercise 6.01 */ final static String EXC6_01="Exercise 6.01";
jbone:   /** Solution of exercise 6.02 */ final static String EXC6_02="Exercise 6.02";
jbone:   /** Solution of exercise 6.03 */ final static String EXC6_03="Exercise 6.03";
jbone:   /** Solution of exercise 6.04 */ final static String EXC6_04="Exercise 6.04";
jbone:   /** Solution of exercise 6.05 */ final static String EXC6_05="Exercise 6.05";
jbone:   /** Solution of exercise 6.06 */ final static String EXC6_06="Exercise 6.06";
jbone:   /** Solution of exercise 6.07 */ final static String EXC6_07="Exercise 6.07";
jbone:   /** Solution of exercise 6.08 */ final static String EXC6_08="Exercise 6.08";
jbone:   /** Solution of exercise 6.09 */ final static String EXC6_09="Exercise 6.09";
jbone:   /** Solution of exercise 6.10 */ final static String EXC6_10="Exercise 6.10";
jbone:   /** Solution of exercise 7.01 */ final static String EXC7_01="Exercise 7.01";
jbone:   /** Solution of exercise 7.02 */ final static String EXC7_02="Exercise 7.02";
jbone:   /** Solution of exercise 7.03 */ final static String EXC7_03="Exercise 7.03";
jbone:   /** Solution of exercise 7.04 */ final static String EXC7_04="Exercise 7.04";
jbone:   /** Solution of exercise 7.05 */ final static String EXC7_05="Exercise 7.05";
jbone:   /** Solution of exercise 7.06 */ final static String EXC7_06="Exercise 7.06";
jbone:   /** Solution of exercise 7.07 */ final static String EXC7_07="Exercise 7.07";
jbone:   /** Solution of exercise 7.08 */ final static String EXC7_08="Exercise 7.08";
jbone:   /** Solution of exercise 7.09 */ final static String EXC7_09="Exercise 7.09";
jbone:   /** Solution of exercise 7.10 */ final static String EXC7_10="Exercise 7.10";
jbone:   /** Solution of exercise A.01 */ final static String EXCA_01="Exercise A.01";
jbone:   /** Solution of exercise B.01 */ final static String EXCB_01="Exercise B.01";
jbone:   /** Solution of exercise C.01 */ final static String EXCC_01="Exercise C.01";
jbone:   /** Solution of exercise D.01 */ final static String EXCD_01="Exercise D.01";
jbone:   /** Solution of exercise E.01 */ final static String EXCE_01="Exercise E.01";
jbone:   /** Solution of exercise F.01 */ final static String EXCF_01="Exercise F.01";
jbone:   /** Vector of the names of all the schemes @see Solution */
jbone:   final static String[] schemeNames = 
jbone:      {DEFAULT, EXP2LVL, EXP3LVL, IMP2LVL, EXPLAX,  IMPLAX,  LAXFRIED,
jbone:       LPFROG,  FDTDABS, TUNFEM,  EXPAND,  ALIASED, CUBFEM,  CUBSPL,  
jbone:       EUNAIVE, AMNAIVE, EUPUT,   AMPUT,   
jbone:       MCNORM,  MCLOGN,  TREE2,   MY_SCHEME,  MY_SCHEME_2,
jbone:       EXC1_01, EXC1_02, EXC1_03, EXC1_04, EXC1_05,
jbone:       EXC1_06, EXC1_07, EXC1_08, EXC1_09, EXC1_10,
jbone:       EXC2_01, EXC2_02, EXC2_03, EXC2_04, EXC2_05,
jbone:       EXC2_06, EXC2_07, EXC2_08, EXC2_09, EXC2_10,
jbone:       EXC3_01, EXC3_02, EXC3_03, EXC3_04, EXC3_05,
jbone:       EXC3_06, EXC3_07, EXC3_08, EXC3_09, EXC3_10,
jbone:       EXC4_01, EXC4_02, EXC4_03, EXC4_04, EXC4_05,
jbone:       EXC4_06, EXC4_07, EXC4_08, EXC4_09, EXC4_10,
jbone:       EXC5_01, EXC5_02, EXC5_03, EXC5_04, EXC5_05,
jbone:       EXC5_06, EXC5_07, EXC5_08, EXC5_09, EXC5_10,
jbone:       EXC6_01, EXC6_02, EXC6_03, EXC6_04, EXC6_05,
jbone:       EXC6_06, EXC6_07, EXC6_08, EXC6_09, EXC6_10,
jbone:       EXC7_01, EXC7_02, EXC7_03, EXC7_04, EXC7_05,
jbone:       EXC7_06, EXC7_07, EXC7_08, EXC7_09, EXC7_10
jbone:   };
jbone:   /** GUI list of all the schemes */
jbone:   private MyChoice schemeSelection;
jbone: 
jbone: 
jbone:   
jbone:   /** A box as initial condition */
jbone:   final static String BOX = "Box";
jbone:   /** A gaussian as initial condition */
jbone:   final static String GAUSSIAN = "Gaussian";
jbone:   /** A cosinus as initial condition */
jbone:   final static String COSINUS = "Cosine";
jbone:   /** A soliton as initial condition */
jbone:   final static String SOLITON = "Soliton";
jbone:   /** A wave-packet as initial condition */
jbone:   final static String WAVEPACKET = "WavePacket";
jbone:   /** A stockmarket option as initial condition */
jbone:   final static String OPTION = "PutOption";
jbone:   /** Vector of the names of allowed initial conditions @see ShapeFunction */
jbone:   final static String[] icNames = {BOX, GAUSSIAN, COSINUS, SOLITON,
jbone:              WAVEPACKET, OPTION};
jbone:   /** GUI list of all the ICs */
jbone:   private MyChoice icSelection;
jbone: 
jbone:   /** Operate edit mode with TAG parameters displayed by default */
jbone:   final static String EDIT = "Double-click below:";
jbone:   /** Operate edit mode with ALL parameters displayed */
jbone:   final static String EDITALL = "Show all parameters";
jbone:   /** Operate a console output of the function values */
jbone:   final static String CONSOLE = "Print data to console  ";
jbone:   /** Vector of the names of all the operations */
jbone:   static String[] operNames  = {EDIT, EDITALL, CONSOLE};
jbone:   /** GUI list of all the operations */
jbone:   private MyChoice operSelection;
jbone: 
jbone:   /** The plot area */
jbone:   private PlotArea plotArea;
jbone:   /** The run parameters */
jbone:   private RunData runData;
jbone:   /** Text on the Start/Stop button */
jbone:   private final String startName = "Start/Stop";
jbone:   /** Text on the Step 1 button */
jbone:   private final String step1Name = "Step 1";
jbone:   /** Text on the Step 10 button */
jbone:   private final String step10Name = "Step 10";
jbone:   /** Text on the toggle display button */
jbone:   private final String displayName = "Toggle Display";
jbone:   /** Text on the initialize button */
jbone:   private final String initializeName = "Initialize";
jbone: 
jbone:   /** Whether the simulation is running */
jbone:   private boolean frozen = true;
jbone:   /** Current step number */
jbone:   private int step = 0;
jbone:   /** Operate nsteps before stopping */
jbone:   private int nstep = -1;
jbone:   /** Milliseconds between plots */
jbone:   private int delay = 84;
jbone:   /** Thread label */
jbone:   Thread runThread;
jbone:   /** Potentially reset by main */
jbone:   private boolean isAnApplet = true;
jbone: 
jbone:   /** The solution */
jbone:   private Solution solution;
jbone:   /** The physical data */
jbone:   private PhysData physData;
jbone: 
jbone: 
jbone:   /** Information
jbone:   ****************************************************************************/
jbone:   public String getAppletInfo() {
jbone:     return "JBONE 4.0 -- an educational software (C) 1997-2004 A.Jaun,J.Hedin";
jbone:   }
jbone: 
jbone: 
jbone:   /** Master initialization and layout 
jbone:   ****************************************************************************/
jbone:   public void init() {
jbone:     pdeSelection = new MyChoice(pdeNames);
jbone:     methodSelection = new MyChoice(methodNames);
jbone:     schemeSelection = new MyChoice(schemeNames);
jbone:     icSelection = new MyChoice(icNames);
jbone:     operSelection = new MyChoice(operNames);
jbone:     runData = new RunData(this);
jbone: 
jbone:     if (isAnApplet) tagModify();
jbone:     createWindow();  createPhysics();
jbone:     createSolution();
jbone:     setInitialCondition(solution, null, false);
jbone:   } // init
jbone: 
jbone:   /** Instanciate a GUI window
jbone:       @see Solution
jbone:   ***************************************************************************/
jbone:   private void createWindow(){
jbone:     // First the layout
jbone:     GridBagLayout gb = new GridBagLayout();
jbone:     GridBagConstraints c = new GridBagConstraints();
jbone:     
jbone:     this.setBackground(new Color(Integer.parseInt("88FFFF",16)));
jbone:     setFont(new Font("Courier", Font.PLAIN, 12));
jbone:     setLayout(gb);
jbone: 
jbone:     // Prepare for top row of buttons
jbone:     c.gridwidth = 1;
jbone:     c.gridheight = 1;
jbone:     c.weightx = 1;
jbone:     c.fill = GridBagConstraints.HORIZONTAL;
jbone: 
jbone:     // Engage
jbone:     gbAdd(gb, c, methodSelection);
jbone:     gbAdd(gb, c, schemeSelection);
jbone:     gbAdd(gb, c, icSelection);
jbone:     gbAdd(gb, c, pdeSelection);
jbone:     c.gridwidth = GridBagConstraints.REMAINDER; //end of row
jbone:     gbAdd(gb, c, operSelection);
jbone: 
jbone:     // Mr Data, take us to the next row please
jbone:     c.gridwidth = GridBagConstraints.RELATIVE;
jbone:     c.gridheight = 1;
jbone:     c.gridwidth = 4;
jbone:     c.weightx = 0;
jbone:     c.weighty = 1;
jbone:     c.fill = GridBagConstraints.BOTH;
jbone:     plotArea = new PlotArea();
jbone:     gbAdd(gb, c, plotArea);
jbone:     c.gridwidth = GridBagConstraints.REMAINDER; //end of row
jbone:     
jbone:     gbAdd(gb, c, runData);
jbone: 
jbone:     // Finally the last row
jbone:     c.gridwidth = 1;
jbone:     c.weighty = 0;
jbone:     c.fill = GridBagConstraints.HORIZONTAL;
jbone:     gbAdd(gb, c, new Button(startName));
jbone:     gbAdd(gb, c, new Button(step1Name));
jbone:     gbAdd(gb, c, new Button(step10Name));
jbone:     gbAdd(gb, c, new Button(displayName));
jbone:     c.gridwidth = GridBagConstraints.REMAINDER; //end of row
jbone:     gbAdd(gb, c, new Button(initializeName));
jbone: 
jbone:   } // createWindow
jbone: 
jbone: 
jbone:   /** Helper method for adding objects to a GridBagLayout
jbone:       @param gb The layout
jbone:       @param c The constraints
jbone:       @param item The object to add
jbone:   */
jbone:   private void gbAdd(GridBagLayout gb, GridBagConstraints c, Component item){
jbone:     gb.setConstraints(item, c);
jbone:     add(item);
jbone:   } // gbAdd
jbone: 
jbone: 
jbone:   /** Instanciate the physical data (such as potential) from the parameters.
jbone:       @see Solution
jbone:       @return A new set of physical parameters
jbone:   ***************************************************************************/
jbone:   private void createPhysics(){
jbone:       physData = new PhysData(runData);
jbone:   } // createPhysics
jbone: 
jbone:   /** Instanciate a solution and select the method and scheme for computations
jbone:       @see Solution
jbone:       @return A new Solution
jbone:   ***************************************************************************/
jbone:   private void createSolution(){
jbone:     runData.createMesh();
jbone:     if(methodSelection.getSelectedItem().equals(FD)) {
jbone:       solution = new FDSolution(runData);
jbone:     } else if(methodSelection.getSelectedItem().equals(FEM)){
jbone:       solution = new FEMSolution(runData);
jbone:     } else if(methodSelection.getSelectedItem().equals(FFT)){
jbone:       solution = new FFTSolution(runData);
jbone:     } else if(methodSelection.getSelectedItem().equals(CHA)){
jbone:       solution = new CHASolution(runData);
jbone:     } else if(methodSelection.getSelectedItem().equals(PPP)){
jbone:       solution = new MCPSolution(runData);
jbone:     } else if(methodSelection.getSelectedItem().equals(PPPS)){
jbone:       solution = new MCPDrawSolution(runData);
jbone:     } else if(methodSelection.getSelectedItem().equals(SMP)){
jbone:       solution = new MCSSolution(runData);
jbone:     } else if(methodSelection.getSelectedItem().equals(SMPS)){
jbone:       solution = new MCSDrawSolution(runData);
jbone:     } else {
jbone:       /**  throw new MethodException("Can't find method"
jbone:  + methodSelection.getSelectedItem());  */
jbone:     } // if
jbone: 
jbone:     String ch;                        //Synchronize the choices is delicate
jbone:     pdeSelection.sync(solution);
jbone:     ch=pdeSelection.getSelectedItem();
jbone:     if(ch==null)  System.out.println("ERROR in jbone: pdeSelection ="+ch);
jbone:     solution.setPde(ch);
jbone:     ch=methodSelection.getSelectedItem();
jbone:     if(ch==null)  System.out.println("ERROR in jbone: methodSelection ="+ch);
jbone:     solution.setMethod(ch);
jbone:     schemeSelection.sync(solution);
jbone:     ch=schemeSelection.getSelectedItem();
jbone:     if(ch==null)  System.out.println("ERROR in jbone: schemeSelection ="+ch);
jbone:     solution.setScheme(ch);
jbone:     plotArea.setSolution(solution);
jbone:   } // createSolution
jbone: 
jbone:   /** Set the initial condition according to the runData parameters.
jbone:       @param inSolution The solution to modify
jbone:       @param oldSolution obtained previously with another method, scheme
jbone:       @param keepFunction Whether to keep the old function
jbone:       @see Solution
jbone:   ****************************************************************************/
jbone:   private void setInitialCondition(Solution inSolution,
jbone:                                    ShapeFunction oldSolution,
jbone:            boolean keepFunction){
jbone:     if(keepFunction){
jbone:       try{
jbone:       inSolution.discretize(oldSolution);
jbone:       } catch (NullPointerException e){ //Not nice, occurs only at startup
jbone:       } // try
jbone:     } else {
jbone:       step = 0;
jbone:       double amp = runData.getParamValue(runData.icAmplitudeNm);
jbone:       double pos = runData.getParamValue(runData.icPositionNm);
jbone:       double wid = runData.getParamValue(runData.icWidthNm);
jbone:       double wln = runData.getParamValue(runData.icWavelengthNm);
jbone:       if(icSelection.getSelectedItem().equals(BOX)){
jbone:           inSolution.discretize(new ShapeBox(amp,pos,wid));
jbone:       } else if(icSelection.getSelectedItem().equals(GAUSSIAN)){
jbone:  inSolution.discretize(new ShapeGaussian(amp,pos,wid));
jbone:       } else if(icSelection.getSelectedItem().equals(COSINUS)){
jbone:  inSolution.discretize(new ShapeCosinus(amp,pos,wln));
jbone:       } else if(icSelection.getSelectedItem().equals(SOLITON)){
jbone:  inSolution.discretize(new ShapeSoliton(amp,pos,wid));
jbone:       } else if(icSelection.getSelectedItem().equals(WAVEPACKET)){
jbone:  inSolution.discretize(new ShapeWavePacket(amp,pos,wid,wln));
jbone:       } else if(icSelection.getSelectedItem().equals(OPTION)){
jbone:  inSolution.discretize(new ShapeOption(amp,pos,wid));
jbone:       } else {
jbone:           /**  throw new ShapeException("Can't find shape"
jbone:           + icSelection.getSelectedItem()); */
jbone:       } // if
jbone:     } // if
jbone: //  solution.setIC(icSelection.getSelectedItem());
jbone:     solution.setTime(0);
jbone:     solution.rescale();
jbone:     solution.previous(runData,physData);
jbone:     solution.updateHeaders(runData, step);
jbone:     plotArea.repaint();
jbone:   } // setInitialCondition
jbone: 
jbone:   /** Modify defaults parameters the HTML tags from the web page
jbone:       The new method introduced with V4.0 is no longuer backwards 
jbone:       compatible with the initial jbone V1.0 input parameters.
jbone:   ****************************************************************************/
jbone:   public void tagModify() {
jbone:     String tmp;
jbone:     if((tmp = getParameter("pde")) != null)    pdeSelection.select(tmp);
jbone:     if((tmp = getParameter("ic")) != null)     icSelection.select(tmp);
jbone:     if((tmp = getParameter("method")) != null) methodSelection.select(tmp);
jbone:     if((tmp = getParameter("scheme")) != null) schemeSelection.select(tmp);
jbone:     runData.tagModify(this);
jbone:   } // tagModify
jbone: 
jbone:   /**  Parameter info
jbone:   ****************************************************************************/
jbone:   public String[][] getParameterInfo() {
jbone:     String[][] info = {
jbone:       {"method", "name", "The name of the method"},
jbone:       {"scheme", "name", "The name of the scheme"},
jbone:       {"ic", "name", "The name of the initial condition"},
jbone:       {"pde", "name", "The name of the PDE"},
jbone:       {"Velocity", "double", "The advection velocity"},
jbone:       {"Diffusion", "double", "The diffusion coefficient"},
jbone:       {"Dispersion", "double", "The dispersion coefficient"},
jbone:       {"TimeStep", "double", "The time step"},
jbone:       {"MeshPoints", "int", "The number of mesh points"},
jbone:       {"Walkers", "int", "The number of random walkers"},
jbone:       {"TimeImplicit", "double", "Implicity parameter in time"},
jbone:       {"TuneIntegr", "double", "Tunable integration parameter"},
jbone:       {"ICAmplitude", "double", "Initial condition amplitude"},
jbone:       {"ICPosition", "double", "Initial condition position"},
jbone:       {"ICWidth", "double", "Initial condition width"},
jbone:       {"Wavelength", "double", "Initial condition wavelength"},
jbone:       {"RunTime", "double", "Run time"},
jbone:       {"MeshLeft", "double", "Left position of the mesh"},
jbone:       {"MeshLength", "double", "The length of the simulation box"},
jbone:       {"PhysDataCase", "double", "Type of Physics, e.g potential barrier"},
jbone:       {"PhysDataValue", "double", "Value of Physics, e.g. barrier height"}
jbone:     };
jbone:     return info;
jbone:   } // getParameterInfo
jbone: 
jbone:   /** Applet start a new thread
jbone:   ****************************************************************************/
jbone:   public void start() {
jbone:     if (runThread == null) {               //Start a new thread
jbone:       runThread = new Thread(this);
jbone:     }
jbone:     if (frozen) {                          //Wait for an action from the user
jbone:     } else { runThread.start(); }          //... or on with the calculation
jbone:   }
jbone: 
jbone:   /** Applet stop
jbone:   ****************************************************************************/
jbone:   public void stop() {
jbone:     runThread = null;
jbone:     frozen    = true;
jbone:    }
jbone: 
jbone:   /** Contains the main loop for the time stepping. 
jbone:       @see ShapeFunction
jbone:       @see Mesh
jbone:       @see Solution
jbone:   ****************************************************************************/
jbone:   public void run() {
jbone:     Thread.currentThread().setPriority(Thread.MIN_PRIORITY);
jbone:     long startTime = System.currentTimeMillis();
jbone:     Thread currentThread = Thread.currentThread();
jbone:     double runTime  = runData.getParamValue(runData.runTimeNm);
jbone:     double timeStep = runData.getParamValue(runData.timeStepNm);
jbone: 
jbone:     while (currentThread == runThread && !frozen &&
jbone:            ( solution.getTime() < runTime && nstep < 0 ||
jbone:            nstep > 0 ) ) {
jbone:       step++; nstep--;                               //One step forward in time
jbone:       physData.update(step*timeStep);
jbone:       solution.setTime(step*timeStep);
jbone:       solution.updateHeaders(runData, step);
jbone:       solution.next(runData, physData);
jbone:       
jbone:       if(operSelection.getSelectedItem().equals(CONSOLE))
jbone:         solution.output(step);                       //Output in ASCII
jbone:       plotArea.repaint();                            //Update graphics
jbone: 
jbone:       try { startTime += delay;                      //Delay according to lag
jbone:       Thread.sleep(Math.max(30, startTime-System.currentTimeMillis()));
jbone:       } catch (InterruptedException e) { break; }
jbone:     } // while
jbone:     frozen=true;
jbone:   } // run
jbone: 
jbone:   /** A new mesh is created by RunData
jbone:       @see RunData
jbone:   ****************************************************************************/
jbone:   public void runDataNotifyMesh(){
jbone:     createPhysics(); createSolution();
jbone:     setInitialCondition(solution, null, false);
jbone:   } // runDataNotifyMesh
jbone: 
jbone:   /** The number of particles is changed by RunData
jbone:       @see RunData
jbone:   ****************************************************************************/
jbone:   public void runDataNotifyWalkers(){
jbone:     createPhysics();
jbone:     createSolution();
jbone:     if(methodSelection.getSelectedItem().equals(PPP) ||
jbone:        methodSelection.getSelectedItem().equals(PPPS)  ){
jbone:       Solution oldSolution = solution;
jbone:       setInitialCondition(solution,new ShapeNumerical(oldSolution),true);
jbone:     } else
jbone:       setInitialCondition(solution,null,false);
jbone:   } // runDataNotifyWalkers
jbone: 
jbone:   /** Responds to the user actions through the mouse and buttons (Java1.0).
jbone:       Yes, we know this sucks compare to Java 1.1, but we want to be
jbone:       compatible with as many browsers as possible. There is a lot of
jbone:       old stuff out there...
jbone:       @deprecated
jbone:   ****************************************************************************/
jbone:   public boolean action(Event e, Object arg) {
jbone:     if(e.target instanceof Choice){
jbone:       for(int i = 0; i < pdeNames.length; i++)
jbone:  if(((String)arg).equals(pdeNames[i])){
jbone:          solution.setPde(pdeSelection.getSelectedItem());
jbone:          schemeSelection.sync(solution);
jbone:          solution.setScheme(schemeSelection.getSelectedItem());
jbone:          return true;
jbone:  } // if
jbone:       for(int i = 0; i < methodNames.length; i++)
jbone:  if(((String)arg).equals(methodNames[i])){
jbone:          if(methodSelection.getSelectedItem().equals(PPP)||
jbone:              methodSelection.getSelectedItem().equals(PPPS) ){
jbone:            Solution oldSolution = solution;
jbone:            createSolution();
jbone:            solution.setScheme(schemeSelection.getSelectedItem());
jbone:            setInitialCondition(solution,new ShapeNumerical(oldSolution),true);
jbone:           } else if (methodSelection.getSelectedItem().equals(SMP)||
jbone:                      methodSelection.getSelectedItem().equals(SMPS) ) {
jbone:            createSolution();
jbone:            solution.setScheme(schemeSelection.getSelectedItem());
jbone:            setInitialCondition(solution,null,false);
jbone:           } else {
jbone:            Solution oldSolution = solution;
jbone:            createSolution();
jbone:            solution.setScheme(schemeSelection.getSelectedItem());
jbone:            setInitialCondition(solution,new ShapeNumerical(oldSolution),true);
jbone:          } // if
jbone:          return true;
jbone:  } // if
jbone:       for(int i = 0; i < schemeNames.length; i++)
jbone:  if(((String)arg).equals(schemeNames[i])){
jbone:          Solution oldSolution = solution;
jbone:          solution.setScheme(schemeSelection.getSelectedItem());
jbone:          setInitialCondition(solution,new ShapeNumerical(oldSolution),true);
jbone:          return true;
jbone:  } // if
jbone:       for(int i = 0; i < icNames.length; i++)
jbone:  if(((String)arg).equals(icNames[i])){
jbone:          setInitialCondition(solution, null, false);
jbone:          return true;
jbone:  } // if
jbone:       if (EDIT.equals(operSelection.getSelectedItem()))
jbone:          runData.displayTag(this);
jbone:       if (EDITALL.equals(operSelection.getSelectedItem()))
jbone:          runData.displayAll();
jbone:     } // if
jbone:     if(e.target instanceof Button) {
jbone:       boolean ret = false;
jbone:  if(((String)arg).equals(startName)) {
jbone:          frozen = !frozen;
jbone:          nstep = -1;
jbone:          ret = true;
jbone:  } else if(((String)arg).equals(step1Name)) {
jbone:          frozen = false;
jbone:          nstep = 1;
jbone:          ret = true;
jbone:  } else if(((String)arg).equals(step10Name)) {
jbone:          frozen = false;
jbone:          nstep = 10;
jbone:          ret = true;
jbone:  } else if(((String)arg).equals(displayName)) {
jbone:          plotArea.toggleHeaders();
jbone:          solution.rescale();
jbone:          plotArea.repaint();
jbone:          ret = true;
jbone:  } else if(((String)arg).equals(initializeName)) {
jbone:          frozen = true;
jbone:           runData.createMesh();
jbone:           createSolution();
jbone:          setInitialCondition(solution, null, false);
jbone:          step = 0;
jbone:          nstep = -1;
jbone:          ret = true;
jbone:  } // if
jbone:  if(ret) {
jbone:          runThread = null;
jbone:          start();
jbone:  } // if
jbone:  return ret;
jbone:     } // if
jbone:     return false;
jbone:   } // action
jbone:  
jbone:   /** Destroy application
jbone:       @deprecated
jbone:   ****************************************************************************/
jbone:   public boolean handleEvent(Event e) {                               //Java1.0
jbone:     if (e.id == Event.WINDOW_DESTROY) { System.exit(0); }
jbone:     return super.handleEvent(e);
jbone:   }
jbone: 
jbone:   /** Print mouse coordinates to console
jbone:       @deprecated
jbone:   ****************************************************************************/
jbone:   //Java1.0:  public boolean mouseXXX(Event e, int x, int y)
jbone:   //Java1.0:                 with XXX={Up, Down, Drag, Enter, Exit}
jbone:   public boolean mouseDown(Event e, int x, int y) {                   //Java1.0
jbone:     double[] coord = solution.measure(x,y);
jbone:     double timeStep = runData.getParamValue(runData.timeStepNm);
jbone:    
jbone:     if (isAnApplet)
jbone:       showStatus("Clicked coord ("+coord[0]+" ; "+coord[1]+")");
jbone:     System.out.println("step="+step+
jbone:                        "  time="+(step*timeStep)+
jbone:                        "  coord=("+coord[0]+" ; "+coord[1]+")");
jbone:     return true;
jbone:   }
jbone: 
jbone:   /** Method to start the Applet as an application
jbone:       @param args Not used
jbone:   ****************************************************************************/
jbone:   public static void main(String[] args) {
jbone:     Frame f = new Frame("jbone");
jbone:     jbone jBone = new jbone();
jbone:     jBone.isAnApplet = false;
jbone:     jBone.init();
jbone:     f.add("Center", jBone);
jbone:     f.pack();
jbone:     f.show();
jbone:   } // main
jbone: 
jbone: } // jbone
BandMatrix: /* $Id: BandMatrix.java,v 1.9 2000/05/26 11:48:23 andrej Exp $ */
BandMatrix: 
BandMatrix: /***************************************************************************
BandMatrix:  * BandMatrix - Linear algebra package for band matrices
BandMatrix:  ***************************************************************************/
BandMatrix: public class BandMatrix {
BandMatrix:   double[][] m;                      //Matrix
BandMatrix:   double[]   d;                      //Temporary storage for diagonal
BandMatrix:   double     det;
BandMatrix:   int        diagos, lines, n;
BandMatrix:   boolean    isDecomposed = false;
BandMatrix:   int l=0;                           //Band indices (left, center, right)
BandMatrix:   int c=1;
BandMatrix:   int r=2;
BandMatrix: 
BandMatrix:   /** Constructor */
BandMatrix:   public BandMatrix(int diagos, int lines) {
BandMatrix:     m = new double[diagos][lines];
BandMatrix:     this.diagos  =diagos;
BandMatrix:     this.lines   =lines;
BandMatrix:     this.n       =lines-1;
BandMatrix:   }
BandMatrix:     
BandMatrix:   /** Store matrix elements */
BandMatrix:   public void set(int i, int j, double v) { m[j][i]=v; }
BandMatrix:   public void setL(int i, double v)       { m[l][i]=v; }
BandMatrix:   public void setD(int i, double v)       { m[c][i]=v; }
BandMatrix:   public void setR(int i, double v)       { m[r][i]=v; }
BandMatrix: 
BandMatrix:   /** Retrieve value of matrix elements */
BandMatrix:   public double get(int j, int i) { return m[j][i]; }
BandMatrix:   public double getL(int i)       { return m[l][i]; }
BandMatrix:   public double getD(int i)       { return m[c][i]; }
BandMatrix:   public double getR(int i)       { return m[r][i]; }
BandMatrix: 
BandMatrix:   /** Matrix times vector */
BandMatrix:   public double[] dot(double[] v) {
BandMatrix:     double[] res = new double[lines];
BandMatrix:     int hw=(diagos-1)/2;
BandMatrix:     for (int i=0; i<=n; i++) {
BandMatrix:       for (int j=Math.max(0,hw-i); j<=Math.min(2,hw+n-i); j++) { 
BandMatrix:         res[i]=res[i]+m[j][i]*v[i+j-1];
BandMatrix:       }
BandMatrix:     }
BandMatrix:     return res;
BandMatrix:   }
BandMatrix:                                                           
BandMatrix:   /** Direct LU solver for 3-banded matrix with multiple RHS and BC
BandMatrix:       The matrix is decomposed once only for the first rhs vector
BandMatrix:       Periodic boundary conditions are taken care of by the upper-left
BandMatrix:       lower-right most matrix elements
BandMatrix:       @param rhs Right hand side vector
BandMatrix:       @return Solution of the linear system
BandMatrix:   ****************************************************************************/
BandMatrix:   public double[] solve3(double[] rhs) {
BandMatrix:     double[] sol = new double[lines];
BandMatrix:     int i;
BandMatrix: 
BandMatrix:     if (!isDecomposed) {                     //Forward substitution of matrix
BandMatrix:       d = new double[lines];
BandMatrix:       d[0]= m[c][0];
BandMatrix:       m[r][0]= m[r][0]/d[0];
BandMatrix:       m[l][0]=-m[l][0]/d[0];
BandMatrix:       for (i=1; i<n; i++) {
BandMatrix:         d[i]   = m[c][i]-m[l][i]*m[r][i-1];
BandMatrix:         m[r][i]= m[r][i]/d[i];
BandMatrix:         m[c][i]=-m[l][i]/d[i];
BandMatrix:         m[l][i]=-m[l][i]/d[i]*m[l][i-1];
BandMatrix:       }
BandMatrix:       d[n]=m[c][n]+m[l][n]*(m[l][n-1]-m[r][n-1]);
BandMatrix:       m[r][n]= m[r][n]/d[n];
BandMatrix:       m[c][n]=-m[l][n]/d[n];
BandMatrix:         
BandMatrix:       m[l][n-1]=m[l][n-1]-m[r][n-1];        //Backward substitution of matrix
BandMatrix:       for (i=n-2; i>=0; i--) {
BandMatrix:         m[l][i]= m[l][i]-m[r][i]*m[l][i+1];
BandMatrix:       }
BandMatrix:       det = 1.0 + m[r][n]*m[l][0];  
BandMatrix:       isDecomposed=true;
BandMatrix:     }
BandMatrix:       
BandMatrix:     rhs[0]=rhs[0]/d[0];
BandMatrix:     for (i=1; i<=n; i++) {                      //Forward substitution of rhs
BandMatrix:       rhs[i]=rhs[i]/d[i] +m[c][i]*rhs[i-1];
BandMatrix:     }
BandMatrix:     for (i=n-2; i>=0; i--) {                   //Backward substitution of rhs
BandMatrix:       rhs[i]=rhs[i] -m[r][i]*rhs[i+1];
BandMatrix:     }
BandMatrix:       
BandMatrix:     sol[0]=(rhs[0]+m[l][0]*rhs[n])/det;                //Built-in periodicity
BandMatrix:     sol[n]=(rhs[n]-m[r][n]*rhs[0])/det;
BandMatrix:     for (i=1;i<n;i++) {
BandMatrix:       sol[i]=rhs[i]+m[l][i]*sol[n];
BandMatrix:     }
BandMatrix:     return sol;
BandMatrix:   }
BandMatrix: 
BandMatrix:                                                            
BandMatrix:   /** Projected Symmetric Over Relaxation for 3-banded matrix 
BandMatrix:       Periodic boundary conditions are taken care of by the upper-left
BandMatrix:       lower-right most matrix elements
BandMatrix:       @param rhs Right hand side vector
BandMatrix:       @param ini Initial iterate
BandMatrix:       @param min Lower limit for obstacle problems
BandMatrix:       @param max Upper limit for obstacle problems
BandMatrix:       @param precision Relative precision required
BandMatrix:       @param w Relaxation parameter to be chosen within [0;2]
BandMatrix:       @param maxIterations Maximum number of iterations
BandMatrix:       @return Solution of the linear system
BandMatrix:   ****************************************************************************/
BandMatrix:   public double[] ssor3(double[] rhs,double[] ini,double[] min,double[] max, 
BandMatrix:                         double precision,double w,int maxIterations) { 
BandMatrix:     double[] hlf = new double[lines];                  //Half-step
BandMatrix:     double[] sol = new double[lines];                  //Solution
BandMatrix:     boolean converged = false;
BandMatrix:     int iterations = 0;
BandMatrix:     int i;
BandMatrix:     while (!converged && iterations<maxIterations){
BandMatrix: 
BandMatrix:       //Gauss Seidel, forward one half-step
BandMatrix:       hlf[0]=Math.max(min[0],Math.min(max[0],
BandMatrix:              (  w  *(rhs[0]-m[r][0]*ini[1]-m[l][0]*hlf[n])+
BandMatrix:               (1-w)*m[c][0]*ini[0])/m[c][0] ));
BandMatrix:       for(i=1;i<=n-1;i++)
BandMatrix:         hlf[i]=Math.max(min[i],Math.min(max[i],
BandMatrix:                (  w  *(rhs[i]-m[r][i]*ini[i+1]-m[l][i]*hlf[i-1])+
BandMatrix:                 (1-w)*m[c][i]*ini[i])/m[c][i] ));
BandMatrix:       hlf[n]=Math.max(min[n],Math.min(max[n],
BandMatrix:              (  w  *(rhs[n]-m[r][n]*ini[0]-m[l][n]*hlf[n-1])+
BandMatrix:                (1-w)*m[c][n]*ini[n])/m[c][n] ));
BandMatrix:       
BandMatrix:       //Gauss Seidel, backward one half-step
BandMatrix:       sol[n]=Math.max(min[n],Math.min(max[n],
BandMatrix:              (  w  *(rhs[n]-m[l][n]*hlf[n-1]-m[r][n]*sol[0])+
BandMatrix:               (1-w)*m[c][n]*hlf[n])/m[c][n] ));
BandMatrix:       for(i=n-1;i>=1;i--)
BandMatrix:         sol[i]=Math.max(min[i],Math.min(max[i],
BandMatrix:                (  w  *(rhs[i]-m[l][i]*hlf[i-1]-m[r][i]*sol[i+1])+
BandMatrix:                 (1-w)*m[c][i]*hlf[i])/m[c][i] ));
BandMatrix:       sol[0]=Math.max(min[0],Math.min(max[0],
BandMatrix:              (  w  *(rhs[0]-m[l][0]*hlf[n]-m[r][0]*sol[1])+
BandMatrix:               (1-w)*m[c][0]*hlf[0])/m[c][0] ));
BandMatrix:       
BandMatrix:       converged=isEqual(sol,ini,precision);
BandMatrix:       iterations++;
BandMatrix: 
BandMatrix:       //Diagnostic
BandMatrix:       if (false && (iterations<30 || converged) ) {
BandMatrix:         double err=0.;
BandMatrix:         for (i=0;i<=n;i++) {
BandMatrix:           err=Math.max(err,Math.abs(sol[i]-ini[i])); 
BandMatrix:         }
BandMatrix:         System.out.println("PSSOR iteration "+iterations+", max(err)="+err);
BandMatrix:       }
BandMatrix:       for (i=0;i<=n;i++) {ini[i]=sol[i];}
BandMatrix:     }
BandMatrix:     return sol;
BandMatrix:     
BandMatrix:   }//ssor3
BandMatrix: 
BandMatrix: 
BandMatrix:   /** Projected Symmetric Over Relaxation for 3-banded matrix 
BandMatrix:       Periodic boundary conditions are taken care of by the upper-left
BandMatrix:       lower-right most matrix elements
BandMatrix:       @param rhs Right hand side vector
BandMatrix:       @param ini Initial iterate
BandMatrix:       @return Solution of the linear system
BandMatrix:   ****************************************************************************/
BandMatrix:   public double[] ssor3(double[] rhs,double[] ini) { 
BandMatrix:     double precision = Math.pow(10.,-5);        //Default SSOR parameters
BandMatrix:     int maxIterations= 1000;
BandMatrix:     double w = 1.2;
BandMatrix:     double[] min = new double[n+1];             //No projection limits
BandMatrix:     double[] max = new double[n+1];
BandMatrix:     for (int i=0; i<=n; i++) {        
BandMatrix:       min[i]=Double.NEGATIVE_INFINITY;
BandMatrix:       max[i]=Double.POSITIVE_INFINITY;
BandMatrix:     }
BandMatrix:     return ssor3(rhs, ini, min, max, precision, w, maxIterations);
BandMatrix:   }
BandMatrix: 
BandMatrix: 
BandMatrix:                                                           
BandMatrix:   /** Decide whether two vectors are equal to a certain degree of precision
BandMatrix:       @param sol First vector
BandMatrix:       @param ini Second vector
BandMatrix:       @param precision Absolute precision
BandMatrix:       @return true is both vectors are equal
BandMatrix:   ****************************************************************************/
BandMatrix:   public boolean isEqual(double[] sol, double[] ini, double precision) {
BandMatrix:     test: for (int k=0 ; k<=n ; k++){
BandMatrix:       if (Math.abs(sol[k]-ini[k]) >= precision ) 
BandMatrix:         { return false; } else { continue test; }
BandMatrix:     }
BandMatrix:     return true;
BandMatrix:   }//isEqual
BandMatrix: 
BandMatrix: } //End of BandMatrix
BandMatrixC: /* $Id: BandMatrixC.java,v 1.2 2000/05/05 17:32:34 andrej Exp $ */
BandMatrixC: 
BandMatrixC: /***************************************************************************
BandMatrixC:  * BandMatrixC - Linear algebra package for Complex band matrices
BandMatrixC:  ***************************************************************************/
BandMatrixC: public class BandMatrixC {
BandMatrixC:   Complex[][] m;                     //Matrix
BandMatrixC:   Complex[]  d;                      //Temporary storage for diagonal
BandMatrixC:   Complex    det;
BandMatrixC:   int        diagos, lines, n;
BandMatrixC:   boolean    isDecomposed = false;
BandMatrixC:   int l=0;                           //Band indices (left, center, right)
BandMatrixC:   int c=1;
BandMatrixC:   int r=2;
BandMatrixC: 
BandMatrixC:   /** Constructor */
BandMatrixC:   public BandMatrixC(int diagos, int lines) {
BandMatrixC:     m = new Complex[diagos][lines];
BandMatrixC:     this.diagos  =diagos;
BandMatrixC:     this.lines   =lines;
BandMatrixC:     this.n       =lines-1;
BandMatrixC:   }
BandMatrixC:     
BandMatrixC:   /** Store matrix elements */
BandMatrixC:   public void set(int i, int j, Complex v) { m[j][i]=v; }
BandMatrixC:   public void setL(int i, Complex v)       { m[l][i]=v; }
BandMatrixC:   public void setD(int i, Complex v)       { m[c][i]=v; }
BandMatrixC:   public void setR(int i, Complex v)       { m[r][i]=v; }
BandMatrixC: 
BandMatrixC:   /** Retrieve value of matrix elements */
BandMatrixC:   public Complex get(int j, int i) { return m[j][i]; }
BandMatrixC:   public Complex getL(int i)       { return m[l][i]; }
BandMatrixC:   public Complex getD(int i)       { return m[c][i]; }
BandMatrixC:   public Complex getR(int i)       { return m[r][i]; }
BandMatrixC: 
BandMatrixC:   /** Matrix times vector */
BandMatrixC:   public Complex[] dot(Complex[] v) {
BandMatrixC:     Complex[] res = new Complex[this.lines];
BandMatrixC:     Complex z = new Complex();
BandMatrixC:     int hw=(diagos-1)/2;
BandMatrixC:     for (int i=0; i<=n; i++) {
BandMatrixC:       res[i]=new Complex(0.);
BandMatrixC:       for (int j=Math.max(0,hw-i); j<=Math.min(2,hw+n-i); j++) { 
BandMatrixC:  z =m[j][i].mul(v[i+j-1]);
BandMatrixC:  res[i]=res[i].add(z);
BandMatrixC:       }
BandMatrixC:     }
BandMatrixC:     return res;
BandMatrixC:   }
BandMatrixC:                                                        
BandMatrixC:   /** Gaussian elimination for 3-banded matrix with multiple RHS and BC */
BandMatrixC:   public Complex[] solve3(Complex[] rhs) {
BandMatrixC:     Complex[] sol = new Complex[lines];
BandMatrixC:     Complex z1 = new Complex();
BandMatrixC:     Complex z2 = new Complex();
BandMatrixC:     int i;
BandMatrixC:     
BandMatrixC:     if (!isDecomposed) {                     //Forward substitution of matrix
BandMatrixC:       d = new Complex[lines];
BandMatrixC:       d[0]= new Complex(m[c][0]);
BandMatrixC:       m[r][0]= m[r][0].div(d[0]);
BandMatrixC:       m[l][0]=(new Complex(-1.0)).mul(m[l][0].div(d[0]));
BandMatrixC:       
BandMatrixC:       for (i=1; i<n; i++) {
BandMatrixC:         d[i]=new Complex();
BandMatrixC:  z1 = m[l][i].mul(m[r][i-1]);
BandMatrixC:  d[i]=m[c][i].sub(z1);
BandMatrixC:  m[r][i]= m[r][i].div(d[i]);
BandMatrixC:         m[c][i]=(new Complex(-1.0)).mul(m[l][i].div(d[i]));
BandMatrixC:  z1=(new Complex(-1.0)).mul(m[l][i].div(d[i]));
BandMatrixC:  m[l][i]=z1.mul(m[l][i-1]);
BandMatrixC:       }
BandMatrixC:       z1=m[l][n-1].sub(m[r][n-1]);
BandMatrixC:       z2=m[l][n].mul(z1);
BandMatrixC:       d[n]=new Complex();
BandMatrixC:       d[n]=m[c][n].add(z2);
BandMatrixC:       m[r][n]= m[r][n].div(d[n]);
BandMatrixC:       m[c][n]=(new Complex(-1.0)).mul(m[l][n].div(d[n]));
BandMatrixC:       
BandMatrixC:       m[l][n-1]=m[l][n-1].sub(m[r][n-1]);     //Backward substitution of matrix
BandMatrixC:       
BandMatrixC:       for (i=n-2; i>=0; i--) {
BandMatrixC:  z1=m[r][i].mul(m[l][i+1]);
BandMatrixC:  m[l][i]=m[l][i].sub(z1);
BandMatrixC:       }
BandMatrixC:       z1=m[r][n].mul(m[l][0]);
BandMatrixC:       det=(new Complex(1.0)).add(z1);
BandMatrixC:       isDecomposed=true;
BandMatrixC:     }
BandMatrixC:     rhs[0]=rhs[0].div(d[0]);
BandMatrixC:     
BandMatrixC:     for (i=1; i<=n; i++) {                      //Forward substitution of rhs
BandMatrixC:       z1=m[c][i].mul(rhs[i-1]);
BandMatrixC:       z2=rhs[i].div(d[i]);
BandMatrixC:       rhs[i]=z2.add(z1); 
BandMatrixC:     }
BandMatrixC:     for (i=n-2; i>=0; i--) {                   //Backward substitution of rhs
BandMatrixC:       z1=m[r][i].mul(rhs[i+1]);
BandMatrixC:       rhs[i]=rhs[i].sub(z1);      
BandMatrixC:     }
BandMatrixC:     z1=m[l][0].mul(rhs[n]);
BandMatrixC:     z2=rhs[0].add(z1);
BandMatrixC:     sol[0]=z2.div(det);
BandMatrixC:     //Built-in periodicity
BandMatrixC:     z1=m[r][n].mul(rhs[0]);
BandMatrixC:     z2=rhs[n].sub(z1);
BandMatrixC:     sol[n]=z2.div(det);
BandMatrixC:     for (i=1;i<n;i++) {
BandMatrixC:       z1=m[l][i].mul(sol[n]);
BandMatrixC:       sol[i]=rhs[i].add(z1);
BandMatrixC:     }
BandMatrixC:     return sol;
BandMatrixC:   }
BandMatrixC:   
BandMatrixC: } //End of BandMatrixC
CHASolution: /* $Id: CHASolution.java,v 1.26 2001/01/15 14:22:21 andrej Exp $ */
CHASolution: 
CHASolution: /** The class CHASolution contains the Characteristics solver.
CHASolution:     @version $Revision: 1.26 $
CHASolution: */
CHASolution: public class CHASolution extends FluidSolution{
CHASolution:   /** Creates a CHASolution object.
CHASolution:       @param runData The run time parameters
CHASolution:   */
CHASolution:   public CHASolution(RunData runData){
CHASolution:     super(runData);
CHASolution:   } // FDSolution
CHASolution:     
CHASolution:                                                                     
CHASolution:   /** Advance the solution forward one step in time.
CHASolution:       The equation is set by the internal variable pde and 
CHASolution:       the numerical scheme by the internal variable scheme
CHASolution:       @param runData List of run parameters
CHASolution:       @see RunData
CHASolution:       @return True if a scheme is implemented for that equation
CHASolution:   ****************************************************************************/
CHASolution:   public boolean next(RunData runData, PhysData physData) {
CHASolution:     int n=f.length-1;
CHASolution:     boolean isDefined=true;
CHASolution: 
CHASolution:     for (int j=0; j<=n; j++) { gp[j]=g[j]; }           //Plot initial condition
CHASolution:         
CHASolution:     if(pde.equals(jbone.ADVECTION) &&
CHASolution:        scheme.equals(jbone.CUBFEM)){                     
CHASolution:       //=======================================================================
CHASolution:       // CHA - Advection/diffusion - CubicFEM - Yabe+Aoki CPC 66(1991)219
CHASolution:       //=======================================================================
CHASolution:       double timeStep= runData.getParamValue(runData.timeStepNm);
CHASolution:       double velocity= runData.getParamValue(runData.velocityNm);
CHASolution:       double diffusCo= runData.getParamValue(runData.diffusionNm);
CHASolution: 
CHASolution:       double alpha   = timeStep*diffusCo/(dx[0]*dx[0]);//Are only constant for
CHASolution:       double beta    = timeStep*velocity/(dx[0]      );// homogeneous problems
CHASolution:       double a,b;
CHASolution: 
CHASolution:       for (int j=0; j<n; j++) {
CHASolution:         a=dx[0]*(df[j]+  df[j+1])-2*(f[j+1]-f[j]);
CHASolution:         b=dx[0]*(df[j]+2*df[j+1])-3*(f[j+1]-f[j]);
CHASolution:         fp[j+1]=  f[j+1] -beta*(dx[0]*df[j+1]-beta*(b-beta*a));
CHASolution:        dfp[j+1]= df[j+1] -beta/dx[0]*(2*b-3*beta*a);
CHASolution:       }
CHASolution:       a=dx[0]*(df[n]+  df[0])-2*(f[0]-f[n]);
CHASolution:       b=dx[0]*(df[n]+2*df[0])-3*(f[0]-f[n]);
CHASolution:       fp[0]=  f[0] -beta*(dx[0]*df[0]-beta*(b-beta*a));
CHASolution:       dfp[0]= df[0] -beta/dx[0]*(2*b-3*beta*a);
CHASolution:     
CHASolution:     } else if(pde.equals(jbone.ADVECTION) &&
CHASolution:               scheme.equals(jbone.CUBSPL)){              
CHASolution:       //=======================================================================
CHASolution:       //  CHA - Advection/diffusion - Cubic splines
CHASolution:       //=======================================================================
CHASolution:       double timeStep= runData.getParamValue(runData.timeStepNm);
CHASolution:       double velocity= runData.getParamValue(runData.velocityNm);
CHASolution:       double diffusCo= runData.getParamValue(runData.diffusionNm);
CHASolution: 
CHASolution:       double alpha   = timeStep*diffusCo/(dx[0]*dx[0]);//Are only constant for
CHASolution:       double beta    = timeStep*velocity/(dx[0]      );// homogeneous problems
CHASolution:       double h       = dx[0];
CHASolution:       BandMatrix a= new BandMatrix(3, f.length);
CHASolution:       double[]   c= new double[f.length];
CHASolution:       int        j, j1, j2;
CHASolution:       double     z, z1, z2, dm, dp;
CHASolution:             
CHASolution:       for (j=0; j<=n; j++) {           // Matrix
CHASolution:         a.setL(j,   h/6 );
CHASolution:         a.setD(j, 4*h/6 );
CHASolution:         a.setR(j,   h/6 );
CHASolution:       }
CHASolution: 
CHASolution:       dp= (f[0]-f[n])/h;               //Right hand side 2nd derivative
CHASolution:       for (j=0; j<n; j++) {
CHASolution:         dm= dp; dp= (f[j+1]-f[j])/h;
CHASolution:         c[j]= dp-dm;
CHASolution:       }
CHASolution:       dm= dp; dp= (f[0]-f[n])/h;
CHASolution:       c[n]= dp-dm;
CHASolution:             
CHASolution:       dfp=a.solve3(c);                 //Solve linear problem
CHASolution:             
CHASolution:       double boxLen= (double)mesh.size() * dx[0];
CHASolution: 
CHASolution:       for (j=0; j<=n; j++) {           //Propagate along characteristics
CHASolution:         z= x[j]-timeStep*velocity;     //Allow arbitrary time step
CHASolution:         while (z> boxLen) { z= z-boxLen*   (int)( z/boxLen); }
CHASolution:         while (z< 0)      { z= z+boxLen*(1+(int)(-z/boxLen)); }
CHASolution:         j1= (int)(z/h); j2=j1+1;
CHASolution:         if (j1 == n)  { j2= 0; }
CHASolution:         z1 = (z-x[j1])/h;  z2 = 1-z1;  //Cubic spline interpolation
CHASolution:         fp[j] = z2*f[j1] +z1*f[j2] +(h*h)/6*((z2*z2*z2 -z2)*dfp[j1] + 
CHASolution:                                              (z1*z1*z1 -z1)*dfp[j2] );
CHASolution:       }
CHASolution:     
CHASolution:     } else if(pde.equals(jbone.EXERCISE)
CHASolution:              && scheme.equals(jbone.EXC6_01)){             
CHASolution:       //=======================================================================
CHASolution:       //  CHA - Exercise 6.01
CHASolution:       //=======================================================================
CHASolution:       //INCLUDE_sol6.01.java_INCLUDE//
CHASolution: 
CHASolution:     } else if(pde.equals(jbone.EXERCISE)
CHASolution:              && scheme.equals(jbone.EXC6_02)){             
CHASolution:       //=======================================================================
CHASolution:       //  CHA - Exercise 6.02
CHASolution:       //=======================================================================
CHASolution:       //INCLUDE_sol6.02.java_INCLUDE//
CHASolution: 
CHASolution:     } else if(pde.equals(jbone.EXERCISE)
CHASolution:              && scheme.equals(jbone.EXC6_03)){             
CHASolution:       //=======================================================================
CHASolution:       //  CHA - Exercise 6.03
CHASolution:       //=======================================================================
CHASolution:       //INCLUDE_sol6.03.java_INCLUDE//
CHASolution: 
CHASolution:     } else if(pde.equals(jbone.EXERCISE)
CHASolution:               && scheme.equals(jbone.EXC6_04)){             
CHASolution:       //=======================================================================
CHASolution:       //  CHA - Exercise 6.04
CHASolution:       //=======================================================================
CHASolution:       //INCLUDE_sol6.04.java_INCLUDE//
CHASolution: 
CHASolution:     } else if(pde.equals(jbone.EXERCISE)
CHASolution:              && scheme.equals(jbone.EXC6_05)){             
CHASolution:       //=======================================================================
CHASolution:       //  CHA - Exercise 6.05
CHASolution:       //=======================================================================
CHASolution:       //INCLUDE_sol6.05.java_INCLUDE//
CHASolution: 
CHASolution:     } else if(pde.equals(jbone.EXERCISE)
CHASolution:               && scheme.equals(jbone.EXCF_01)){             
CHASolution:       //=======================================================================
CHASolution:       //  CHA - Exercise F.01
CHASolution:       //=======================================================================
CHASolution:       //INCLUDE_solF.01.java_INCLUDE//
CHASolution:     
CHASolution:     } else if(pde.equals(jbone.EXERCISE)
CHASolution:               && scheme.equals(jbone.MY_SCHEME)){           
CHASolution:       //=======================================================================
CHASolution:       //  CHA - Project 1
CHASolution:       //=======================================================================
CHASolution:       //INCLUDE_prj6.01.java_INCLUDE//
CHASolution: 
CHASolution:     } else if(pde.equals(jbone.EXERCISE)
CHASolution:               && scheme.equals(jbone.MY_SCHEME_2)){         
CHASolution:       //=======================================================================
CHASolution:       //  CHA - Project 2
CHASolution:       //=======================================================================
CHASolution:       //INCLUDE_prj6.02.java_INCLUDE//
CHASolution: 
CHASolution:     } // if
CHASolution:     if(isDefined)
CHASolution:       shiftLevels();
CHASolution:     return isDefined;
CHASolution:   } // next
CHASolution: 
CHASolution:   /** Take the solution backward one step to initialize schemes 
CHASolution:       with 3 time levels.
CHASolution:       The equation is set by the internal variable pde and 
CHASolution:       the numerical scheme by the internal variable scheme
CHASolution:       @param runData List of run parameters
CHASolution:       @see RunData
CHASolution:       @return True if an initialisation scheme is implemented for that equation
CHASolution:   ****************************************************************************/
CHASolution:   public boolean previous(RunData runData, PhysData physData){
CHASolution:     int n=f.length-1;
CHASolution:     boolean isDefined=false;
CHASolution: 
CHASolution:     if(pde.equals(jbone.ADVECTION) &&
CHASolution:        scheme.equals(jbone.CUBFEM)){                 
CHASolution:       //=======================================================================
CHASolution:       // CHA - Advection/diffusion - CubicFEM - Yabe+Aoki CPC 66(1991)219
CHASolution:       //=======================================================================
CHASolution:       for (int i=1; i<n; i++) {
CHASolution:         df[i] =(f[i+1]-f[i-1])/(2.*dx[0]);
CHASolution:       }
CHASolution:       df[0]=(f[1]-f[n  ])/(2.*dx[0]);
CHASolution:       df[n]=(f[0]-f[n-1])/(2.*dx[0]);
CHASolution:       isDefined=true;
CHASolution:     }
CHASolution:     return isDefined;
CHASolution:   } // previous
CHASolution: 
CHASolution:   /** Tells whether the solution implements a option
CHASolution:          @param option The the option to implement
CHASolution:          @return True if the option is implemented
CHASolution:          @see jbone#pdeNames
CHASolution:          @see jbone#schemeNames
CHASolution:   */
CHASolution:   public boolean hasOption(String option){
CHASolution:     try {
CHASolution:       if(option.equals(jbone.ADVECTION))
CHASolution:  return true;
CHASolution:       else if (option.equals(jbone.EXERCISE))
CHASolution:  return true;
CHASolution:       else if (pde.equals(jbone.ADVECTION) && option.equals(jbone.CUBFEM))
CHASolution:  return true;
CHASolution:       else if (pde.equals(jbone.ADVECTION) && option.equals(jbone.CUBSPL))
CHASolution:  return true;
CHASolution:       else if (pde.equals(jbone.EXERCISE) && option.equals(jbone.EXC6_01))
CHASolution:  return true;
CHASolution:       else if (pde.equals(jbone.EXERCISE) && option.equals(jbone.EXC6_02))
CHASolution:  return true;
CHASolution:       else if (pde.equals(jbone.EXERCISE) && option.equals(jbone.EXC6_03))
CHASolution:  return true;
CHASolution:       else if (pde.equals(jbone.EXERCISE) && option.equals(jbone.EXC6_04))
CHASolution:  return true;
CHASolution:       else if (pde.equals(jbone.EXERCISE) && option.equals(jbone.EXC6_05))
CHASolution:  return true;
CHASolution:       else if (pde.equals(jbone.EXERCISE) && option.equals(jbone.EXCF_01))
CHASolution:  return true;
CHASolution:       else if (pde.equals(jbone.EXERCISE) && option.equals(jbone.MY_SCHEME))
CHASolution:  return true;
CHASolution:       else if (pde.equals(jbone.EXERCISE) && option.equals(jbone.MY_SCHEME_2))
CHASolution:  return true;
CHASolution:       return false;
CHASolution:     } catch (NullPointerException e){
CHASolution:       return false;
CHASolution:     } // try
CHASolution:   } // hasOption
CHASolution: 
CHASolution: } // class CHASolution
FDSolution: /* $Id: FDSolution.java,v 1.35 2001/01/16 18:35:55 andrej Exp $ */
FDSolution: 
FDSolution: /******************************************************************************
FDSolution: *  FDSolution -- contains the finite difference solver.
FDSolution: *    @see FluidSolution
FDSolution: *    @see Solution
FDSolution: ******************************************************************************/
FDSolution: public class FDSolution extends FluidSolution{
FDSolution: 
FDSolution:   /** Creates a FDSolution object.
FDSolution:       @param runData The run time parameters
FDSolution:   */
FDSolution:   public FDSolution(RunData runData){
FDSolution:     super(runData);
FDSolution:   } // FDSolution
FDSolution: 
FDSolution:   /** Advance the solution forward one step in time.
FDSolution:       The equation is set by the internal variable pde and 
FDSolution:       the numerical scheme by the internal variable scheme
FDSolution:       @param runData List of run parameters
FDSolution:       @see RunData
FDSolution:       @return True if a scheme is implemented for that equation
FDSolution:   ****************************************************************************/
FDSolution:   public boolean next(RunData runData, PhysData physData) {
FDSolution:     int n=f.length-1;
FDSolution:     boolean isDefined=true;
FDSolution: 
FDSolution:     for (int j=0; j<=n; j++) { gp[j]=g[j]; }       //Default initial condition
FDSolution:         
FDSolution:     if(pde.equals(jbone.ADVECTION)
FDSolution:        && scheme.equals(jbone.EXP2LVL)){                  
FDSolution:       //=======================================================================
FDSolution:       //  FD  - Advection/diffusion - explicit 2 levels (Godunov advection)
FDSolution:       //=======================================================================
FDSolution:       double timeStep= runData.getParamValue(runData.timeStepNm);
FDSolution:       double velocity= runData.getParamValue(runData.velocityNm);
FDSolution:       double diffusCo= runData.getParamValue(runData.diffusionNm);
FDSolution: 
FDSolution:       double alpha   = timeStep*diffusCo/(dx[0]*dx[0]);//Are only constant for
FDSolution:       double beta    = timeStep*velocity/(dx[0]      );// homogeneous problems
FDSolution: 
FDSolution:       for (int j=1; j<n; j++) {
FDSolution:         fp[j]=f[j] -beta *(f[j]-f[j-1])+alpha*(f[j+1]-2.*f[j]+f[j-1]); }
FDSolution:       fp[0]=f[0]   -beta *(f[0]-f[ n ])+alpha*(f[ 1 ]-2.*f[0]+f[ n ]);
FDSolution:       fp[n]=f[n]   -beta *(f[n]-f[n-1])+alpha*(f[ 0 ]-2.*f[n]+f[n-1]);
FDSolution: 
FDSolution:     } else if(pde.equals(jbone.ADVECTION)
FDSolution:               && scheme.equals(jbone.EXP3LVL)){           
FDSolution:       //=======================================================================
FDSolution:       //  FD  - Advection/diffusion - explicit 3 levels
FDSolution:       //=======================================================================
FDSolution:       double timeStep= runData.getParamValue(runData.timeStepNm);
FDSolution:       double velocity= runData.getParamValue(runData.velocityNm);
FDSolution:       double diffusCo= runData.getParamValue(runData.diffusionNm);
FDSolution: 
FDSolution:       double alpha   = timeStep*diffusCo/(dx[0]*dx[0]);//Are only constant for
FDSolution:       double beta    = timeStep*velocity/(dx[0]      );// homogeneous problems
FDSolution: 
FDSolution:       for (int j=1; j<n; j++) {
FDSolution:         fp[j]=fm[j] -beta*(f[j+1]-f[j-1]) +2*alpha*(f[j+1]-2.*f[j]+f[j-1]);}
FDSolution:       fp[0]=fm[0]   -beta*(f[ 1 ]-f[ n ]) +2*alpha*(f[ 1 ]-2.*f[0]+f[ n ]);
FDSolution:       fp[n]=fm[n]   -beta*(f[ 0 ]-f[n-1]) +2*alpha*(f[ 0 ]-2.*f[n]+f[n-1]);
FDSolution: 
FDSolution:     } else if(pde.equals(jbone.ADVECTION)
FDSolution:               && scheme.equals(jbone.IMP2LVL)){           
FDSolution:       //=======================================================================
FDSolution:       //  FD  - Advection/diffusion - implicit (Crank-Nicholson diffusion)
FDSolution:       //=======================================================================
FDSolution:       double timeStep= runData.getParamValue(runData.timeStepNm);
FDSolution:       double velocity= runData.getParamValue(runData.velocityNm);
FDSolution:       double diffusCo= runData.getParamValue(runData.diffusionNm);
FDSolution: 
FDSolution:       double alpha   = timeStep*diffusCo/(dx[0]*dx[0]);//Are only constant for
FDSolution:       double beta    = timeStep*velocity/(dx[0]      );// homogeneous problems
FDSolution:       BandMatrix a = new BandMatrix(3, f.length);
FDSolution:       BandMatrix b = new BandMatrix(3, f.length);
FDSolution:       double[]   c = new double[f.length];
FDSolution:             
FDSolution:       for (int j=0; j<=n; j++) {
FDSolution:         a.setL(j,-0.25*beta -0.5*alpha);             //Matrix elements
FDSolution:         a.setD(j,            1. +alpha);
FDSolution:         a.setR(j, 0.25*beta -0.5*alpha);
FDSolution:         b.setL(j, 0.25*beta +0.5*alpha);             //Right hand side
FDSolution:         b.setD(j,            1. -alpha);
FDSolution:         b.setR(j,-0.25*beta +0.5*alpha);
FDSolution:       }
FDSolution:             
FDSolution:       c=b.dot(f);                                    //Right hand side
FDSolution:       c[0]=c[0]+b.getL(0)*f[n];                      // with periodicity
FDSolution:       c[n]=c[n]+b.getR(n)*f[0];
FDSolution:             
FDSolution:       fp=a.solve3(c);                                //Solve linear problem
FDSolution: 
FDSolution:     } else if(pde.equals(jbone.ADVECTION)
FDSolution:               && scheme.equals(jbone.EXPLAX)){          
FDSolution:       //=======================================================================
FDSolution:       //  FD  - Advection - explicit Lax-Wendroff - precision in O(delta t^3)
FDSolution:       //=======================================================================
FDSolution:       double timeStep= runData.getParamValue(runData.timeStepNm);
FDSolution:       double velocity= runData.getParamValue(runData.velocityNm);
FDSolution:       double diffusCo= runData.getParamValue(runData.diffusionNm);
FDSolution: 
FDSolution:       double alpha   = timeStep*diffusCo/(dx[0]*dx[0]);//Are only constant for
FDSolution:       double beta    = timeStep*velocity/(dx[0]      );// homogeneous problems
FDSolution: 
FDSolution:       for (int j=1; j<n; j++) {
FDSolution:         fp[j]=f[j] -0.5*beta *(f[j+1]-f[j-1])
FDSolution:                    +0.5*beta*beta*(f[j+1]-2.*f[j]+f[j-1]); }
FDSolution:       fp[0]=f[0] -0.5*beta *(f[ 1 ]-f[ n ])
FDSolution:                  +0.5*beta*beta*(f[ 1 ]-2.*f[0]+f[ n ]);
FDSolution:       fp[n]=f[n] -0.5*beta *(f[ 0 ]-f[n-1])
FDSolution:                  +0.5*beta*beta*(f[ 0 ]-2.*f[n]+f[n-1]);
FDSolution: 
FDSolution:     } else if(pde.equals(jbone.ADVECTION)
FDSolution:               && scheme.equals(jbone.IMPLAX)){          
FDSolution:       //=======================================================================
FDSolution:       //  FD  - Advection - implicit Lax-Wendroff
FDSolution:       //=======================================================================
FDSolution:       double timeStep= runData.getParamValue(runData.timeStepNm);
FDSolution:       double velocity= runData.getParamValue(runData.velocityNm);
FDSolution:       double diffusCo= runData.getParamValue(runData.diffusionNm);
FDSolution: 
FDSolution:       double alpha   = timeStep*diffusCo/(dx[0]*dx[0]);//Are only constant for
FDSolution:       double beta    = timeStep*velocity/(dx[0]      );// homogeneous problems
FDSolution: 
FDSolution:       BandMatrix a = new BandMatrix(3, f.length);
FDSolution:       BandMatrix b = new BandMatrix(3, f.length);
FDSolution:       double[]   c = new double[f.length];
FDSolution:             
FDSolution:       for (int j=0; j<=n; j++) {
FDSolution:         a.setL(j, (1.-beta)/(1.+beta));          //Matrix elements
FDSolution:         a.setD(j, 1.);
FDSolution:         a.setR(j, 0.);
FDSolution:         b.setL(j, 1.);                           //Right hand side
FDSolution:         b.setD(j, (1.-beta)/(1.+beta));
FDSolution:         b.setR(j, 0.);
FDSolution:       }
FDSolution:             
FDSolution:       c=b.dot(f);                                  //Right hand side
FDSolution:       c[0]=c[0]+b.getL(0)*f[n];                    // with periodicity
FDSolution:       c[n]=c[n]+b.getR(n)*f[0];
FDSolution:             
FDSolution:       fp=a.solve3(c);                              //Solve linear problem
FDSolution: 
FDSolution:     } else if(pde.equals(jbone.ADVECTION)
FDSolution:               && scheme.equals(jbone.LAXFRIED)){         
FDSolution:       //=======================================================================
FDSolution:       //  FD  - Advection - Lax-Friedrichs
FDSolution:       //=======================================================================
FDSolution:       double timeStep= runData.getParamValue(runData.timeStepNm);
FDSolution:       double velocity= runData.getParamValue(runData.velocityNm);
FDSolution:       double diffusCo= runData.getParamValue(runData.diffusionNm);
FDSolution: 
FDSolution:       double alpha   = timeStep*diffusCo/(dx[0]*dx[0]);//Are only constant for
FDSolution:       double beta    = timeStep*velocity/(dx[0]      );// homogeneous problems
FDSolution: 
FDSolution:       for (int i=1; i<n; i++) {
FDSolution:         fp[i]=0.5*(f[i+1]+f[i-1]) 
FDSolution:                 -0.5*beta*(f[i+1]-f[i-1]) +2*alpha*(f[i+1]-2.*f[i]+f[i-1]);}
FDSolution:       fp[0]=0.5*(f[1]+f[n  ])-0.5*beta*(f[1]-f[n])  +2*alpha*(f[1]-2.*f[0]+f[n]);
FDSolution:       fp[n]=0.5*(f[0]+f[n-1])-0.5*beta*(f[0]-f[n-1])+2*alpha*(f[0]-2.*f[n]+f[n-1]);
FDSolution: 
FDSolution:     } else if(pde.equals(jbone.ADVECTION)
FDSolution:               && scheme.equals(jbone.LPFROG)){           
FDSolution:       //=======================================================================
FDSolution:       //  FDTD - Advection/Wave - Leap-frog 
FDSolution:       //=======================================================================
FDSolution:       double timeStep= runData.getParamValue(runData.timeStepNm);
FDSolution:       double velocity= runData.getParamValue(runData.velocityNm);
FDSolution:       double diffusCo= runData.getParamValue(runData.diffusionNm);
FDSolution: 
FDSolution:       double alpha   = timeStep*diffusCo/(dx[0]*dx[0]);//Are only constant for
FDSolution:       double beta    = timeStep*velocity/(dx[0]      );// homogeneous problems
FDSolution: 
FDSolution:       for (int j=1; j<=n; j++) {                  //time + time_step
FDSolution:         fp[j]=f[j] -beta*(g[j]-g[j-1]); }
FDSolution:       fp[0]=f[0] -beta*(g[0]-g[n]);
FDSolution: 
FDSolution:       for (int j=0; j<=n-1; j++) {                //time + 1.5*time_step
FDSolution:         gp[j]=g[j] -beta*(fp[j+1]-fp[j]); }
FDSolution:       gp[n]=g[n] -beta*(fp[0]-fp[n]);
FDSolution: 
FDSolution:     } else if(pde.equals(jbone.WAVE)
FDSolution:               && scheme.equals(jbone.FDTDABS)){             
FDSolution:       //=======================================================================
FDSolution:       //  FDTD - Wave - Refraction and absobing boundary conditions
FDSolution:       //=======================================================================
FDSolution: 
FDSolution:     } else if(pde.equals(jbone.BURGER)
FDSolution:               && scheme.equals(jbone.EXP2LVL)){           
FDSolution:       //=======================================================================
FDSolution:       //  FD  - Burger's shock wave equation - explicit 2 levels
FDSolution:       //=======================================================================
FDSolution:       double timeStep= runData.getParamValue(runData.timeStepNm);
FDSolution:       double diffusCo= runData.getParamValue(runData.diffusionNm);
FDSolution: 
FDSolution:       double alpha   = timeStep*diffusCo/(dx[0]*dx[0]);// Homogeneous problem
FDSolution:             
FDSolution:       double fm1 = f[ n ];           //Extra mesh points for periodicity
FDSolution:       double f0  = f[ 0 ];
FDSolution:       double fp1 = f[ 1 ];
FDSolution:             
FDSolution:       for (int j=0; j<=n; ++j) {
FDSolution:         fp[j]= f[j]
FDSolution:           -0.5*timeStep/dx[0]* f0*(fp1-fm1)     //Wave breaking term
FDSolution:           +alpha*(fp1-2*f0+fm1);                //Diffusive term
FDSolution:         fm1=f0;  f0 =fp1;   
FDSolution:         fp1=f[(j+2) % (n+1)];
FDSolution:       }
FDSolution: 
FDSolution:     } else if(pde.equals(jbone.KDV)
FDSolution:               && scheme.equals(jbone.EXP3LVL)){           
FDSolution:       //=======================================================================
FDSolution:       // FD  - KdV - Scheme Zabusky & Kruskal, Phys.Rev.Lett. 15(1965)240
FDSolution:       //=======================================================================
FDSolution:       double timeStep= runData.getParamValue(runData.timeStepNm);
FDSolution:       double velocity= runData.getParamValue(runData.velocityNm);
FDSolution:       double disperCo= runData.getParamValue(runData.dispersionNm);
FDSolution: 
FDSolution:       double nolin=timeStep/(dx[0]);
FDSolution:       double gamma=timeStep/(dx[0]*dx[0]*dx[0])*disperCo;
FDSolution:             
FDSolution:       double fm2 = f[n-1];  double fm1 = f[ n ];  
FDSolution:       double f0  = f[ 0 ];  double fp1 = f[ 1 ];  double fp2 = f[ 2 ];
FDSolution:             
FDSolution:       for (int j=0; j<=n; ++j) {
FDSolution:         fp[j]= fm[j]
FDSolution:           -nolin*(fp1+f0+fm1)/3.*(fp1-fm1)       //Wave breaking term
FDSolution:           -gamma*(fp2 -2.*(fp1-fm1) -fm2);       //Dispersive term
FDSolution:            
FDSolution:         fm2=fm1;  fm1=f0;  f0 =fp1;  fp1=fp2;    //Periodicity
FDSolution:         fp2=f[(j+3) % (n+1)];
FDSolution:       }
FDSolution:     
FDSolution:     } else if(pde.equals(jbone.SCHROED)
FDSolution:               && scheme.equals(jbone.IMP2LVL)){           
FDSolution:       //=======================================================================
FDSolution:       //  FD  - Schroedinger - implicit (Crank-Nicholson) - Cayley's form
FDSolution:       //=======================================================================
FDSolution:       double timeStep= runData.getParamValue(runData.timeStepNm);
FDSolution: 
FDSolution:       BandMatrixC a = new BandMatrixC(3, h.length);
FDSolution:       BandMatrixC b = new BandMatrixC(3, h.length);
FDSolution:       Complex[]   c = new Complex[h.length];
FDSolution:       Complex     z = new Complex();
FDSolution: 
FDSolution:       double[] V = physData.getPotential(runData);   //Here Heavyside(x-L/2)
FDSolution:       double  scale  = 10;                           // times scaling factor
FDSolution:       double  dtodx2 = timeStep/(dx[0]*dx[0]);
FDSolution:       Complex pjh  = new Complex(0., 0.5*dtodx2);
FDSolution:       Complex mjh  = new Complex(0.,-0.5*dtodx2);
FDSolution:       Complex pjp1 = new Complex(1.,     dtodx2);
FDSolution:       Complex mjp1 = new Complex(1.,    -dtodx2);
FDSolution: 
FDSolution:       for (int j=0; j<=n; j++) {
FDSolution:         z = new Complex(0.,0.5*scale*timeStep*V[j]);
FDSolution:         a.setL(j,mjh);                               //Matrix elements
FDSolution:         a.setD(j,pjp1.add(z));
FDSolution:         a.setR(j,mjh);
FDSolution:         b.setL(j,pjh);                               //Right hand side
FDSolution:         b.setD(j,mjp1.sub(z));
FDSolution:         b.setR(j,pjh);
FDSolution:       }
FDSolution: 
FDSolution:       c=b.dot(h);                                    //Right hand side with
FDSolution:       c[0]=c[0].add(b.getL(0).mul(h[n]));            // with periodicity
FDSolution:       c[n]=c[n].add(b.getR(n).mul(h[0]));            
FDSolution: 
FDSolution:       hp=a.solve3(c);                                //Solve linear problem
FDSolution:       for (int j=0; j<=n; j++){                      //Plot norm & real part
FDSolution:         fp[j]=hp[j].norm();
FDSolution:         gp[j]=hp[j].re();
FDSolution:       }
FDSolution: 
FDSolution:     } else if(pde.equals(jbone.BSCHOLES)
FDSolution:               && scheme.equals(jbone.EUNAIVE)){          
FDSolution:       //=======================================================================
FDSolution:       //  FD  - Black-Scholes - European Vanilla Put option - not normalized
FDSolution:       //=======================================================================
FDSolution:       double timeStep= runData.getParamValue(runData.timeStepNm);
FDSolution:       double velocity= runData.getParamValue(runData.velocityNm);
FDSolution:       double diffusCo= runData.getParamValue(runData.diffusionNm);
FDSolution:       double disperCo= runData.getParamValue(runData.dispersionNm);
FDSolution: 
FDSolution:       double strike  = runData.getParamValue(runData.icPositionNm);
FDSolution:       double sigmaSq = diffusCo;                         //Volatility square
FDSolution:       double rate    = velocity;                         //Interest rate
FDSolution:       double divid   = disperCo;                         //Dividend
FDSolution: 
FDSolution:       fp[0]=strike*Math.exp(-rate*time);                 //Boundary condition
FDSolution:       for (int j=1; j<n; j++) {                          //Explicit 2 levels
FDSolution:         fp[j]=f[j+1]* 0.5*timeStep*(sigmaSq*j*j +(rate-divid)*j)
FDSolution:              +f[j  ]*(1.0-timeStep*(sigmaSq*j*j + rate         )) 
FDSolution:              +f[j-1]* 0.5*timeStep*(sigmaSq*j*j -(rate-divid)*j);
FDSolution:       }
FDSolution:       fp[n]=fp[n-1];                                     //Boundary condition
FDSolution: 
FDSolution:     } else if(pde.equals(jbone.BSCHOLES)
FDSolution:               && scheme.equals(jbone.EUPUT)){            
FDSolution:       //=======================================================================
FDSolution:       //  FD  - Black-Scholes - European Vanilla Put option - normalized
FDSolution:       //=======================================================================
FDSolution:       double timeStep= runData.getParamValue(runData.timeStepNm);
FDSolution:       double velocity= runData.getParamValue(runData.velocityNm);
FDSolution:       double diffusCo= runData.getParamValue(runData.diffusionNm);
FDSolution:       double disperCo= runData.getParamValue(runData.dispersionNm);
FDSolution: 
FDSolution:       double strike  = runData.getParamValue(runData.icPositionNm);
FDSolution:       double sigmaSq = diffusCo;                         //Volatility square
FDSolution:       double rate    = velocity;                         //Interest rate
FDSolution:       double divid   = disperCo;                         //Dividend
FDSolution:       int    j;
FDSolution:       double x0, x1, f0, f1, xxi;                        //Change variables
FDSolution:       double tau = 0.5*sigmaSq*time;                     //  f(x,t) ->
FDSolution:       double dtau= 0.5*sigmaSq*timeStep;                 //  fm(xx,tau)
FDSolution:       double xx0 = Math.log(x[1]/strike);                //Lognormal mesh
FDSolution:       double dxx =(Math.log(x[n]/strike)-Math.log(x[1]/strike))/(n-1);
FDSolution:       double k1  = 2*rate/sigmaSq; 
FDSolution:       double k2  = 2*(rate-divid)/sigmaSq; 
FDSolution:       double k2m1= k2-1.;
FDSolution:       double k2p1= k2+1.;
FDSolution: 
FDSolution:       //===== Interpolate IC from (x,t) to lognormal variables (xx,tau)
FDSolution:       if (time<=timeStep) {
FDSolution:         if(true) { //Initialize fm[] as put-option
FDSolution:           for (int i=1; i<=n; i++) {
FDSolution:             xxi=xx0+(i-1)*dxx;
FDSolution:             fm[i]=Math.max(0., Math.exp(0.5*k2m1*xxi) -
FDSolution:                                Math.exp(0.5*k2p1*xxi)  );
FDSolution:           }
FDSolution:         } else { //Interpolate fm[] from IC in f[]
FDSolution:           j=1; ; x0=xx0;
FDSolution:           f0=f[1]/strike*Math.exp(0.5*k2m1*xx0);
FDSolution:           x1=x0; f1=f0;
FDSolution:           for (int i=1; i<n; i++) {    //Loop over lognormal mesh index
FDSolution:             xxi=xx0+(i-1)*dxx;         // find x0,x1 | x[j] < xxi < x[j+1]
FDSolution:             while (xxi>=x1) { j++; x0=x1; f0=f1; x1=Math.log(x[j]/strike); }
FDSolution:             f1=f[j]/strike*Math.exp(0.5*k2m1*x1);
FDSolution:             fm[i]= f0 + (xxi-x0)*(f1-f0)/(x1-x0);
FDSolution:           }
FDSolution:           fm[n]= fm[n-1] + dxx*(fm[n-1]-fm[n-2]);
FDSolution:         }
FDSolution:       } else { //Retrieve fm[] from previous time step
FDSolution:       }    
FDSolution:       
FDSolution:       //===== Solve diffusion equation an explicit 2 levels scheme
FDSolution:       double D = dtau/(dxx*dxx);
FDSolution:       for (int i=2; i<n; i++) 
FDSolution:         f[i]= fm[i] + D*(fm[i+1]-2.*fm[i]+fm[i-1]);
FDSolution:       f[1]= Math.exp(0.5*k2m1*xx0+0.25*k2m1*k2m1*tau);   //Boundary conditions
FDSolution:       f[n]= f[n-1];
FDSolution: 
FDSolution:       //===== Interpolate back from lognormal to financial mesh variables
FDSolution:       fp[0]=strike*Math.exp(-rate*time);                 //Analytically
FDSolution:       j=1; x0=x[0]; x1=x0; f0=fp[0];
FDSolution:       xxi=xx0; f1=f[1]*strike*Math.exp(-0.5*k2m1*xxi-(0.25*k2m1*k2m1+k1)*tau);
FDSolution:       for (int i=1; i<n; i++) { //Loop over financial mesh index
FDSolution:         while (x[i]>=x1){
FDSolution:           j++;x0=x1;f0=f1;xxi=xx0+(j-1)*dxx;x1=strike*Math.exp(xxi);
FDSolution:         }
FDSolution:         f1=f[j]*strike*Math.exp(-0.5*k2m1*xxi-(0.25*k2m1*k2m1+k1)*tau);
FDSolution:         fp[i]= f0 +(x[i]-x0)/(x1-x0)*(f1-f0);              //Lin interpol in x
FDSolution: //      double gg=-0.5*k2m1;double dx=xxi-Math.log(x[i]/strike);//Expand exp()
FDSolution: //      gp[i]= f0*(1.+gg*dx +0.5*gg*gg*dx*dx);                  //  is worse;
FDSolution:       }
FDSolution:       xxi=Math.log(x[n]/strike);
FDSolution:       fp[n]=f[n]*strike*Math.exp(-0.5*k2m1*xxi-(0.25*k2m1*k2m1+k1)*tau);
FDSolution: 
FDSolution:     } else if(pde.equals(jbone.EXERCISE)
FDSolution:              && scheme.equals(jbone.EXC2_01)){             
FDSolution:       //=======================================================================
FDSolution:       //  FD  - Exercise 2.01
FDSolution:       //=======================================================================
FDSolution:       //INCLUDE_sol2.01.java_INCLUDE//
FDSolution: 
FDSolution:     } else if(pde.equals(jbone.EXERCISE)
FDSolution:              && scheme.equals(jbone.EXC2_02)){             
FDSolution:       //=======================================================================
FDSolution:       //  FD  - Exercise 2.02
FDSolution:       //=======================================================================
FDSolution:       //INCLUDE_sol2.02.java_INCLUDE//
FDSolution: 
FDSolution:     } else if(pde.equals(jbone.EXERCISE)
FDSolution:              && scheme.equals(jbone.EXC2_03)){             
FDSolution:       //=======================================================================
FDSolution:       //  FD  - Exercise 2.03
FDSolution:       //=======================================================================
FDSolution:       //INCLUDE_sol2.03.java_INCLUDE//
FDSolution: 
FDSolution:     } else if(pde.equals(jbone.EXERCISE)
FDSolution:               && scheme.equals(jbone.EXC2_04)){             
FDSolution:       //=======================================================================
FDSolution:       //  FD  - Exercise 2.04
FDSolution:       //=======================================================================
FDSolution:       //INCLUDE_sol2.04.java_INCLUDE//
FDSolution: 
FDSolution:     } else if(pde.equals(jbone.EXERCISE)
FDSolution:              && scheme.equals(jbone.EXC2_05)){             
FDSolution:       //=======================================================================
FDSolution:       //  FD  - Exercise 2.05
FDSolution:       //=======================================================================
FDSolution:       //INCLUDE_sol2.05.java_INCLUDE//
FDSolution: 
FDSolution:     } else if(pde.equals(jbone.EXERCISE)
FDSolution:              && scheme.equals(jbone.EXC2_06)){             
FDSolution:       //=======================================================================
FDSolution:       //  FD  - Exercise 2.06
FDSolution:       //=======================================================================
FDSolution:       //INCLUDE_sol2.06.java_INCLUDE//
FDSolution: 
FDSolution:     } else if(pde.equals(jbone.EXERCISE)
FDSolution:              && scheme.equals(jbone.EXC2_07)){             
FDSolution:       //=======================================================================
FDSolution:       //  FD  - Exercise 2.07
FDSolution:       //=======================================================================
FDSolution:       //INCLUDE_sol2.07.java_INCLUDE//
FDSolution: 
FDSolution:     } else if(pde.equals(jbone.EXERCISE)
FDSolution:              && scheme.equals(jbone.EXC2_08)){             
FDSolution:       //=======================================================================
FDSolution:       //  FD  - Exercise 2.08
FDSolution:       //=======================================================================
FDSolution:       //INCLUDE_sol2.08.java_INCLUDE//
FDSolution:     
FDSolution:     } else if(pde.equals(jbone.EXERCISE)
FDSolution:               && scheme.equals(jbone.MY_SCHEME)){           
FDSolution:       //=======================================================================
FDSolution:       //  FD  - Project 1
FDSolution:       //=======================================================================
FDSolution:       //INCLUDE_prj2.01.java_INCLUDE//
FDSolution: 
FDSolution:     } else if(pde.equals(jbone.EXERCISE)
FDSolution:               && scheme.equals(jbone.MY_SCHEME_2)){         
FDSolution:       //=======================================================================
FDSolution:       //  FD  - Project 2
FDSolution:       //=======================================================================
FDSolution:       //INCLUDE_prj2.02.java_INCLUDE//
FDSolution: 
FDSolution:     } // if
FDSolution: 
FDSolution:     if(isDefined && isForward)
FDSolution:       shiftLevels();
FDSolution:     return isDefined;
FDSolution:   } // next
FDSolution: 
FDSolution: 
FDSolution:   /** Take the solution backward one step to initialize schemes 
FDSolution:       with 3 time levels.
FDSolution:       The equation is set by the internal variable pde and 
FDSolution:       the numerical scheme by the internal variable scheme
FDSolution:       @param runData List of run parameters
FDSolution:       @see RunData
FDSolution:       @return True if an initialisation scheme is implemented for that equation
FDSolution:   ****************************************************************************/
FDSolution:   public boolean previous(RunData runData, PhysData physData){
FDSolution:     int n=f.length-1;
FDSolution:     boolean isDefined=false;
FDSolution: 
FDSolution:     if(pde.equals(jbone.ADVECTION) && scheme.equals(jbone.EXP3LVL) ||
FDSolution:        pde.equals(jbone.KDV)       && scheme.equals(jbone.EXP3LVL)    ){
FDSolution:                                                          
FDSolution:       //=======================================================================
FDSolution:       // FD init - 3 levels - Common to all such schemes
FDSolution:       //=======================================================================
FDSolution:       for (int j=0; j<=n; j++)         //Note how backward is implemented:
FDSolution:         { fm[j]=0.;}                   //  first reset the oldest level,
FDSolution:       isForward = false;               //  then calculate a pseudo-forward 
FDSolution:       this.next(runData, physData);    //  solution without shifting 
FDSolution:       isForward = true;                //  levels.
FDSolution: 
FDSolution:       for (int j=0; j<=n; j++) {       //  Divide by (-2) to gives a scheme 
FDSolution:          fm[j]=f[j]-0.5*fp[j];         //  equivalent to two levels backward
FDSolution:       }
FDSolution:     
FDSolution:     } else if (pde.equals(jbone.ADVECTION) && scheme.equals(jbone.LPFROG)||
FDSolution:                pde.equals(jbone.WAVE)      && scheme.equals(jbone.FDTDABS)){
FDSolution:                                                         
FDSolution:       //=======================================================================
FDSolution:       // FDTD init - Advection/Wave - Leap-Frog
FDSolution:       //=======================================================================
FDSolution:       double timeStep= runData.getParamValue(runData.timeStepNm);
FDSolution:       double velocity= runData.getParamValue(runData.velocityNm);
FDSolution:       double frac = runData.getParamValue(runData.physDataValueNm);
FDSolution:       double beta;
FDSolution:       if (scheme.equals(jbone.LPFROG)) {
FDSolution:          beta =timeStep*velocity/(dx[0]);
FDSolution:       } else {
FDSolution:          beta =timeStep/(dx[0]);        // Initialize in vacuum
FDSolution:          frac =1.0;                     // Propagate to the right
FDSolution:       }
FDSolution: 
FDSolution:       for (int j=0; j<=n-1; j++)        // Initialize pulse running direction
FDSolution:         gm[j] = 0.5*frac*(f[j+1]+f[j]); //  frac in [-1;1] -> [left; right]
FDSolution:       gm[n]=0.5*frac*(f[0]+f[n]);       //  frac = 0 -> propagates in both
FDSolution: 
FDSolution:       for (int j=0; j<=n-1; j++) {               //time=0.5*time_step
FDSolution:           g[j] = gm[j]-0.5*beta*(f[j+1]-f[j]); }
FDSolution:       g[n]=gm[n]-0.5*beta*(f[0]-f[n]);;
FDSolution: 
FDSolution:     } else if (pde.equals(jbone.EXERCISE) 
FDSolution:                && scheme.equals(jbone.EXC2_04)){           
FDSolution:       //=======================================================================
FDSolution:       // FD init - Exersice 2.04
FDSolution:       //=======================================================================
FDSolution:       //INCLUDE_sol2.04.init_INCLUDE//
FDSolution: 
FDSolution:     }
FDSolution:     return isDefined;
FDSolution:   } // previous
FDSolution: 
FDSolution:   /** Tells whether the solution implements a option
FDSolution:          @param option The the option to implement
FDSolution:          @return True if the option is implemented
FDSolution:          @see jbone#pdeNames
FDSolution:          @see jbone#schemeNames
FDSolution:   */
FDSolution:   public boolean hasOption(String option){
FDSolution:     try {
FDSolution:       if(option.equals(jbone.ADVECTION))
FDSolution:  return true;
FDSolution:     //else if (option.equals(jbone.WAVE))
FDSolution:     // return true;
FDSolution:       else if (option.equals(jbone.BURGER))
FDSolution:  return true;
FDSolution:       else if (option.equals(jbone.KDV))
FDSolution:  return true;
FDSolution:       else if (option.equals(jbone.SCHROED))
FDSolution:  return true;
FDSolution:       else if (option.equals(jbone.BSCHOLES))
FDSolution:  return true;
FDSolution:       else if (option.equals(jbone.EXERCISE))
FDSolution:  return true;
FDSolution:       else if (pde.equals(jbone.ADVECTION) && option.equals(jbone.EXP2LVL))
FDSolution:  return true;
FDSolution:       else if (pde.equals(jbone.ADVECTION) && option.equals(jbone.EXP3LVL))
FDSolution:  return true;
FDSolution:       else if (pde.equals(jbone.ADVECTION) && option.equals(jbone.IMP2LVL))
FDSolution:  return true;
FDSolution:       else if (pde.equals(jbone.ADVECTION) && option.equals(jbone.EXPLAX))
FDSolution:  return true;
FDSolution:       else if (pde.equals(jbone.ADVECTION) && option.equals(jbone.IMPLAX))
FDSolution:  return true;
FDSolution:       else if (pde.equals(jbone.ADVECTION) && option.equals(jbone.LAXFRIED))
FDSolution:  return true;
FDSolution:       else if (pde.equals(jbone.ADVECTION) && option.equals(jbone.LPFROG))
FDSolution:  return true;
FDSolution:     //else if (pde.equals(jbone.WAVE) && option.equals(jbone.FDTDABS))
FDSolution:     // return true;
FDSolution:       else if (pde.equals(jbone.BURGER) && option.equals(jbone.EXP2LVL))
FDSolution:  return true;
FDSolution:       else if (pde.equals(jbone.KDV) && option.equals(jbone.EXP3LVL))
FDSolution:  return true;
FDSolution:       else if (pde.equals(jbone.SCHROED) && option.equals(jbone.IMP2LVL))
FDSolution:  return true;
FDSolution:       else if (pde.equals(jbone.BSCHOLES) && option.equals(jbone.EUNAIVE))
FDSolution:  return true;
FDSolution:       else if (pde.equals(jbone.BSCHOLES) && option.equals(jbone.EUPUT))
FDSolution:  return true;
FDSolution:       else if (pde.equals(jbone.EXERCISE) && option.equals(jbone.EXC2_01))
FDSolution:  return true;
FDSolution:       else if (pde.equals(jbone.EXERCISE) && option.equals(jbone.EXC2_02))
FDSolution:  return true;
FDSolution:       else if (pde.equals(jbone.EXERCISE) && option.equals(jbone.EXC2_03))
FDSolution:  return true;
FDSolution:       else if (pde.equals(jbone.EXERCISE) && option.equals(jbone.EXC2_04))
FDSolution:  return true;
FDSolution:       else if (pde.equals(jbone.EXERCISE) && option.equals(jbone.EXC2_05))
FDSolution:  return true;
FDSolution:       else if (pde.equals(jbone.EXERCISE) && option.equals(jbone.EXC2_06))
FDSolution:  return true;
FDSolution:       else if (pde.equals(jbone.EXERCISE) && option.equals(jbone.EXC2_07))
FDSolution:  return true;
FDSolution:       else if (pde.equals(jbone.EXERCISE) && option.equals(jbone.EXC2_08))
FDSolution:  return true;
FDSolution:       else if (pde.equals(jbone.EXERCISE) && option.equals(jbone.EXCB_01))
FDSolution:  return true;
FDSolution:       else if (pde.equals(jbone.EXERCISE) && option.equals(jbone.MY_SCHEME))
FDSolution:  return true;
FDSolution:       else if (pde.equals(jbone.EXERCISE) && option.equals(jbone.MY_SCHEME_2))
FDSolution:  return true;
FDSolution:       return false;
FDSolution:     } catch (NullPointerException e){
FDSolution:       return false;
FDSolution:     } // try
FDSolution:   } // hasOption
FDSolution: 
FDSolution: } // class FDSolution
FEMSolution: /* $Id: FEMSolution.java,v 1.26 2001/01/15 14:22:21 andrej Exp $ */
FEMSolution: 
FEMSolution: /******************************************************************************
FEMSolution: *  FEMSolution -- contains the finite elements solver.
FEMSolution: *    @see FluidSolution
FEMSolution: *    @see Solution
FEMSolution: ******************************************************************************/
FEMSolution: public class FEMSolution extends FluidSolution{
FEMSolution: 
FEMSolution:   /** Creates a FEMSolution object.
FEMSolution:       @param runData The run time parameters
FEMSolution:   */
FEMSolution:   public FEMSolution(RunData runData){
FEMSolution:     super(runData);
FEMSolution:   } // FEMSolution
FEMSolution: 
FEMSolution:   /** Advance the solution forward one step in time.
FEMSolution:       The equation is set by the internal variable pde and 
FEMSolution:       the numerical scheme by the internal variable scheme
FEMSolution:       @param runData List of run parameters
FEMSolution:       @see RunData
FEMSolution:       @return True if a scheme is implemented for that equation
FEMSolution:   ****************************************************************************/
FEMSolution:   public boolean next(RunData runData, PhysData physData) {
FEMSolution:     int n=f.length-1;
FEMSolution:     boolean isDefined=true;
FEMSolution: 
FEMSolution:     for (int j=0; j<=n; j++) { gp[j]=g[j]; }       //Plot initial condition
FEMSolution:         
FEMSolution:     if(pde.equals(jbone.ADVECTION)
FEMSolution:        && scheme.equals(jbone.TUNFEM)){                      
FEMSolution:       //=======================================================================
FEMSolution:       //  FEM - Advection/diffusion, tunable integration    t=1.  FD
FEMSolution:       //                                                    t=1/3 linear FEM
FEMSolution:       //                                                    t=0.  constant FEM
FEMSolution:       //=======================================================================
FEMSolution:       double timeStep= runData.getParamValue(runData.timeStepNm);
FEMSolution:       double velocity= runData.getParamValue(runData.velocityNm);
FEMSolution:       double diffusCo= runData.getParamValue(runData.diffusionNm);
FEMSolution:       double theta   = runData.getParamValue(runData.timeImplicitNm);
FEMSolution:       double tune    = runData.getParamValue(runData.tuneIntegrNm);
FEMSolution: 
FEMSolution:       BandMatrix a = new BandMatrix(3, f.length);
FEMSolution:       BandMatrix b = new BandMatrix(3, f.length);
FEMSolution:       double[]   c = new double[f.length];
FEMSolution: 
FEMSolution:       double alpha   = timeStep*diffusCo/(dx[0]*dx[0]);//Are only constant for
FEMSolution:       double beta    = timeStep*velocity/(dx[0]      );// homogeneous problems
FEMSolution:       double h   = dx[0];
FEMSolution:       double htm = h*(1-tune)/4;
FEMSolution:       double htp = h*(1+tune)/4;
FEMSolution:             
FEMSolution:       for (int j=0; j<=n; j++) {
FEMSolution:         a.setL(j,   htm +h*(-0.5*beta -alpha)* theta    );
FEMSolution:         a.setD(j,2*(htp +h*(           alpha)* theta   ));
FEMSolution:         a.setR(j,   htm +h*( 0.5*beta -alpha)* theta    );
FEMSolution:         b.setL(j,   htm +h*(-0.5*beta -alpha)*(theta-1) );
FEMSolution:         b.setD(j,2*(htp +h*(           alpha)*(theta-1)));
FEMSolution:         b.setR(j,   htm +h*( 0.5*beta -alpha)*(theta-1) );
FEMSolution:       }
FEMSolution:             
FEMSolution:       c=b.dot(f);                                 //Right hand side
FEMSolution:       c[0]=c[0]+b.getL(0)*f[n];                   // with periodicity
FEMSolution:       c[n]=c[n]+b.getR(n)*f[0];
FEMSolution:       
FEMSolution:       fp=a.solve3(c);                             //Solve linear problem
FEMSolution:     
FEMSolution: 
FEMSolution:     } else if(pde.equals(jbone.BSCHOLES) &&
FEMSolution:               (scheme.equals(jbone.EUNAIVE)|| 
FEMSolution:                scheme.equals(jbone.AMNAIVE)  )){         
FEMSolution:       //=======================================================================
FEMSolution:       //  FEM - Black-Scholes - American Vanilla Put option - not normalized
FEMSolution:       //=======================================================================
FEMSolution:       double timeStep= runData.getParamValue(runData.timeStepNm);
FEMSolution:       double velocity= runData.getParamValue(runData.velocityNm);
FEMSolution:       double diffusCo= runData.getParamValue(runData.diffusionNm);
FEMSolution:       double theta   = runData.getParamValue(runData.timeImplicitNm);
FEMSolution:       double tune    = runData.getParamValue(runData.tuneIntegrNm);
FEMSolution: 
FEMSolution:       double sigmaSq = diffusCo;                       //Volatility square
FEMSolution:       double rate    = velocity;                       //Interest rate
FEMSolution:       double strike  = runData.getParamValue(runData.icPositionNm);
FEMSolution:       double divid   = runData.getParamValue(runData.dispersionNm);
FEMSolution: 
FEMSolution:       BandMatrix a = new BandMatrix(3, f.length);      //Linear problem a*x=c
FEMSolution:       BandMatrix b = new BandMatrix(3, f.length);
FEMSolution:       double[]   c = new double[f.length];
FEMSolution:       double alp = timeStep*sigmaSq/2.;                //PDE coefficients
FEMSolution:       double bet =-timeStep*(rate-divid-sigmaSq);
FEMSolution:       double gam = timeStep*rate;
FEMSolution:       double h   = dx[0];
FEMSolution:       double t0m,t0,t0p,t1m,t1,t1p,t2m,t2,t2p;         //Tunable quadra coeff
FEMSolution:       t0p= h*0.25*(1-tune);
FEMSolution:       t0m= h*0.25*(1-tune);               t0=h*0.5*(1+tune);
FEMSolution:       for (int j=0; j<=n; j++) {
FEMSolution:         t1m=h*0.25*(      -2*j-tune+1);   t1=h*0.5*(tune-1);
FEMSolution:         t1p=h*0.25*(       2*j-tune+1);
FEMSolution:         t2m=h*0.25*(-4*j*j+4*j-tune-1);   t2=h*0.5*(4*j*j+tune+1);
FEMSolution:         t2p=h*0.25*(-4*j*j-4*j-tune-1);
FEMSolution:         a.setL(j,t0m*(1.+gam* theta)    +(t1m*bet +t2m*alp)* theta   );
FEMSolution:         a.setD(j,t0 *(1.+gam* theta)    +(t1 *bet +t2 *alp)* theta   );
FEMSolution:         a.setR(j,t0p*(1.+gam* theta)    +(t1p*bet +t2p*alp)* theta   );
FEMSolution:         b.setL(j,t0m*(1.+gam*(theta-1)) +(t1m*bet +t2m*alp)*(theta-1));
FEMSolution:         b.setD(j,t0 *(1.+gam*(theta-1)) +(t1 *bet +t2 *alp)*(theta-1));
FEMSolution:         b.setR(j,t0p*(1.+gam*(theta-1)) +(t1p*bet +t2p*alp)*(theta-1));
FEMSolution:       }
FEMSolution:       c=b.dot(f);
FEMSolution: 
FEMSolution:       if (scheme.equals(jbone.EUNAIVE)) {              //===== European =======
FEMSolution:         a.setL(0, 0.);a.setD(0,1.);a.setR(0,0.);       //Dirichlet in-the-money
FEMSolution:         c[0]=strike*Math.exp(-rate*time);
FEMSolution:         a.setL(n,-1.);a.setD(n,1.);a.setR(n,0.);c[n]=0.; //Neuman out-the-money
FEMSolution:         fp=a.ssor3(c,f);
FEMSolution: 
FEMSolution:       } else if (scheme.equals(jbone.AMNAIVE)) {       //===== American =======
FEMSolution:         double[] min = new double[f.length];
FEMSolution:         double[] max = new double[f.length];
FEMSolution:         for (int j=0; j<=n; j++) { 
FEMSolution:           min[j]=Math.max(strike-j*dx[0],0);
FEMSolution:           max[j]=Double.POSITIVE_INFINITY;
FEMSolution:         }
FEMSolution:         a.setL(0, 0.);a.setD(0,1.);a.setR(0,0.);       //Dirichlet in-the-money
FEMSolution:         c[0]=strike*Math.exp(-rate*time);
FEMSolution:         a.setL(n,-1.);a.setD(n,1.);a.setR(n,0.);c[n]=0.; //Neuman out-the-money
FEMSolution:         double precision = strike*Math.pow(10.,-6);      //Relative to strike
FEMSolution:         int maxIter = 30;
FEMSolution:         double w = 1.2;                                //Relaxation parameter
FEMSolution:         fp=a.ssor3(c,f,min,max,precision,w,maxIter);   //Projected-SSOR
FEMSolution:       }
FEMSolution: 
FEMSolution:     } else if(pde.equals(jbone.BSCHOLES) &&
FEMSolution:               (scheme.equals(jbone.EUPUT)|| 
FEMSolution:                scheme.equals(jbone.AMPUT)  )){           
FEMSolution:       //=======================================================================
FEMSolution:       //  FEM - Black-Scholes - American Vanilla Put option - normalized
FEMSolution:       //=======================================================================
FEMSolution:       double timeStep= runData.getParamValue(runData.timeStepNm);
FEMSolution:       double velocity= runData.getParamValue(runData.velocityNm);
FEMSolution:       double diffusCo= runData.getParamValue(runData.diffusionNm);
FEMSolution:       double theta   = runData.getParamValue(runData.timeImplicitNm);
FEMSolution:       double tune    = runData.getParamValue(runData.tuneIntegrNm);
FEMSolution: 
FEMSolution:       double sigmaSq = diffusCo;                       //Volatility square
FEMSolution:       double rate    = velocity;                       //Interest rate
FEMSolution:       double strike  = runData.getParamValue(runData.icPositionNm);
FEMSolution:       double divid   = runData.getParamValue(runData.dispersionNm);
FEMSolution: 
FEMSolution:       int    j;
FEMSolution:       double x0, x1, xxi, f1,f0=0.;                    //Change variables
FEMSolution:       double tau = 0.5*sigmaSq*time;                   //  f(x,t) ->
FEMSolution:       double dtau= 0.5*sigmaSq*timeStep;               //  fm(xx,tau)
FEMSolution:       double xx0 = Math.log(x[1]/strike);              //Lognormal mesh
FEMSolution:       double dxx =(Math.log(x[n]/strike)-Math.log(x[1]/strike))/(n-1);
FEMSolution:       double k1  = 2*rate/sigmaSq; 
FEMSolution:       double k2  = 2*(rate-divid)/sigmaSq; 
FEMSolution:       double k2m1= k2-1.;
FEMSolution:       double k2p1= k2+1.;
FEMSolution: 
FEMSolution:       //===== Interpolate IC from (x,t) to lognormal variables (xx,tau)
FEMSolution:       if (time<=timeStep) { //Initialize fm[] as put-option
FEMSolution:         for (int i=0; i<=n; i++) {
FEMSolution:           xxi=xx0+(i-1)*dxx;
FEMSolution:           fm[i]=Math.max(0., Math.exp(0.5*k2m1*xxi) -
FEMSolution:                              Math.exp(0.5*k2p1*xxi)  );
FEMSolution:         }
FEMSolution:       } else { //Retrieve fm[] from previous time step
FEMSolution:       }    
FEMSolution: 
FEMSolution:       //===== Solve diffusion equation with tunable finite elements
FEMSolution:       BandMatrix a = new BandMatrix(3, f.length);      //Linear problem a*x=c
FEMSolution:       BandMatrix b = new BandMatrix(3, f.length);
FEMSolution:       double[]   c = new double[f.length];
FEMSolution:       double htm = dxx*(1-tune)/4;                     //Tunable quadra coeff
FEMSolution:       double htp = dxx*(1+tune)/4;
FEMSolution:       double halpha = dtau/dxx;
FEMSolution:       for (int i=0; i<=n; i++) {
FEMSolution:         a.setL(i,   htm -halpha* theta    );
FEMSolution:         a.setD(i,2*(htp +halpha* theta   ));
FEMSolution:         a.setR(i,   htm -halpha* theta    );
FEMSolution:         b.setL(i,   htm -halpha*(theta-1) );
FEMSolution:         b.setD(i,2*(htp +halpha*(theta-1)));
FEMSolution:         b.setR(i,   htm -halpha*(theta-1) );
FEMSolution:       }
FEMSolution:       c=b.dot(fm);
FEMSolution:       a.setL(0,0.);a.setD(0,1.);a.setR(0,0.);c[0]=0;   //First equation idle
FEMSolution: 
FEMSolution:       if (scheme.equals(jbone.EUPUT)) {                //===== European =======
FEMSolution:         a.setL(1, 0.);a.setD(1,1.);a.setR(1,0.);       //Dirichlet in-the-money
FEMSolution:         c[1]=Math.exp(0.5*k2m1*xx0+0.25*k2m1*k2m1*tau);
FEMSolution:         a.setL(n,-1.);a.setD(n,1.);a.setR(n,0.);c[n]=0.; //Neuman out-the-money
FEMSolution:         f=a.ssor3(c,fm);
FEMSolution:         f0=strike*Math.exp(-rate*time);
FEMSolution: 
FEMSolution:       } else if (scheme.equals(jbone.AMPUT)) {         //===== American =======
FEMSolution:         double[] min = new double[f.length];
FEMSolution:         double[] max = new double[f.length];
FEMSolution:         for (int i=0; i<=n; i++) { 
FEMSolution:           xxi=xx0+(i-1)*dxx;
FEMSolution:           min[i]=Math.exp((0.25*k2m1*k2m1 +k1)*tau) *
FEMSolution:                  Math.max(0., Math.exp(0.5*k2m1*xxi) -
FEMSolution:                               Math.exp(0.5*k2p1*xxi)  );
FEMSolution:           max[i]=Double.POSITIVE_INFINITY;
FEMSolution:           fm[i]=Math.max(min[i],f[i]);                 //IC interpolation error
FEMSolution:         }
FEMSolution:         a.setL(1, 0.);a.setD(1,1.);a.setR(1,0.);       //Dirichlet in-the-money
FEMSolution:         c[1]=Math.max(min[1],Math.exp(0.5*k2m1*xx0+0.25*k2m1*k2m1*tau));
FEMSolution:         a.setL(n,-1.);a.setD(n,1.);a.setR(n,0.);c[n]=0.; //Neuman out-the-money
FEMSolution:         double precision = strike*Math.pow(10.,-6);      //Relative to strike
FEMSolution:         int maxIter = 30;
FEMSolution:         double w = 1.2;                                //Relaxation parameter
FEMSolution:         f=a.ssor3(c,fm,min,max,precision,w,maxIter);   //Projected-SSOR
FEMSolution:         f0=strike;
FEMSolution:       }
FEMSolution:       
FEMSolution:       //===== Interpolate back from lognormal to financial mesh variables
FEMSolution:       j=1; x0=x[0]; x1=x0; fp[0]=f0;
FEMSolution:       xxi=xx0; f1=f[1]*strike*Math.exp(-0.5*k2m1*xxi-(0.25*k2m1*k2m1+k1)*tau);
FEMSolution:       for (int i=1; i<n; i++) { //Loop over financial mesh index
FEMSolution:         while (x[i]>=x1){
FEMSolution:           j++;x0=x1;f0=f1;xxi=xx0+(j-1)*dxx;x1=strike*Math.exp(xxi);
FEMSolution:         }
FEMSolution:         f1=f[j]*strike*Math.exp(-0.5*k2m1*xxi-(0.25*k2m1*k2m1+k1)*tau);
FEMSolution:         fp[i]= f0 + (x[i]-x0)/(x1-x0)*(f1-f0);
FEMSolution:       }
FEMSolution:       xxi=Math.log(x[n]/strike);
FEMSolution:       fp[n]=f[n]*strike*Math.exp(-0.5*k2m1*xxi-(0.25*k2m1*k2m1+k1)*tau);
FEMSolution: 
FEMSolution:     } else if(pde.equals(jbone.EXERCISE)
FEMSolution:              && scheme.equals(jbone.EXC3_01)){             
FEMSolution:       //=======================================================================
FEMSolution:       //  FEM - Exercise 3.01
FEMSolution:       //=======================================================================
FEMSolution:       //INCLUDE_sol3.01.java_INCLUDE//
FEMSolution: 
FEMSolution:     } else if(pde.equals(jbone.EXERCISE)
FEMSolution:              && scheme.equals(jbone.EXC3_02)){             
FEMSolution:       //=======================================================================
FEMSolution:       //  FEM - Exercise 3.02
FEMSolution:       //=======================================================================
FEMSolution:       //INCLUDE_sol3.02.java_INCLUDE//
FEMSolution: 
FEMSolution:     } else if(pde.equals(jbone.EXERCISE)
FEMSolution:              && scheme.equals(jbone.EXC3_03)){             
FEMSolution:       //=======================================================================
FEMSolution:       //  FEM - Exercise 3.03
FEMSolution:       //=======================================================================
FEMSolution:       //INCLUDE_sol3.03.java_INCLUDE//
FEMSolution: 
FEMSolution:     } else if(pde.equals(jbone.EXERCISE)
FEMSolution:               && scheme.equals(jbone.EXC3_04)){             
FEMSolution:       //=======================================================================
FEMSolution:       //  FEM - Exercise 3.04
FEMSolution:       //=======================================================================
FEMSolution:       //INCLUDE_sol3.04.java_INCLUDE//
FEMSolution: 
FEMSolution:     } else if(pde.equals(jbone.EXERCISE)
FEMSolution:              && scheme.equals(jbone.EXC3_05)){             
FEMSolution:       //=======================================================================
FEMSolution:       //  FEM - Exercise 3.05
FEMSolution:       //=======================================================================
FEMSolution:       //INCLUDE_sol3.05.java_INCLUDE//
FEMSolution: 
FEMSolution:     } else if(pde.equals(jbone.EXERCISE)
FEMSolution:              && scheme.equals(jbone.EXC3_07)){             
FEMSolution:       //=======================================================================
FEMSolution:       //  FEM - Exercise 3.07
FEMSolution:       //=======================================================================
FEMSolution:       //INCLUDE_sol3.07.java_INCLUDE//
FEMSolution: 
FEMSolution:     } else if(pde.equals(jbone.EXERCISE)
FEMSolution:               && scheme.equals(jbone.EXCC_01)){             
FEMSolution:       //=======================================================================
FEMSolution:       //  FEM - Exercise C.01
FEMSolution:       //=======================================================================
FEMSolution:       //INCLUDE_solC.01.java_INCLUDE//
FEMSolution:     
FEMSolution:     } else if(pde.equals(jbone.EXERCISE)
FEMSolution:               && scheme.equals(jbone.MY_SCHEME)){           
FEMSolution:       //=======================================================================
FEMSolution:       //  FEM - Project 1
FEMSolution:       //=======================================================================
FEMSolution:       //INCLUDE_prj3.01.java_INCLUDE//
FEMSolution: 
FEMSolution:     } else if(pde.equals(jbone.EXERCISE)
FEMSolution:               && scheme.equals(jbone.MY_SCHEME_2)){         
FEMSolution:       //=======================================================================
FEMSolution:       //  FEM - Project 2
FEMSolution:       //=======================================================================
FEMSolution:       //INCLUDE_prj3.02.java_INCLUDE//
FEMSolution: 
FEMSolution:     } // if
FEMSolution: 
FEMSolution:     if(isDefined)
FEMSolution:       shiftLevels();
FEMSolution:     return isDefined;
FEMSolution:   } // next
FEMSolution: 
FEMSolution:                                                             
FEMSolution:   /** Take the solution backward one step to initialize schemes 
FEMSolution:       with 3 time levels; not really appropriate in this context.
FEMSolution:       @param runData List of run parameters
FEMSolution:       @return False since it is not used here
FEMSolution:   ****************************************************************************/
FEMSolution:   public boolean previous(RunData runData, PhysData physData){ return false; }
FEMSolution: 
FEMSolution:   /** Tells whether the solution implements a option
FEMSolution:          @param option The the option to implement
FEMSolution:          @return True if the option is implemented
FEMSolution:          @see jbone#pdeNames
FEMSolution:          @see jbone#schemeNames
FEMSolution:   */
FEMSolution:   public boolean hasOption(String option){
FEMSolution:     try {
FEMSolution:       if(option.equals(jbone.ADVECTION))
FEMSolution:  return true;
FEMSolution:       else if(option.equals(jbone.BSCHOLES))
FEMSolution:  return true;
FEMSolution:       else if (option.equals(jbone.EXERCISE))
FEMSolution:  return true;
FEMSolution:       else if (pde.equals(jbone.ADVECTION) && option.equals(jbone.TUNFEM))
FEMSolution:  return true;
FEMSolution:       else if (pde.equals(jbone.BSCHOLES) && option.equals(jbone.AMPUT))
FEMSolution:  return true;
FEMSolution:       else if (pde.equals(jbone.BSCHOLES) && option.equals(jbone.EUPUT))
FEMSolution:  return true;
FEMSolution:       else if (pde.equals(jbone.BSCHOLES) && option.equals(jbone.AMNAIVE))
FEMSolution:  return true;
FEMSolution:       else if (pde.equals(jbone.BSCHOLES) && option.equals(jbone.EUNAIVE))
FEMSolution:  return true;
FEMSolution:       else if (pde.equals(jbone.EXERCISE) && option.equals(jbone.EXC3_01))
FEMSolution:  return true;
FEMSolution:       else if (pde.equals(jbone.EXERCISE) && option.equals(jbone.EXC3_02))
FEMSolution:  return true;
FEMSolution:       else if (pde.equals(jbone.EXERCISE) && option.equals(jbone.EXC3_03))
FEMSolution:  return true;
FEMSolution:       else if (pde.equals(jbone.EXERCISE) && option.equals(jbone.EXC3_04))
FEMSolution:  return true;
FEMSolution:       else if (pde.equals(jbone.EXERCISE) && option.equals(jbone.EXC3_05))
FEMSolution:  return true;
FEMSolution:       else if (pde.equals(jbone.EXERCISE) && option.equals(jbone.EXC3_07))
FEMSolution:  return true;
FEMSolution:       else if (pde.equals(jbone.EXERCISE) && option.equals(jbone.EXCC_01))
FEMSolution:  return true;
FEMSolution:       else if (pde.equals(jbone.EXERCISE) && option.equals(jbone.MY_SCHEME))
FEMSolution:  return true;
FEMSolution:       else if (pde.equals(jbone.EXERCISE) && option.equals(jbone.MY_SCHEME_2))
FEMSolution:  return true;
FEMSolution:       return false;
FEMSolution:     } catch (NullPointerException e){
FEMSolution:       return false;
FEMSolution:     } // try
FEMSolution:   } // hasOption
FEMSolution: 
FEMSolution: } // class FEMSolution
FFT: /* $Id: FFT.java,v 1.6 1999/08/19 14:33:30 andrej Exp $ */
FFT: 
FFT: /***************************************************************************
FFT:  * FFT - Object oriented Fast Fourier Transfrom package.
FFT:  *       Adapted with minimal changes to routines from "Numerical Recipes",
FFT:  *       W.H.Press et al., Cambridge University Press (1986)
FFT:  ***************************************************************************/
FFT: public class FFT {
FFT:   /* Array dimension                   */   public int size;
FFT:   /* Label configuration space         */   final static int inXSpace  =-1;
FFT:   /* Label Fourier space               */   final static int inKSpace  = 1;
FFT:   /* Label complex number              */   final static int bothParts = 0;
FFT:   /* Label real part or 1st transform  */   final static int firstPart = 1;
FFT:   /* Label imag. part or 2nd transform */   final static int secondPart= 2;
FFT: 
FFT:   /* Current space location            */   protected int location;
FFT:   /* Dataset stored internally         */   protected Complex[] data;
FFT:   /* True if two real datasets         */   protected boolean isTwoReals;
FFT:   /* NR definition                     */   protected final int toFourier= +1;
FFT:   /* NR definition                     */   protected final int toConfig = -1;
FFT:   
FFT:   
FFT:   /** FFT object constructed from ONE complex array of dimension power(n,2).
FFT:       @param arg Complex array
FFT:       @param location Either inXSpace or inKSpace
FFT:   ****************************************************************************/
FFT:   public FFT(Complex arg[], int location) { 
FFT:     this.location = location; isTwoReals = false;
FFT:     size = arg.length;
FFT:     data    = new Complex[size];
FFT:     for (int k=0; k<size; k++) {
FFT:       data[k] = arg[k];
FFT:     }
FFT:   }
FFT:   
FFT:   
FFT:   /** FFT object constructed from ONE real array of dimension power(n,2).
FFT:       @param arg Real array
FFT:       @param location Either inXSpace or inKSpace
FFT:   ****************************************************************************/
FFT:   public FFT(double arg[], int location) { 
FFT:     this.location = location; isTwoReals = true;
FFT:     size = arg.length;
FFT:     data    = new Complex[size];
FFT:     for (int k=0; k<size; k++) {
FFT:       data[k] = new Complex(arg[k], 0.);
FFT:     }
FFT:   }
FFT:    
FFT:    
FFT:   /** FFT object constructed out of TWO complex arrays of dimension power(n,2).
FFT:       @param arg1 First dataset
FFT:       @param arg2 Second dataset
FFT:       @param location Either inXSpace or inKSpace
FFT:   ****************************************************************************/
FFT:   public FFT(Complex arg1[], Complex arg2[], int location) { 
FFT:     this.location = location; isTwoReals = true;
FFT:     size = arg1.length;
FFT:     data = new Complex[size];
FFT:     for (int k=0; k<size; k++) {
FFT:       data[k] = arg1[k].add((Complex.i).mul(arg2[k]));
FFT:     }
FFT:   }
FFT:    
FFT:    
FFT:   /** FFT object constructed out of TWO real arrays of dimension power(n,2).
FFT:       @param arg1 First dataset
FFT:       @param arg2 Second dataset
FFT:       @param location Either inXSpace or inKSpace
FFT:   ****************************************************************************/
FFT:   public FFT(double arg1[], double arg2[], int location) { 
FFT:     this.location = location; isTwoReals = true;
FFT:     size = arg1.length;
FFT:     data = new Complex[size];
FFT:     for (int k=0; k<size; k++) {
FFT:       data[k] = new Complex(arg1[k],arg2[k]);
FFT:     }
FFT:   }
FFT:   
FFT:   
FFT:   /** FFT object constructed from another FFT object
FFT:       @param fft An FFT object to be duplicated
FFT:   ****************************************************************************/
FFT:   public FFT(FFT fft) { 
FFT:     this.size = fft.size;
FFT:     this.location = fft.location; 
FFT:     this.isTwoReals = fft.isTwoReals;
FFT:     for (int k=0; k<size; k++)
FFT:       this.data[k]=fft.data[k];
FFT:   }
FFT:   
FFT:   
FFT:   /** Transform array to Fourier space.
FFT:       @param index bothParts = complex number,
FFT:                    firstPart = real part or first transform if there is two, 
FFT:                    secondPart = imaginary part or second transform.
FFT:       @param units to scale with for physical results
FFT:       @return Complex array in Fourier space. 
FFT:               If isTwoReals, the real and imaginary parts contain the result
FFT:               of transforms of two real numbers.
FFT:       @see FFT
FFT:   ****************************************************************************/
FFT:   public Complex[] getFromKSpace(int index, double units) {
FFT:     Complex[] sol = new Complex[size];
FFT:     if (location == inXSpace) { 
FFT:       if (isTwoReals) { 
FFT:         if (index == firstPart) {
FFT:            Complex[] trash = new Complex[size];
FFT:            twofft(data, sol, trash, size); }
FFT:         else if (index == secondPart) {
FFT:            Complex[] trash = new Complex[size];
FFT:            twofft(data, trash, sol, size); }
FFT:         else { //index == bothParts
FFT:            for (int k=0; k<size; k++) sol[k]=data[k];
FFT:            four1(sol, size, toFourier);
FFT:         }
FFT:         location = inXSpace;       //Don't want to store two spectra inKSpace
FFT:         for (int k=0; k<size; k++) 
FFT:            sol[k]=sol[k].scale(1./units);
FFT:       } else { //
FFT:         four1(data, size, toFourier);
FFT:         location = inKSpace;
FFT:         for (int k=0; k<size; k++) 
FFT:            sol[k]=data[k].scale(1./units);
FFT:       }
FFT:     } else { 
FFT:       for (int k=0; k<size; k++) sol[k]=data[k];
FFT:     }
FFT:     return sol; 
FFT:   }
FFT:   
FFT:   
FFT:   /** Transform array to Fourier space and returns a real array depending 
FFT:       on the argument.
FFT:       @param index firstPart = real part or first transform if there is two, 
FFT:                    secondPart = imaginary part or second transform.
FFT:       @param units to scale with for physical results
FFT:       @return Real array in Fourier space. 
FFT:       @see FFT
FFT:   ****************************************************************************/
FFT:   public double[] getFromKSpacePart(int index, double units) {
FFT:     Complex[] in = new Complex[size];
FFT:     double[] out = new double[size];
FFT:     in = this.getFromKSpace(index, units);
FFT:     for (int k=0; k<size; k++) {
FFT:       if (index==firstPart) out[k] = in[k].re();
FFT:       else                  out[k] = in[k].im();
FFT:     }
FFT:     return out;
FFT:   }
FFT:   
FFT:   
FFT:   /** Transform array to configuration space.
FFT:       @param units to scale with for physical results
FFT:       @return Complex array in X space. 
FFT:               If isTwoReals, the real and imaginary parts contain the 
FFT:               result of two real transforms.
FFT:       @see FFT
FFT:   ****************************************************************************/
FFT:   public Complex[] getFromXSpace(double units) {
FFT:     if (location == inKSpace) {
FFT:       four1(data, size, toConfig);               //Inverse transfrom
FFT:       for (int k=0; k<size; k++)                 //  and normalization
FFT:         data[k]=data[k].scale(units/(double)(size));
FFT:       location = inXSpace;
FFT:     }
FFT:     return data;
FFT:   }
FFT:   
FFT:   
FFT:   /** Transform array to configuration space.
FFT:       @param index firstPart = real part or first transform, 
FFT:                    secondPart = iminary part or second transform.
FFT:       @param units to scale with for physical results
FFT:       @return Real or imaginary part of a complex array in Xspace. 
FFT:               If isTwoReals, the real and imaginary parts contain the result
FFT:               of two real transforms.
FFT:       @see FFT
FFT:   ****************************************************************************/
FFT:   public double[] getFromXSpacePart(int index, double units) {
FFT:     Complex[] in = new Complex[size];
FFT:     double[] out = new double[size];
FFT:     in = this.getFromXSpace(units);
FFT:     for (int k=0; k<size; k++) {
FFT:       if (index==1) out[k] = in[k].re();
FFT:       else          out[k] = in[k].im();
FFT:     }
FFT:     return out;
FFT:   }
FFT:   
FFT:                                                           
FFT:   /** Computes the convolution of two REAL numbers stored in the real and 
FFT:       imaginary part of the data[] array which has previously been initialized.
FFT:       This is implement here WITHOUT any spectral expansion to show the 
FFT:       effect of ALIASING in nonlinear problems.
FFT:       @param units to scale with for physical results
FFT:       @return Result of the convolution (carefull ALIASED !)
FFT:       @see FFT
FFT:   ****************************************************************************/
FFT:   public Complex[] aliasedConvolution(double units) {
FFT:     Complex[] out = new Complex[size];
FFT:     Complex[] re = new Complex[size];
FFT:     Complex[] im = new Complex[size];
FFT:     
FFT:     four1(data, size, toFourier);                          //Transform 2 fields
FFT: 
FFT:     for (int k=0; k<size; k++)                               //Convolution =
FFT:      data[k]=new Complex(data[k].re()*data[k].im()/units,0.);// Fourier product
FFT: 
FFT:     four1(data, size, toConfig);                           //Inverse transform
FFT:     
FFT:     for (int k=0; k<size; k++)
FFT:       data[k]=data[k].scale(units/(double)(size));         //Rescale
FFT:     
FFT:     return data;
FFT:   }
FFT:   
FFT:   
FFT:                                                           
FFT:   /** Computes the convolution of two REAL numbers stored in the real and
FFT:       imaginary part of the data[] array which has previously been initialized.
FFT:       Here, the spectrum is temporarily extended to twice its original size
FFT:       by padding the transforms with zeros.
FFT:       @param units to scale with for physical results
FFT:       @return Result of a correct convolution (with no aliasing).
FFT:       @see FFT
FFT:   ****************************************************************************/
FFT:   public Complex[] expandedConvolution(double units) {
FFT:     Complex[] dExp= new Complex[2*size];
FFT:     Complex[] re= new Complex[2*size];
FFT:     Complex[] im= new Complex[2*size];
FFT:     
FFT:     for (int k=0; k<2*size-1; k++)                         //Initialize
FFT:       dExp[k]=new Complex(0.);
FFT: 
FFT:     dExp[0]=data[0];
FFT:     for (int k=1; k<=size/2; k++) {                        //Expand array
FFT:       dExp[k       ]=data[k];
FFT:       dExp[2*size-k]=data[size-k];
FFT:     }
FFT:     
FFT:     four1(dExp, 2*size, toFourier);                        //Transform 2 fields
FFT:     
FFT:     for (int k=0; k<2*size; k++)                             //Convolution =
FFT:      dExp[k]=new Complex(dExp[k].re()*dExp[k].im()/units,0.);// Fourier product
FFT:     
FFT:     four1(dExp, 2*size, toConfig);                         //Inverse transform
FFT:     
FFT:     data[0]=dExp[0];
FFT:     for (int k=1; k<=size/2; k++) {                        //Rescale
FFT:       data[k     ]=dExp[k].scale(units/(double)(2*size));
FFT:       data[size-k]=dExp[2*size-k].scale(1./(double)(2*size));
FFT:     }
FFT:     return data;
FFT:   }
FFT:    
FFT:    
FFT:   /** Fast Fourier transforms of two real arrays of dimension power(n,2).
FFT:       Given a complex input array formed by packing two real arrays into
FFT:       real and imaginary parts, this routine calls four1() and returns 
FFT:       two complex output arrays fft1[0:n-1] and fft2[0:n-1], each of complex 
FFT:       length n, which contain the discrete transforms of the respective 
FFT:       data arrays.
FFT:       Adapted with minimal changes from "Numerical Recipes", W.H.Press et al., 
FFT:       Cambridge University Press (1986)
FFT:   ****************************************************************************/
FFT:   protected void twofft(Complex datac[], 
FFT:                         Complex fft1[], Complex fft2[], int n){
FFT:     Complex h1 = new Complex();
FFT:     Complex h2 = new Complex();
FFT:     Complex c1 = new Complex(0.5, 0.0);
FFT:     Complex c2 = new Complex(0.0,-0.5);
FFT:     
FFT:     for (int j=0;j<n;j++)
FFT:       fft1[j] = datac[j];                        //datac[] remains preserved
FFT: 
FFT:     four1(fft1,n,1);                             //Transform
FFT: 
FFT:     fft2[0]=new Complex(fft1[0].im(), 0.0);
FFT:     fft1[0]=new Complex(fft1[0].re(), 0.0);
FFT:     for (int j=1,k=n-j;j<=n/2;j++,k--) {
FFT:       h1=fft1[j]; h1=h1.add(fft1[k].conj()); h1=h1.mul(c1);
FFT:       h2=fft1[j]; h2=h2.sub(fft1[k].conj()); h2=h2.mul(c2);
FFT:       fft1[j]=h1; fft1[k]=h1.conj();
FFT:       fft2[j]=h2; fft2[k]=h2.conj();
FFT:     }
FFT:   }
FFT:    
FFT:    
FFT:   /** Fast Fourier transform of one complex array of dimension power(n,2).
FFT:       Replaces datac[0:n-1] by its discrete Fourier transform, if isign is 1,
FFT:       or replaces datac[0:n-1] by n times its inverse discrete Fourier 
FFT:       transform, if isign is input as -1. 
FFT:       Adapted with minimal changes from "Numerical Recipes", W.H.Press et al., 
FFT:       Cambridge University Press (1986)
FFT:   ****************************************************************************/
FFT:   protected void four1(Complex datac[], int nh, int isign){
FFT:     int n,mmax,m,j,i,istep = 0;
FFT:     double wtemp,wr,wpr,wpi,wi,theta;
FFT:     double tempr,tempi;
FFT: 
FFT:     n = nh << 1;                                 //Interface Complex to real
FFT:     double[] data = new double[n+2];
FFT:     for (int k=1;k<=nh;k++) {
FFT:       data[2*k-1]=datac[k-1].re(); 
FFT:       data[2*k  ]=datac[k-1].im();
FFT:     }
FFT:     
FFT:     j=1;                                         //Bit reversal section
FFT:     for (i=1;i<n;i+=2) {
FFT:       if (j > i) {                               //Swap 2 complex numbers
FFT:         tempr=data[j  ];
FFT:         tempi=data[j+1];
FFT:         data[j  ]=data[i  ];
FFT:         data[j+1]=data[i+1];
FFT:         data[i  ]=tempr;
FFT:         data[i+1]=tempi;
FFT:       }
FFT:       m=n >> 1;
FFT:       while (m >= 2 && j > m) {
FFT:         j -= m;
FFT:         m >>= 1;
FFT:       }
FFT:       j += m;
FFT:     }
FFT:     mmax=2;                                      //Danielson-Lanczos section
FFT:     while (n > mmax) {                           //  executed log_2(n) times
FFT:       istep=2*mmax;
FFT:       theta=2*Math.PI/(isign*mmax);              //Initialize trigonometric
FFT:       wtemp=Math.sin(0.5*theta);                 //  recurence
FFT:       wpr = -2.0*wtemp*wtemp;
FFT:       wpi=Math.sin(theta);
FFT:       wr=1.0;
FFT:       wi=0.0;
FFT:       for (m=1;m<mmax;m+=2) {                    //Two nested inner loops
FFT:         for (i=m;i<=n;i+=istep) {
FFT:             j=i+mmax;                            //Danielson-Lanczos formula
FFT:             tempr=wr*data[j  ]-wi*data[j+1];
FFT:             tempi=wr*data[j+1]+wi*data[j];
FFT:             data[j  ]=data[i  ]-tempr;
FFT:             data[j+1]=data[i+1]-tempi;
FFT:             data[i  ] += tempr;
FFT:             data[i+1] += tempi;
FFT:         }
FFT:         wtemp=wr;                                //Trigonometric recurrence
FFT:         wr=wtemp*wpr-wi*wpi+wr;
FFT:         wi=wi*wpr+wtemp*wpi+wi;
FFT:       }
FFT:       mmax=istep;
FFT:     }
FFT:     for (int k=1;k<=nh;k++)                      //Back to Complex
FFT:       datac[k-1] = new Complex(data[2*k-1], data[2*k]);
FFT:   }
FFT:   
FFT: }
FFTSolution: /* $Id: FFTSolution.java,v 1.30 2001/01/15 14:22:21 andrej Exp $ */
FFTSolution: 
FFTSolution: /******************************************************************************
FFTSolution: * FFTsolution - Fast Fourier Transform solver
FFTSolution: *    @see FluidSolution
FFTSolution: *    @see Solution
FFTSolution: ******************************************************************************/
FFTSolution: public class FFTSolution extends FluidSolution{
FFTSolution:   public FFTSolution(RunData runData){
FFTSolution:     super(runData);
FFTSolution:   } // FFTSolution
FFTSolution: 
FFTSolution:   /** FFT previous (or initial) step   */  protected  FFT keepFFT;
FFTSolution:   /** FFT tool                         */  protected  FFT toolFFT;
FFTSolution:   
FFTSolution:                                                            
FFTSolution:   /** Discretize the initial Shape function and initialize the moments
FFTSolution:       @param function The initial shape to be approximated
FFTSolution:   ****************************************************************************/
FFTSolution:   public void discretize(ShapeFunction function){
FFTSolution:     double boxLen = mesh.size()*mesh.interval(0);
FFTSolution:     super.discretize(function);
FFTSolution:     keepFFT  = new FFT(f,  FFT.inXSpace);        //Load into FFT transformer
FFTSolution:   } // discretize
FFTSolution:   
FFTSolution:   
FFTSolution:   /** Advance the solution forward one step in time.
FFTSolution:       The equation is set by the internal variable pde and 
FFTSolution:       the numerical scheme by the internal variable scheme
FFTSolution:       @param runData List of run parameters
FFTSolution:       @see RunData
FFTSolution:       @return True if a scheme is implemented for that equation
FFTSolution:   ****************************************************************************/
FFTSolution:   public boolean next(RunData runData, PhysData physData) {
FFTSolution:     boolean isForward = false;
FFTSolution:     boolean isDefined = true;
FFTSolution:     
FFTSolution:     for (int i=0; i<f.length; i++) { gp[i]=g[i]; }       // Plot initial value
FFTSolution:     
FFTSolution:     if(pde.equals(jbone.ADVECTION) 
FFTSolution:        && (scheme.equals(jbone.ALIASED)||
FFTSolution:            scheme.equals(jbone.EXPAND )  )){                 
FFTSolution:       //=======================================================================
FFTSolution:       //  FFT - Advection/diffusion - No problem with aliasing if linear
FFTSolution:       //=======================================================================
FFTSolution:       double timeStep= runData.getParamValue(runData.timeStepNm);
FFTSolution:       double velocity= runData.getParamValue(runData.velocityNm);
FFTSolution:       double diffusCo= runData.getParamValue(runData.diffusionNm);
FFTSolution:       double disperCo= runData.getParamValue(runData.dispersionNm);
FFTSolution: 
FFTSolution:       int N          = f.length;                         //Power of 2
FFTSolution:       double boxLen  = N*dx[0];                          //Periodicity length
FFTSolution:       Complex exp    = new Complex(); 
FFTSolution:       Complex total  = new Complex();
FFTSolution:       Complex[] s0   = new Complex[N];
FFTSolution:       
FFTSolution:       s0=keepFFT.getFromKSpace(FFT.firstPart,boxLen);    //FFT real to KSpace
FFTSolution:                                                          //  only once
FFTSolution:       s[0] = s0[0];
FFTSolution:       for (int m=1;  m<N/2+1;  m++) {
FFTSolution:         double  km     = 2.*m*Math.PI/boxLen;
FFTSolution:         Complex ikm1   = new Complex(  0.  ,    km   );
FFTSolution:         Complex ikm2   = new Complex(-km*km,    0.   );
FFTSolution:         Complex ikm3   = new Complex(  0.  ,-km*km*km);
FFTSolution:         Complex advection = new Complex(ikm1.scale(velocity));
FFTSolution:         Complex diffusion = new Complex(ikm2.scale(diffusCo));
FFTSolution:         Complex dispersion= new Complex(ikm3.scale(disperCo));
FFTSolution:         total=advection.add(diffusion);
FFTSolution:         exp=(total.scale(time)).exp();                   //Propagate directly
FFTSolution:         s[m  ] = s0[m].mul(exp);                         //  from initial cond
FFTSolution:         s[N-m] = s[m].conj();                            //Here f is real
FFTSolution:       }
FFTSolution:       FFT ffts = new FFT(s,FFT.inKSpace);                //Initialize Kspace
FFTSolution: 
FFTSolution:       f = ffts.getFromXSpacePart(FFT.firstPart,boxLen);  //FFT back for plot
FFTSolution: 
FFTSolution:     } else  if((pde.equals(jbone.KDV)||
FFTSolution:                 pde.equals(jbone.BURGER)) 
FFTSolution:                 && (scheme.equals(jbone.ALIASED)||
FFTSolution:                     scheme.equals(jbone.EXPAND )  )){        
FFTSolution:       //=======================================================================
FFTSolution:       //  FFT - KdV solitons and Burger's shocks - Aliasing here is an issue
FFTSolution:       //=======================================================================
FFTSolution:       double timeStep= runData.getParamValue(runData.timeStepNm);
FFTSolution:       double velocity= runData.getParamValue(runData.velocityNm);
FFTSolution:       double diffusCo= runData.getParamValue(runData.diffusionNm);
FFTSolution:       double disperCo= runData.getParamValue(runData.dispersionNm);
FFTSolution: 
FFTSolution:       int N          = f.length;                         //Power of 2
FFTSolution:       double boxLen  = N*dx[0];                          //Periodicity length
FFTSolution:       Complex exp    = new Complex(); 
FFTSolution:       Complex nonlin = new Complex();
FFTSolution:       Complex linear = new Complex();
FFTSolution:       Complex total  = new Complex();
FFTSolution:       Complex[] s0   = new Complex[N];
FFTSolution:       
FFTSolution:       //----- Non-linear term: convolution               
FFTSolution:       s  = keepFFT.getFromKSpace(FFT.bothParts,boxLen);  //Current Spectrum
FFTSolution:       toolFFT = new FFT(s,s,FFT.inKSpace);               //  for convolution
FFTSolution: 
FFTSolution:       if (scheme.equals(jbone.ALIASED))                  //With-/out aliasing,
FFTSolution:         sp = toolFFT.aliasedConvolution(boxLen);         //  use an FFT to
FFTSolution:       else //scheme.equals(jbone.EXPAND)                 //  calculate product,
FFTSolution:         sp = toolFFT.expandedConvolution(boxLen);        //  FFT back to KSpace
FFTSolution:       
FFTSolution:       
FFTSolution:       //----- Linear terms: complex terms in spectrum s  
FFTSolution:       s = keepFFT.getFromKSpace(FFT.bothParts,boxLen);   //Current Spectrum
FFTSolution:       linear= s[0];
FFTSolution:       sp[0]=linear;
FFTSolution:       for (int m=1;  m<=N/2;  m++) {
FFTSolution:         double  km     = 2.*m*Math.PI/boxLen;
FFTSolution:         Complex ikm1   = new Complex(  0.  ,    km   );
FFTSolution:         Complex ikm2   = new Complex(-km*km,    0.   );
FFTSolution:         Complex ikm3   = new Complex(  0.  ,-km*km*km);
FFTSolution:         Complex advection = new Complex(ikm1.scale(velocity));
FFTSolution:         Complex diffusion = new Complex(ikm2.scale(diffusCo));
FFTSolution:         Complex dispersion= new Complex(ikm3.scale(disperCo));
FFTSolution:         total=advection.add(diffusion);
FFTSolution:         total=total.add(dispersion);
FFTSolution:         exp=(total.scale(timeStep)).exp();
FFTSolution:         linear    = s[m].mul(exp);
FFTSolution:         nonlin    = sp[m].mul(ikm1.scale(0.5*timeStep));
FFTSolution:         sp[m  ]   = linear.add(nonlin);
FFTSolution:         if (m<N/2) sp[N-m] = sp[m].conj();               //For a real spectrum
FFTSolution:       }
FFTSolution: 
FFTSolution:       keepFFT = new FFT(sp,FFT.inKSpace);                //Spectrum is complete
FFTSolution:       toolFFT = new FFT(sp,FFT.inKSpace);                //inv FFT for plotting
FFTSolution:       f=toolFFT.getFromXSpacePart(FFT.firstPart,boxLen);
FFTSolution: 
FFTSolution:     } else if(pde.equals(jbone.EXERCISE)
FFTSolution:              && scheme.equals(jbone.EXC4_01)){             
FFTSolution:       //=======================================================================
FFTSolution:       //  FFT - Exercise 4.01
FFTSolution:       //=======================================================================
FFTSolution:       //INCLUDE_sol4.01.java_INCLUDE//
FFTSolution: 
FFTSolution:     } else if(pde.equals(jbone.EXERCISE)
FFTSolution:              && scheme.equals(jbone.EXC4_02)){             
FFTSolution:       //=======================================================================
FFTSolution:       //  FFT - Exercise 4.02
FFTSolution:       //=======================================================================
FFTSolution:       //INCLUDE_sol4.02.java_INCLUDE//
FFTSolution: 
FFTSolution:     } else if(pde.equals(jbone.EXERCISE)
FFTSolution:              && scheme.equals(jbone.EXC4_03)){             
FFTSolution:       //=======================================================================
FFTSolution:       //  FFT - Exercise 4.03
FFTSolution:       //=======================================================================
FFTSolution:       //INCLUDE_sol4.03.java_INCLUDE//
FFTSolution: 
FFTSolution:     } else if(pde.equals(jbone.EXERCISE)
FFTSolution:               && scheme.equals(jbone.EXC4_04)){             
FFTSolution:       //=======================================================================
FFTSolution:       //  FFT - Exercise 4.04
FFTSolution:       //=======================================================================
FFTSolution:       //INCLUDE_sol4.04.java_INCLUDE//
FFTSolution: 
FFTSolution:     } else if(pde.equals(jbone.EXERCISE)
FFTSolution:              && scheme.equals(jbone.EXC4_05)){             
FFTSolution:       //=======================================================================
FFTSolution:       //  FFT - Exercise 4.05
FFTSolution:       //=======================================================================
FFTSolution:       //INCLUDE_sol4.05.java_INCLUDE//
FFTSolution: 
FFTSolution:     } else if(pde.equals(jbone.EXERCISE)
FFTSolution:               && scheme.equals(jbone.EXCD_01)){             
FFTSolution:       //=======================================================================
FFTSolution:       //  FFT - Exercise D.01
FFTSolution:       //=======================================================================
FFTSolution:       //INCLUDE_solD.01.java_INCLUDE//
FFTSolution:     
FFTSolution:     } else if(pde.equals(jbone.EXERCISE)
FFTSolution:               && scheme.equals(jbone.MY_SCHEME)){           
FFTSolution:       //=======================================================================
FFTSolution:       //  FFT - Project 1
FFTSolution:       //=======================================================================
FFTSolution:       //INCLUDE_prj4.01.java_INCLUDE//
FFTSolution: 
FFTSolution:     } else if(pde.equals(jbone.EXERCISE)
FFTSolution:               && scheme.equals(jbone.MY_SCHEME_2)){         
FFTSolution:       //=======================================================================
FFTSolution:       //  FFT - Project 2
FFTSolution:       //=======================================================================
FFTSolution:       //INCLUDE_prj4.02.java_INCLUDE//
FFTSolution: 
FFTSolution:     }
FFTSolution:     
FFTSolution:     if(isDefined && isForward)
FFTSolution:       shiftLevels();
FFTSolution:     return isDefined;
FFTSolution:   } // next
FFTSolution:   
FFTSolution:   
FFTSolution:   /** Starting procedure for FFT schemes.
FFTSolution:       @param runData List of run parameters
FFTSolution:       @see RunData
FFTSolution:       @return True if an initialisation scheme is implemented for that equation
FFTSolution:   ****************************************************************************/
FFTSolution:   public boolean previous(RunData runData, PhysData physData){
FFTSolution:     int n=f.length-1;
FFTSolution:     boolean isDefined=false;
FFTSolution:     return isDefined;
FFTSolution:   } // previous
FFTSolution: 
FFTSolution:   /** Tells whether the solution implements a option
FFTSolution:          @param option The the option to implement
FFTSolution:          @return True if the option is implemented
FFTSolution:          @see jbone#pdeNames
FFTSolution:          @see jbone#schemeNames
FFTSolution:   */
FFTSolution:   public boolean hasOption(String option){
FFTSolution:     try {
FFTSolution:       if(option.equals(jbone.ADVECTION))
FFTSolution:  return true;
FFTSolution:       else if (option.equals(jbone.BURGER))
FFTSolution:  return true;
FFTSolution:       else if (option.equals(jbone.KDV))
FFTSolution:  return true;
FFTSolution:       else if (option.equals(jbone.EXERCISE))
FFTSolution:         return true;
FFTSolution:       else if ((pde.equals(jbone.ADVECTION)||
FFTSolution:                 pde.equals(jbone.KDV)||pde.equals(jbone.BURGER)) &&
FFTSolution:                (option.equals(jbone.ALIASED)||option.equals(jbone.EXPAND)))
FFTSolution:  return true;
FFTSolution:       else if (pde.equals(jbone.EXERCISE) && option.equals(jbone.EXC4_01))
FFTSolution:  return true;
FFTSolution:       else if (pde.equals(jbone.EXERCISE) && option.equals(jbone.EXC4_02))
FFTSolution:  return true;
FFTSolution:       else if (pde.equals(jbone.EXERCISE) && option.equals(jbone.EXC4_03))
FFTSolution:  return true;
FFTSolution:       else if (pde.equals(jbone.EXERCISE) && option.equals(jbone.EXC4_04))
FFTSolution:  return true;
FFTSolution:       else if (pde.equals(jbone.EXERCISE) && option.equals(jbone.EXC4_05))
FFTSolution:  return true;
FFTSolution:       else if (pde.equals(jbone.EXERCISE) && option.equals(jbone.EXCD_01))
FFTSolution:  return true;
FFTSolution:       else if (pde.equals(jbone.EXERCISE) && option.equals(jbone.MY_SCHEME))
FFTSolution:  return true;
FFTSolution:       else if (pde.equals(jbone.EXERCISE) && option.equals(jbone.MY_SCHEME_2))
FFTSolution:  return true;
FFTSolution:       return false;
FFTSolution:     } catch (NullPointerException e){
FFTSolution:       return false;
FFTSolution:     } // try
FFTSolution:   } // hasOption
FFTSolution: 
FFTSolution: } // class FFTSolution
FluidSolution: /* $Id: FluidSolution.java,v 1.13 2000/06/16 07:03:57 johanh Exp $ */
FluidSolution: 
FluidSolution: /*****************************************************************************
FluidSolution: * FluidSolution -- Is an abstract class at the top of all the solvers that 
FluidSolution: *   that operate directly on the fluid function.
FluidSolution: *   @version $Revision: 1.23 $
FluidSolution: *   @see Solution
FluidSolution: ******************************************************************************/
FluidSolution: abstract class FluidSolution extends Solution{        
FluidSolution: 
FluidSolution:   /** True if needs to shiftLevels */
FluidSolution:   protected boolean isForward = true;
FluidSolution: 
FluidSolution:   /** Creates a FluidSolution object.
FluidSolution:       @param runData The run time parameters
FluidSolution:   ****************************************************************************/
FluidSolution:   public FluidSolution(RunData runData){
FluidSolution:     super(runData);
FluidSolution:   } // FluidSolution
FluidSolution:   
FluidSolution:   /** Discretize the initial Shape function and initialize the moments
FluidSolution:       @param function The initial shape to be approximated
FluidSolution:   ****************************************************************************/
FluidSolution:   public void discretize(ShapeFunction function){
FluidSolution:     for (int j = 0; j < mesh.size(); j++){       //Discretizing is very simple
FluidSolution:       if (function.isComplex()){
FluidSolution:         f[j] = function.getValue(mesh, j);
FluidSolution:         h[j] = function.getValueC(mesh, j);
FluidSolution:         f0[j]= h[j].re();
FluidSolution:       } else {
FluidSolution:         f[j] = function.getValue(mesh, j);
FluidSolution:         f0[j] = f[j];
FluidSolution:       }
FluidSolution:       g[j] = 0.;
FluidSolution:     }
FluidSolution:     initialMoments[0]=calculateMoments(0);       //Set conserved quantities
FluidSolution:     initialMoments[1]=calculateMoments(1);
FluidSolution:     rescale();
FluidSolution:   } // discretize
FluidSolution: 
FluidSolution:   /** Internal function for copying new -> old 
FluidSolution:   ****************************************************************************/
FluidSolution:   protected void shiftLevels() {
FluidSolution:     for (int i=0;i<f.length;i++) {
FluidSolution:       fm[i]=f[i]; dfm[i]=df[i]; f[i]=fp[i]; df[i]=dfp[i]; fp[i]=0.; dfp[i]=0.;
FluidSolution:       gm[i]=g[i]; dgm[i]=dg[i]; g[i]=gp[i]; dg[i]=dgp[i]; gp[i]=0.; dgp[i]=0.;
FluidSolution:       sm[i]=s[i];  hm[i]=h[i];  s[i]=sp[i];  h[i]=hp[i];  sp[i]=new Complex();
FluidSolution:       hp[i]=new Complex();
FluidSolution:     }
FluidSolution:   }
FluidSolution: 
FluidSolution: } // class FluidSolution
MCPDrawSolution: /* $Id: MCPDrawSolution.java,v 1.2 2000/06/16 07:03:57 johanh Exp $ */
MCPDrawSolution: 
MCPDrawSolution: import java.awt.*;
MCPDrawSolution: 
MCPDrawSolution: /** Solves the equation with a Monte Carlo method and draws the particles
MCPDrawSolution:     @version $Revision: 1.2 $
MCPDrawSolution:     @see Solution
MCPDrawSolution:     @see MCPSolution
MCPDrawSolution: */
MCPDrawSolution: public class MCPDrawSolution extends MCPSolution {
MCPDrawSolution:     
MCPDrawSolution:   /** Creates a MCPSolution object. Note that discretize must be called
MCPDrawSolution:       before next is called for the first time.
MCPDrawSolution:       @param runData The run time parameters
MCPDrawSolution:       @see Solution#next
MCPDrawSolution:       @see Solution#discretize
MCPDrawSolution:   */
MCPDrawSolution:   public MCPDrawSolution(RunData runData){
MCPDrawSolution:     super(runData);
MCPDrawSolution:   } // MCPDrawSolution
MCPDrawSolution:     
MCPDrawSolution:   /** Plots the solution
MCPDrawSolution:       @param plotArea The plot area
MCPDrawSolution:       @param offScrImage The off screen image to draw on
MCPDrawSolution:       @param headers Whether to draw headers
MCPDrawSolution:   */
MCPDrawSolution:   public void plot(Canvas plotArea, Image offScrImage, boolean headers){
MCPDrawSolution:     if(!distributionUpToDate)
MCPDrawSolution:       generateDistribution();
MCPDrawSolution:     super.plot(plotArea, offScrImage, headers);
MCPDrawSolution: 
MCPDrawSolution:     int[] win=this.getWinSize();
MCPDrawSolution:     xSize=win[0];  xOffset=win[2]; 
MCPDrawSolution:     ySize=win[1];  xOffset=win[3]; 
MCPDrawSolution:     Graphics g = offScrImage.getGraphics();
MCPDrawSolution:     double dx = (xSize-2*xOffset)/(x_1-x_0);
MCPDrawSolution:     double dy = (ySize-2*yOffset)/(y_1-y_0);
MCPDrawSolution:     int[] x = new int[mesh.size() + 2];
MCPDrawSolution:     int[] y = new int[mesh.size() + 2]; 
MCPDrawSolution:     g.setColor(Color.red);
MCPDrawSolution:     if (numberOfParticles>10) {
MCPDrawSolution:      for(int i = 0; i < numberOfParticles; i++)
MCPDrawSolution:        g.fillRect((int)Math.round((particlePosition[i]-x_0)*dx)+xOffset-1,
MCPDrawSolution:                                    ySize -(i%(ySize-2*yOffset))-yOffset-2,3,3);
MCPDrawSolution:     } else {
MCPDrawSolution:       for(int i = 0; i < numberOfParticles; i++) 
MCPDrawSolution:       g.fillRect((int)Math.round((particlePosition[i]-x_0)*dx)+xOffset-1,
MCPDrawSolution:             ySize -(i*8)-yOffset-12,8,8);
MCPDrawSolution:     }
MCPDrawSolution:   } // plot
MCPDrawSolution: 
MCPDrawSolution: } // class MCPSolution
MCSDrawSolution: /* $Id: MCSDrawSolution.java,v 1.2 2000/06/16 07:03:57 johanh Exp $ */
MCSDrawSolution: 
MCSDrawSolution: import java.awt.*;
MCSDrawSolution: 
MCSDrawSolution: /** Solves the equation with a Monte Carlo sampling of possible configurations
MCSDrawSolution:     and drawn on the plot area
MCSDrawSolution:     @version $Revision: 1.34 $
MCSDrawSolution:     @see Solution
MCSDrawSolution:     @see MCSSolution
MCSDrawSolution: */
MCSDrawSolution: public class MCSDrawSolution extends MCSSolution {
MCSDrawSolution:     
MCSDrawSolution:   /** Creates a MCSSolution object. Note that discretize must be called
MCSDrawSolution:       before next is called for the first time.
MCSDrawSolution:       @param runData The run time parameters
MCSDrawSolution:       @see Solution#next
MCSDrawSolution:       @see Solution#discretize
MCSDrawSolution:   */
MCSDrawSolution:   public MCSDrawSolution(RunData runData){
MCSDrawSolution:     super(runData);
MCSDrawSolution:   } // MCSDrawSolution
MCSDrawSolution:     
MCSDrawSolution:   /** Plots the solution
MCSDrawSolution:       @param plotArea The plot area
MCSDrawSolution:       @param offScrImage The off screen image to draw on
MCSDrawSolution:       @param headers Whether to draw headers
MCSDrawSolution:   */
MCSDrawSolution:   public void plot(Canvas plotArea, Image offScrImage, boolean headers){
MCSDrawSolution:     if(!solutionUpToDate)
MCSDrawSolution:       expectedRealisation();
MCSDrawSolution:     super.plot(plotArea, offScrImage, headers);
MCSDrawSolution: 
MCSDrawSolution:     int[] win=this.getWinSize();
MCSDrawSolution:     xSize=win[0];  xOffset=win[2]; 
MCSDrawSolution:     ySize=win[1];  xOffset=win[3]; 
MCSDrawSolution:     Graphics g = offScrImage.getGraphics();
MCSDrawSolution:     double dx = (xSize-2*xOffset)/(x_1-x_0);
MCSDrawSolution:     double dy = (ySize-2*yOffset)/(y_1-y_0);
MCSDrawSolution:     int[] x = new int[mesh.size() + 2];
MCSDrawSolution:     int[] y = new int[mesh.size() + 2]; 
MCSDrawSolution: 
MCSDrawSolution:     int dotX, dotY, dotSize;
MCSDrawSolution:     g.setColor(Color.red);
MCSDrawSolution:     for(int k=0; k<numberOfRealisations; k++) {
MCSDrawSolution:       dotX=(int)Math.round((currentState[k]-x_0)*dx)+xOffset-1;
MCSDrawSolution:       if (numberOfRealisations<10) { 
MCSDrawSolution:         dotSize=8; dotY=ySize-(k*dotSize)-yOffset-12;
MCSDrawSolution:       } else {
MCSDrawSolution:         dotSize=3; dotY=ySize-(k%(ySize-2*yOffset))-yOffset-2;
MCSDrawSolution:       }
MCSDrawSolution:       g.fillRect(dotX,dotY,dotSize,dotSize);
MCSDrawSolution:     }
MCSDrawSolution:   } // plot
MCSDrawSolution: 
MCSDrawSolution: } // class MCSSolution
MCPSolution: /* $Id: MCPSolution.java,v 1.34 2001/01/15 14:22:22 andrej Exp $ */
MCPSolution: 
MCPSolution: import java.awt.*;
MCPSolution: import java.util.Random;
MCPSolution: 
MCPSolution: 
MCPSolution: 
MCPSolution: /** Solves the equation with a Monte Carlo method.
MCPSolution:     @version $Revision: 1.34 $
MCPSolution:     @see Solution
MCPSolution: */
MCPSolution: public class MCPSolution extends ParticleSolution{
MCPSolution:     
MCPSolution:   /** Creates a MCPSolution object. Note that discretize must be called
MCPSolution:       before next is called for the first time.
MCPSolution:       @param runData The run time parameters
MCPSolution:       @see Solution#next
MCPSolution:       @see Solution#discretize
MCPSolution:   */
MCPSolution:   public MCPSolution(RunData runData){         
MCPSolution:     super(runData);
MCPSolution:   } // MCPSolution
MCPSolution:     
MCPSolution: 
MCPSolution:   /** Advance the solution forward one step in time.
MCPSolution:       The equation is set by the internal variable pde and 
MCPSolution:       the numerical scheme by the internal variable scheme
MCPSolution:       @param runData List of run parameters
MCPSolution:       @see RunData
MCPSolution:       @return True if a scheme is implemented for that equation
MCPSolution:   */
MCPSolution:   public boolean next(RunData runData, PhysData physData) {
MCPSolution:     distributionUpToDate = false;
MCPSolution:     boolean isDefined = true;
MCPSolution:     for (int i=0; i<f.length; i++) { gp[i]=g[i]; }     //Plot initial condition
MCPSolution: 
MCPSolution:     double[] lim = {mesh.point(0),
MCPSolution:             mesh.point(mesh.size()-1) + dx[0]};
MCPSolution: 
MCPSolution:     if(pde.equals(jbone.ADVECTION) &&
MCPSolution:        (scheme.equals(jbone.MCNORM))){                     
MCPSolution:     //=========================================================================
MCPSolution:     //  MCP - Advection/diffusion
MCPSolution:     //=========================================================================
MCPSolution:       double timeStep= runData.getParamValue(runData.timeStepNm);
MCPSolution:       double velocity= runData.getParamValue(runData.velocityNm);
MCPSolution:       double diffusCo= runData.getParamValue(runData.diffusionNm);
MCPSolution: 
MCPSolution:       for(int j = 0; j < numberOfParticles; j++){
MCPSolution:  particlePosition[j] += velocity * timeStep +
MCPSolution:          random.nextGaussian() *
MCPSolution:          Math.sqrt(2 * diffusCo * timeStep);
MCPSolution:  // Periodic boundary condition; the last point is not a solution point
MCPSolution:  while(particlePosition[j] > lim[1])
MCPSolution:          particlePosition[j] -= lim[1] - lim[0];
MCPSolution:  while(particlePosition[j] < lim[0])
MCPSolution:          particlePosition[j] += lim[1] - lim[0];
MCPSolution:       } // for
MCPSolution: 
MCPSolution:     } else if(scheme.equals(jbone.EXC5_01)){           
MCPSolution:       //=======================================================================
MCPSolution:       //  MCP - Exercise 5.01
MCPSolution:       //=======================================================================
MCPSolution:       //INCLUDE_sol5.01.java_INCLUDE//
MCPSolution: 
MCPSolution:     } else if(scheme.equals(jbone.EXC5_02)){           
MCPSolution:       //=======================================================================
MCPSolution:       //  MCP - Exercise 5.02
MCPSolution:       //=======================================================================
MCPSolution:       //INCLUDE_sol5.02.java_INCLUDE//
MCPSolution: 
MCPSolution:     } else if(scheme.equals(jbone.EXC5_03)){           
MCPSolution:       //=======================================================================
MCPSolution:       //  MCP - Exercise 5.03
MCPSolution:       //=======================================================================
MCPSolution:       //INCLUDE_sol5.03.java_INCLUDE//
MCPSolution: 
MCPSolution:     } else if(scheme.equals(jbone.EXC5_04)){           
MCPSolution:       //=======================================================================
MCPSolution:       //  MCP - Exercise 5.04
MCPSolution:       //=======================================================================
MCPSolution:       //INCLUDE_sol5.04.java_INCLUDE//
MCPSolution: 
MCPSolution:     } else if(scheme.equals(jbone.EXC5_05)){           
MCPSolution:       //=======================================================================
MCPSolution:       //  MCP - Exercise 5.05
MCPSolution:       //=======================================================================
MCPSolution:       //INCLUDE_sol5.05.java_INCLUDE//
MCPSolution: 
MCPSolution:     } else if(scheme.equals(jbone.EXC5_06)){           
MCPSolution:       //=======================================================================
MCPSolution:       //  MCP - Exercise 5.06
MCPSolution:       //=======================================================================
MCPSolution:       //INCLUDE_sol5.06.java_INCLUDE//
MCPSolution: 
MCPSolution:     } else if(scheme.equals(jbone.EXC5_07)){           
MCPSolution:       //=======================================================================
MCPSolution:       //  MCP - Exercise 5.07
MCPSolution:       //=======================================================================
MCPSolution:       //INCLUDE_sol5.07.java_INCLUDE//
MCPSolution: 
MCPSolution:     } else if(scheme.equals(jbone.EXCE_01)){           
MCPSolution:       //=======================================================================
MCPSolution:       //  MCP - Exercise E.01
MCPSolution:       //=======================================================================
MCPSolution:       //INCLUDE_solE.01.java_INCLUDE//
MCPSolution:     
MCPSolution:     } else if(pde.equals(jbone.EXERCISE)
MCPSolution:               && scheme.equals(jbone.MY_SCHEME)){           
MCPSolution:       //=======================================================================
MCPSolution:       //  MCP - Project 1
MCPSolution:       //=======================================================================
MCPSolution:       //INCLUDE_prj5.01.java_INCLUDE//
MCPSolution: 
MCPSolution:     } else if(pde.equals(jbone.EXERCISE)
MCPSolution:               && scheme.equals(jbone.MY_SCHEME_2)){         
MCPSolution:       //=======================================================================
MCPSolution:       //  MCP - Project 2
MCPSolution:       //=======================================================================
MCPSolution:       //INCLUDE_prj5.02.java_INCLUDE//
MCPSolution: 
MCPSolution:     } // if
MCPSolution:     return isDefined;
MCPSolution:   } // next
MCPSolution: 
MCPSolution:   /** Tells whether the solution implements a option
MCPSolution:          @param option The the option to implement
MCPSolution:          @return True if the option is implemented
MCPSolution:          @see jbone#pdeNames
MCPSolution:          @see jbone#schemeNames
MCPSolution:   */
MCPSolution:   public boolean hasOption(String option){
MCPSolution:     try {
MCPSolution:       if (option.equals(jbone.ADVECTION))
MCPSolution:  return true;
MCPSolution:       else if (option.equals(jbone.EXERCISE))
MCPSolution:  return true;
MCPSolution:       else if (pde.equals(jbone.ADVECTION) && 
MCPSolution:                option.equals(jbone.MCNORM)   )
MCPSolution:  return true;
MCPSolution:       else if (pde.equals(jbone.EXERCISE) && option.equals(jbone.EXC5_01))
MCPSolution:  return true;
MCPSolution:       else if (pde.equals(jbone.EXERCISE) && option.equals(jbone.EXC5_02))
MCPSolution:  return true;
MCPSolution:       else if (pde.equals(jbone.EXERCISE) && option.equals(jbone.EXC5_03))
MCPSolution:  return true;
MCPSolution:       else if (pde.equals(jbone.EXERCISE) && option.equals(jbone.EXC5_04))
MCPSolution:  return true;
MCPSolution:       else if (pde.equals(jbone.EXERCISE) && option.equals(jbone.EXC5_05))
MCPSolution:  return true;
MCPSolution:       else if (pde.equals(jbone.EXERCISE) && option.equals(jbone.EXC5_06))
MCPSolution:  return true;
MCPSolution:       else if (pde.equals(jbone.EXERCISE) && option.equals(jbone.EXC5_07))
MCPSolution:  return true;
MCPSolution:       else if (pde.equals(jbone.EXERCISE) && option.equals(jbone.EXCE_01))
MCPSolution:  return true;
MCPSolution:       else if (pde.equals(jbone.EXERCISE) && option.equals(jbone.MY_SCHEME))
MCPSolution:  return true;
MCPSolution:       else if (pde.equals(jbone.EXERCISE) && option.equals(jbone.MY_SCHEME_2))
MCPSolution:  return true;
MCPSolution:       return false;
MCPSolution:     } catch (NullPointerException e){
MCPSolution:       return false;
MCPSolution:     } // try
MCPSolution:   } // hasOption
MCPSolution: 
MCPSolution:   /** Plots the solution
MCPSolution:       @param plotArea The plot area
MCPSolution:       @param offScrImage The off screen image to draw on
MCPSolution:       @param headers Whether to draw headers
MCPSolution:   */
MCPSolution:   public void plot(Canvas plotArea, Image offScrImage, boolean headers){
MCPSolution:     if(!distributionUpToDate)
MCPSolution:       generateDistribution();
MCPSolution:     super.plot(plotArea, offScrImage, headers);
MCPSolution:   } // plot
MCPSolution: 
MCPSolution: } // class MCPSolution
MCSSolution: /* $Id: MCSSolution.java,v 1.34 2001/01/15 14:22:22 andrej Exp $ */
MCSSolution: 
MCSSolution: import java.awt.*;
MCSSolution: import java.util.Random;
MCSSolution: 
MCSSolution: 
MCSSolution: 
MCSSolution: /** Solves the equation with a Monte Carlo sampling of possible configurations
MCSSolution:     @version $Revision: 1.34 $
MCSSolution:     @see Solution
MCSSolution: */
MCSSolution: public class MCSSolution extends SamplingSolution{
MCSSolution:   
MCSSolution:   /** Creates a MCSSolution object. Note that discretize must be called
MCSSolution:       before next is called for the first time.
MCSSolution:       @param runData The run time parameters
MCSSolution:       @see Solution#next
MCSSolution:       @see Solution#discretize
MCSSolution:   */
MCSSolution:   public MCSSolution(RunData runData){         
MCSSolution:     super(runData);
MCSSolution:   } // MCSSolution
MCSSolution:   
MCSSolution: 
MCSSolution:   /** Advance the solution forward one step in time.
MCSSolution:       The equation is set by the internal variable pde and 
MCSSolution:       the numerical scheme by the internal variable scheme
MCSSolution:       @param runData List of run parameters
MCSSolution:       @see RunData
MCSSolution:       @return True if a scheme is implemented for that equation
MCSSolution:   */
MCSSolution:   public boolean next(RunData runData, PhysData physData) {
MCSSolution:     solutionUpToDate = false;
MCSSolution:     boolean isDefined = true;
MCSSolution: 
MCSSolution:     for (int j=0; j<f.length; j++) { gp[j]=g[j]; }     //Plot initial condition
MCSSolution: 
MCSSolution:     double[] lim = {mesh.point(0),
MCSSolution:             mesh.point(mesh.size()-1) + dx[0]};
MCSSolution: 
MCSSolution:     if(pde.equals(jbone.BSCHOLES) &&
MCSSolution:        scheme.equals(jbone.MCLOGN)  ){                   
MCSSolution:       //=======================================================================
MCSSolution:       //  MCS - Black-Scholes - European Vanilla Put option - lognormal walk
MCSSolution:       //=======================================================================
MCSSolution:       double timeStep= runData.getParamValue(runData.timeStepNm);
MCSSolution:       double velocity= runData.getParamValue(runData.velocityNm);
MCSSolution:       double diffusCo= runData.getParamValue(runData.diffusionNm);
MCSSolution:       double strike  = runData.getParamValue(runData.icPositionNm);
MCSSolution:       double sigmaSq = diffusCo;                        //Volatility square
MCSSolution:       double rate    = velocity;                        //Interest rate
MCSSolution: 
MCSSolution:       for(int k=0; k<numberOfRealisations; k++)
MCSSolution:         currentState[k]+= currentState[k]*(     -rate*timeStep +
MCSSolution:             random.nextGaussian()*sigmaSq*Math.sqrt(2*timeStep) );
MCSSolution: 
MCSSolution:     } else if(pde.equals(jbone.BSCHOLES) &&
MCSSolution:               scheme.equals(jbone.MCNORM)  ){            
MCSSolution:       //=======================================================================
MCSSolution:       //  MCS - Black-Scholes - European Vanilla Put option - normal walk
MCSSolution:       //=======================================================================
MCSSolution:       double timeStep= runData.getParamValue(runData.timeStepNm);
MCSSolution:       double velocity= runData.getParamValue(runData.velocityNm);
MCSSolution:       double diffusCo= runData.getParamValue(runData.diffusionNm);
MCSSolution:       double strike  = runData.getParamValue(runData.icPositionNm);
MCSSolution:       double sigmaSq = diffusCo;                        //Volatility square
MCSSolution:       double rate    = velocity;                        //Interest rate
MCSSolution: 
MCSSolution:       for(int k=0; k<numberOfRealisations; k++)
MCSSolution:         currentState[k]+= strike*(                   -rate*timeStep +
MCSSolution:             random.nextGaussian()*sigmaSq*Math.sqrt(2*timeStep) );
MCSSolution: 
MCSSolution:     } else if(scheme.equals(jbone.EXC5_01)){           
MCSSolution:       //=======================================================================
MCSSolution:       //  MCS - Exercise 5.01
MCSSolution:       //=======================================================================
MCSSolution:       //INCLUDE_sol5.01.java_INCLUDE//
MCSSolution: 
MCSSolution:     } else if(scheme.equals(jbone.EXC5_02)){           
MCSSolution:       //=======================================================================
MCSSolution:       //  MCS - Exercise 5.02
MCSSolution:       //=======================================================================
MCSSolution:       //INCLUDE_sol5.02.java_INCLUDE//
MCSSolution: 
MCSSolution:     } else if(scheme.equals(jbone.EXC5_03)){           
MCSSolution:       //=======================================================================
MCSSolution:       //  MCS - Exercise 5.03
MCSSolution:       //=======================================================================
MCSSolution:       //INCLUDE_sol5.03.java_INCLUDE//
MCSSolution: 
MCSSolution:     } else if(scheme.equals(jbone.EXC5_04)){           
MCSSolution:       //=======================================================================
MCSSolution:       //  MCS - Exercise 5.04
MCSSolution:       //=======================================================================
MCSSolution:       //INCLUDE_sol5.04.java_INCLUDE//
MCSSolution: 
MCSSolution:     } else if(scheme.equals(jbone.EXC5_05)){           
MCSSolution:       //=======================================================================
MCSSolution:       //  MCS - Exercise 5.05
MCSSolution:       //=======================================================================
MCSSolution:       //INCLUDE_sol5.05.java_INCLUDE//
MCSSolution: 
MCSSolution:     } else if(scheme.equals(jbone.EXC5_06)){           
MCSSolution:       //=======================================================================
MCSSolution:       //  MCS - Exercise 5.06
MCSSolution:       //=======================================================================
MCSSolution:       //INCLUDE_sol5.06.java_INCLUDE//
MCSSolution: 
MCSSolution:     } else if(scheme.equals(jbone.EXC5_07)){           
MCSSolution:       //=======================================================================
MCSSolution:       //  MCS - Exercise 5.07
MCSSolution:       //=======================================================================
MCSSolution:       //INCLUDE_sol5.07.java_INCLUDE//
MCSSolution: 
MCSSolution:     } else if(scheme.equals(jbone.EXCE_01)){           
MCSSolution:       //=======================================================================
MCSSolution:       //  MCS - Exercise E.01
MCSSolution:       //=======================================================================
MCSSolution:       //INCLUDE_solE.01.java_INCLUDE//
MCSSolution:     
MCSSolution:     } else if(pde.equals(jbone.EXERCISE)
MCSSolution:               && scheme.equals(jbone.MY_SCHEME)){           
MCSSolution:       //=======================================================================
MCSSolution:       //  MCP - Project 1
MCSSolution:       //=======================================================================
MCSSolution:       //INCLUDE_prj5.01.java_INCLUDE//
MCSSolution: 
MCSSolution:     } else if(pde.equals(jbone.EXERCISE)
MCSSolution:               && scheme.equals(jbone.MY_SCHEME_2)){         
MCSSolution:       //=======================================================================
MCSSolution:       //  MCP - Project 2
MCSSolution:       //=======================================================================
MCSSolution:       //INCLUDE_prj5.02.java_INCLUDE//
MCSSolution: 
MCSSolution:     } // if
MCSSolution:     return isDefined;
MCSSolution:   } // next
MCSSolution: 
MCSSolution:   /** Tells whether the solution implements a option
MCSSolution:          @param option The the option to implement
MCSSolution:          @return True if the option is implemented
MCSSolution:          @see jbone#pdeNames
MCSSolution:          @see jbone#schemeNames
MCSSolution:   */
MCSSolution:   public boolean hasOption(String option){
MCSSolution:     try {
MCSSolution:       if (option.equals(jbone.BSCHOLES))
MCSSolution:  return true;
MCSSolution:       else if (option.equals(jbone.EXERCISE))
MCSSolution:  return true;
MCSSolution:       else if (pde.equals(jbone.BSCHOLES) && 
MCSSolution:                (option.equals(jbone.MCNORM)|| option.equals(jbone.MCLOGN) ))
MCSSolution:  return true;
MCSSolution:       else if (pde.equals(jbone.EXERCISE) && option.equals(jbone.EXC5_01))
MCSSolution:  return true;
MCSSolution:       else if (pde.equals(jbone.EXERCISE) && option.equals(jbone.EXC5_02))
MCSSolution:  return true;
MCSSolution:       else if (pde.equals(jbone.EXERCISE) && option.equals(jbone.EXC5_03))
MCSSolution:  return true;
MCSSolution:       else if (pde.equals(jbone.EXERCISE) && option.equals(jbone.EXC5_04))
MCSSolution:  return true;
MCSSolution:       else if (pde.equals(jbone.EXERCISE) && option.equals(jbone.EXC5_05))
MCSSolution:  return true;
MCSSolution:       else if (pde.equals(jbone.EXERCISE) && option.equals(jbone.EXC5_06))
MCSSolution:  return true;
MCSSolution:       else if (pde.equals(jbone.EXERCISE) && option.equals(jbone.EXC5_07))
MCSSolution:  return true;
MCSSolution:       else if (pde.equals(jbone.EXERCISE) && option.equals(jbone.EXCE_01))
MCSSolution:  return true;
MCSSolution:       else if (pde.equals(jbone.EXERCISE) && option.equals(jbone.MY_SCHEME))
MCSSolution:  return true;
MCSSolution:       else if (pde.equals(jbone.EXERCISE) && option.equals(jbone.MY_SCHEME_2))
MCSSolution:  return true;
MCSSolution:       return false;
MCSSolution:     } catch (NullPointerException e){
MCSSolution:       return false;
MCSSolution:     } // try
MCSSolution:   } // hasOption
MCSSolution: 
MCSSolution:   /** Plots the solution
MCSSolution:       @param plotArea The plot area
MCSSolution:       @param offScrImage The off screen image to draw on
MCSSolution:       @param headers Whether to draw headers
MCSSolution:   */
MCSSolution:   public void plot(Canvas plotArea, Image offScrImage, boolean headers){
MCSSolution:     if(!solutionUpToDate)
MCSSolution:       expectedRealisation();
MCSSolution:     super.plot(plotArea, offScrImage, headers);
MCSSolution:   } // plot
MCSSolution: 
MCSSolution: } // class MCSSolution
Mesh: /* $Id: Mesh.java,v 1.12 2000/06/06 12:58:57 andrej Exp $ */
Mesh: 
Mesh: /******************************************************************************
Mesh: * Mesh - Discretization in one dimension
Mesh: ******************************************************************************/
Mesh: class Mesh {
Mesh: 
Mesh:   /** Coordinates */    double[] x;
Mesh:   /** Interval sizes */ double[] dx;
Mesh: 
Mesh:   /** Constructor
Mesh:       @param numberOfMeshPoints The number of mesh points
Mesh:       @param meshLeft The left coordinate of the mesh
Mesh:       @param meshLength The width of the mesh
Mesh:   */
Mesh:   public Mesh(int numberOfMeshPoints, double meshLeft, double meshLength) {
Mesh:     double start = meshLeft;
Mesh:     double end = meshLeft + meshLength;
Mesh: 
Mesh:     x  = new double[numberOfMeshPoints];                   //Targets
Mesh:     dx = new double[numberOfMeshPoints];
Mesh: 
Mesh:     double dx0=(end-start)/((double)(numberOfMeshPoints));          //Rules
Mesh:     for (int j=0; j<x.length; j++) {
Mesh:       x[j]=start+dx0*(double)j; 
Mesh:       dx[j]=dx0;
Mesh:     }
Mesh:   }
Mesh:   
Mesh:   /** Grid Size
Mesh:       @return Number of mesh points */
Mesh:   public int size() { return x.length; }
Mesh:     
Mesh:   /** Coordinate values 
Mesh:       @return An Array with coordinates */
Mesh:   public double[] points() { return x; }
Mesh: 
Mesh:   /** Coordinate value
Mesh:       @param i The index of a coordinate
Mesh:       @return The value of a coordinate */
Mesh:   public double   point(int i) { return x[i]; }
Mesh: 
Mesh:   /** Spacing between mesh points
Mesh:       @return An Array with the interval sizes */
Mesh:     public double[] intervals() { return dx; }
Mesh:     
Mesh:   /** Space to next grid point
Mesh:       @param i The index of a coordinate
Mesh:       @return The interval size */
Mesh:     public double   interval(int i) { return dx[i]; }
Mesh: 
Mesh:   /** Coordinate boundaries
Mesh:       @return {min(x), max(x) */
Mesh:   public double[] limits() {
Mesh:     double[] lim = {x[0], x[0]};
Mesh:     for (int i=1;i<x.length;i++) {
Mesh:       if (x[i]<lim[0]) {lim[0]=x[i];};
Mesh:       if (x[i]>lim[1]) {lim[1]=x[i];};
Mesh:     }
Mesh:     return lim;
Mesh:   }
Mesh:     
Mesh:   /** For debugging */
Mesh:   public String toString() {
Mesh:     StringBuffer str = new StringBuffer();
Mesh:     str.append("RegularMesh[").append(Double.toString(x[0]))
Mesh:       .append(" , ").append(Double.toString(x[2]))
Mesh:       .append(" .. ").append(Double.toString(x[x.length-1]))
Mesh:       .append("]");
Mesh:     return str.toString();
Mesh:   }
Mesh: 
Mesh: }//End of Mesh
MyChoice: /* $Id: MyChoice.java,v 1.10 2002/07/24 16:22:56 pde Exp $ */
MyChoice: 
MyChoice: import java.awt.Choice;
MyChoice: 
MyChoice: /** Class for handling the choices of the PDE type, scheme etc
MyChoice:     @version $Revision: 1.10 $
MyChoice: */
MyChoice: class MyChoice extends Choice{
MyChoice: 
MyChoice:   /** List of the possible options of the choice */
MyChoice:   String[] options;
MyChoice: 
MyChoice:   /** Constructor
MyChoice:       @param item A list of the possible choices
MyChoice:   */
MyChoice:   public MyChoice(String[] item){
MyChoice:     for(int i = 0; i < item.length; i++) 
MyChoice:       this.addItem(item[i]);
MyChoice:     if (this.countItems()==0) this.addItem("          ");
MyChoice:     select(0);
MyChoice:     // Make a copy of the object
MyChoice:     this.options = (String[])item.clone();
MyChoice:   } // MyChoice
MyChoice: 
MyChoice:   /** Synchronize the list with the valid choices for a solution
MyChoice:          @param solution The Solution to sync
MyChoice:   */
MyChoice:   public void sync(Solution solution){
MyChoice:     String oldSelected = this.getSelectedItem();
MyChoice:     // Clear the choices
MyChoice:     //   this.removeAll();  // Does not work; begin workaround
MyChoice:     for(int i=0; i<this.options.length; i++) {
MyChoice:       if(solution.hasOption(options[i])) {
MyChoice:         this.insert(options[i],0); 
MyChoice:         i=10000;
MyChoice:       }
MyChoice:     }
MyChoice:     for (int i=1; i<this.getItemCount(); i++) this.remove(i);
MyChoice:     for (int i=1; i<this.getItemCount(); i++) this.remove(i);
MyChoice:     for (int i=1; i<this.getItemCount(); i++) this.remove(i);
MyChoice:     for (int i=1; i<this.getItemCount(); i++) this.remove(i);
MyChoice:     long strt = System.currentTimeMillis(); //slow down selection
MyChoice:     while (System.currentTimeMillis()-strt<200) { };
MyChoice:     //End workaround
MyChoice: 
MyChoice:     boolean exist = false;
MyChoice:     for(int i = 0; i < this.options.length; i++) {
MyChoice:       if(solution.hasOption(options[i])) {
MyChoice:  addItem(options[i]);
MyChoice:         if (oldSelected.equals(options[i])) exist = true;
MyChoice:       }
MyChoice:     }
MyChoice:     //   if (this.countItems()>1) this.remove(0); //yields out-of-bound error
MyChoice:     try { this.select(oldSelected); }
MyChoice:     catch (IllegalArgumentException e) { this.select(1); }
MyChoice:   } // sync
MyChoice: } // class MyChoice
MyChoice: 
MyDoubleEditor: /* $Id: MyDoubleEditor.java,v 1.3 2000/04/11 16:08:40 johanh Exp $ */
MyDoubleEditor: 
MyDoubleEditor: /** Editor of double values
MyDoubleEditor:     @version $Revision: 1.3 $
MyDoubleEditor: */
MyDoubleEditor: public class MyDoubleEditor extends MyEditor{
MyDoubleEditor:   /** Constructor
MyDoubleEditor:       @param desc The description
MyDoubleEditor:       @param value The current value
MyDoubleEditor:       @param caller The calling class
MyDoubleEditor:   */
MyDoubleEditor:   public MyDoubleEditor(String desc, double value, MyEditorNotable caller){
MyDoubleEditor:       super(desc, value, caller);
MyDoubleEditor:       field.setText(String.valueOf(value));
MyDoubleEditor:   } // MyDoubleEditor
MyDoubleEditor:   
MyDoubleEditor:   /** Parses the field and tryes to put in the value. If not
MyDoubleEditor:       succeeded, this method will fail silently
MyDoubleEditor:   */
MyDoubleEditor:   protected void parseField() {
MyDoubleEditor:     try {
MyDoubleEditor:       value = Double.valueOf(field.getText()).doubleValue();
MyDoubleEditor:     } catch (NumberFormatException e){
MyDoubleEditor:     } // try
MyDoubleEditor:   } // parseField
MyDoubleEditor:   
MyDoubleEditor: } // class MyDoubleEditor
MyEditor: /* $Id: MyEditor.java,v 1.2 2000/04/11 16:07:58 johanh Exp $ */
MyEditor: 
MyEditor: import java.awt.*;
MyEditor: import java.text.*;
MyEditor: 
MyEditor: /** Class for editing run time parameters
MyEditor:       @version $Revision: 1.2 $
MyEditor:   */
MyEditor: abstract public class MyEditor extends Frame {
MyEditor:   /** Description of the editor */
MyEditor:   private String desc;
MyEditor: 
MyEditor:   /** The Set button */
MyEditor:   private Button setButton;
MyEditor:   /** The Cancel button */
MyEditor:   private Button cancelButton;
MyEditor:   /** The text field where the value is edited */
MyEditor:   protected TextField field = new TextField(10);
MyEditor: 
MyEditor:   /** The value */
MyEditor:   protected double value;
MyEditor: 
MyEditor:   /** The class calling */
MyEditor:   private MyEditorNotable caller;
MyEditor: 
MyEditor:   /** Constructor
MyEditor:       @param desc The description
MyEditor:       @param value The current value
MyEditor:       @param caller The calling class
MyEditor:   */
MyEditor:   public MyEditor(String desc, double value, MyEditorNotable caller){
MyEditor:     this.desc = new String(desc);
MyEditor:     this.value = value;
MyEditor:     this.caller = caller;
MyEditor: 
MyEditor:     Panel p1 = new Panel();
MyEditor:     p1.add(new Label(desc));
MyEditor:     p1.add(field);
MyEditor:     add("Center", p1);
MyEditor:       
MyEditor:     Panel p2 = new Panel();
MyEditor:     p2.setLayout(new FlowLayout(FlowLayout.RIGHT));
MyEditor:     cancelButton = new Button("Cancel");
MyEditor:     setButton = new Button("Set");
MyEditor:     p2.add(cancelButton);
MyEditor:     p2.add(setButton);
MyEditor:     add("South", p2);
MyEditor:       
MyEditor:     pack();
MyEditor:     show();
MyEditor:   } // MyEditor
MyEditor: 
MyEditor:   /** Read-only constructor for non-registered users
MyEditor:       @param desc The description
MyEditor:       @param value The current value
MyEditor:   */
MyEditor:   public MyEditor(String desc, double value){
MyEditor:     this.desc = new String(desc);
MyEditor:     this.value = value;
MyEditor: 
MyEditor:     Panel p1 = new Panel();
MyEditor:     p1.add(new Label(desc));
MyEditor:     p1.add(field);
MyEditor:     add("Center", p1);
MyEditor:       
MyEditor:     Panel p2 = new Panel();
MyEditor:     p2.setLayout(new FlowLayout(FlowLayout.RIGHT));
MyEditor:     cancelButton = new Button("Cancel");
MyEditor:     p2.add(new Label("Restricted: please login to edit"));
MyEditor:     p2.add(cancelButton);
MyEditor:     add("South", p2);
MyEditor: 
MyEditor:     pack();
MyEditor:     show();
MyEditor:   } // MyEditor
MyEditor: 
MyEditor:   /** Double-click on parameter requires editing
MyEditor:       @deprecated
MyEditor:   **************************************************************************/
MyEditor:   public boolean action(Event event, Object arg) {
MyEditor:     if (event.target == setButton || event.target == field) {
MyEditor:       parseField();
MyEditor:       caller.myEditorNotify(desc, value);
MyEditor:     } // if
MyEditor:     hide();
MyEditor:     return true;
MyEditor:   } // action
MyEditor:     
MyEditor:   /** Parses the field and tryes to put in the value. If not
MyEditor:       succeeded, this method will fail silently
MyEditor:   */
MyEditor:   abstract protected void parseField();
MyEditor:     
MyEditor: } // MyEditor
MyEditorNotable: /* $Id: MyEditorNotable.java,v 1.1 2000/04/10 13:10:06 johanh Exp $ */
MyEditorNotable: 
MyEditorNotable: /** Interface suppying the methods needed for a calls to be
MyEditorNotable:     notified by MyEditor
MyEditorNotable:     @see MyEditor
MyEditorNotable:     @version $Revision: 1.1 $
MyEditorNotable: */
MyEditorNotable: interface MyEditorNotable{
MyEditorNotable:   /** Called by MyEditor
MyEditorNotable:       @param desc The description of the property
MyEditorNotable:       @param value The value to set
MyEditorNotable:       @see MyEditor
MyEditorNotable:       @see MyEditorNotable
MyEditorNotable:   */
MyEditorNotable:   public void myEditorNotify(String desc, double value);
MyEditorNotable: } // interface MyEditorNotable
MyNullEditor: /* $Id: MyNullEditor.java,v 1.10 2002/07/24 16:22:56 pde Exp $ */
MyNullEditor: 
MyNullEditor: /** Editor demo preventing change of values
MyNullEditor:     @version $Revision: 1.10 $
MyNullEditor: */
MyNullEditor: public class MyNullEditor extends MyEditor{
MyNullEditor:   /** Constructor
MyNullEditor:       @param desc The description
MyNullEditor:       @param value The current value
MyNullEditor:   */
MyNullEditor:   public MyNullEditor(String desc, double value){
MyNullEditor:       super(desc, value);
MyNullEditor:       field.setText(String.valueOf(value));
MyNullEditor:   } // MyNullEditor
MyNullEditor:   
MyNullEditor:   /** Idle */
MyNullEditor:   protected void parseField() {
MyNullEditor:     try {
MyNullEditor: //      value = Double.valueOf(field.getText()).doubleValue();
MyNullEditor:     } catch (NumberFormatException e){
MyNullEditor:     } // try
MyNullEditor:   }
MyNullEditor:   
MyNullEditor: } // class MyNullEditor
MyIntEditor: /* $Id: MyIntEditor.java,v 1.4 2000/04/11 16:07:58 johanh Exp $ */
MyIntEditor: 
MyIntEditor: /** Editor of int values
MyIntEditor:     @version $Revision: 1.4 $
MyIntEditor: */
MyIntEditor: public class MyIntEditor extends MyEditor{
MyIntEditor:   /** Constructor
MyIntEditor:       @param desc The description
MyIntEditor:       @param value The current value
MyIntEditor:       @param caller The calling class
MyIntEditor:   */
MyIntEditor:   public MyIntEditor(String desc, double value, MyEditorNotable caller){
MyIntEditor:       super(desc, value, caller);
MyIntEditor:       field.setText(String.valueOf((int)value));
MyIntEditor:   } // MyIntEditor
MyIntEditor:   
MyIntEditor:   /** Parses the field and tryes to put in the value. If not
MyIntEditor:       succeeded, this method will fail silently
MyIntEditor:   */
MyIntEditor:   protected void parseField() {
MyIntEditor:     try {
MyIntEditor:       value = Integer.parseInt(field.getText());
MyIntEditor:     } catch (NumberFormatException e){
MyIntEditor:     } // try
MyIntEditor:   } // parseField
MyIntEditor:   
MyIntEditor: } // class MyIntEditor
ParticleSolution: /* $Id: ParticleSolution.java,v 1.23 2000/06/25 20:39:55 andrej Exp $ */
ParticleSolution: 
ParticleSolution: import java.util.Random;
ParticleSolution: 
ParticleSolution: /*****************************************************************************
ParticleSolution: * ParticleSolution -- Is an abstract class at the top of all the solvers that 
ParticleSolution: *   that push particles in phase space.
ParticleSolution: *   @version $Revision: 1.23 $
ParticleSolution: *   @see Solution
ParticleSolution: ******************************************************************************/
ParticleSolution: abstract class ParticleSolution extends Solution{  
ParticleSolution: 
ParticleSolution:   /** The number of test particles in the simulation */
ParticleSolution:   protected int numberOfParticles;
ParticleSolution:   /** A vector with the position of the particles */
ParticleSolution:   protected double[] particlePosition;
ParticleSolution:   /** The amount of mass each test particle represents */
ParticleSolution:   protected double particleDensity;
ParticleSolution:   /** Whether the distribution function is up to date */
ParticleSolution:   protected boolean distributionUpToDate;
ParticleSolution:   /** Random number generator */
ParticleSolution:   protected Random random;
ParticleSolution: 
ParticleSolution:   /** Creates a ParticleSolution object. The method discretize() must be called
ParticleSolution:       before next() is called for the first time.
ParticleSolution:       @param runData The run time parameters
ParticleSolution:       @see Solution#next
ParticleSolution:       @see Solution#discretize
ParticleSolution:   ****************************************************************************/
ParticleSolution:   public ParticleSolution(RunData runData){
ParticleSolution:     super(runData);
ParticleSolution:     numberOfParticles = runData.getParamValueInt(runData.walkersNm);
ParticleSolution:     particlePosition = new double[numberOfParticles];
ParticleSolution:     random = new Random();
ParticleSolution:   } // ParticleSolution
ParticleSolution: 
ParticleSolution:   /** Take the solution backward one step to initialize 3 time level schemes;
ParticleSolution:       not appropriate in this context.
ParticleSolution:       @param runData List of run parameters
ParticleSolution:       @return False since it is not used here
ParticleSolution:   ****************************************************************************/
ParticleSolution:   public boolean previous(RunData runData, PhysData physData){
ParticleSolution:     return false;
ParticleSolution:   } // previous
ParticleSolution:   
ParticleSolution:   /** Discretize the initial Shape function and initialize the moments
ParticleSolution:       Initializes a new set of particles, the number being determined by 
ParticleSolution:       the numerical scheme parameter.
ParticleSolution:       @param function The initial shape to be approximated
ParticleSolution:       @see Solution#setScheme
ParticleSolution:   ****************************************************************************/
ParticleSolution:   public void discretize(ShapeFunction function){
ParticleSolution:     int j;
ParticleSolution:     for (j=0; j<mesh.size(); j++){               //Initial condition
ParticleSolution:       f[j] = function.getValue(mesh, j);
ParticleSolution:       f0[j] = f[j];
ParticleSolution:       g[j] = 0.;
ParticleSolution:     }
ParticleSolution:     double[] fLim = super.limits();              //Min, max
ParticleSolution:     double[] xLim = mesh.limits();
ParticleSolution:     double meshDensity=(mesh.size()-1.)/(xLim[1]-xLim[0]);
ParticleSolution: 
ParticleSolution:     int jmax=0;                                  //----- Detect Dirac function
ParticleSolution:     for (j=0; j<mesh.size(); j++){
ParticleSolution:       if (f[j]>f[jmax]) jmax=j;
ParticleSolution:     }
ParticleSolution:     if ( function.getValue(mesh,Math.max(jmax-1,0)          ) < 0.1 *
ParticleSolution:          function.getValue(mesh,jmax) &&
ParticleSolution:          function.getValue(mesh,Math.min(jmax+1,mesh.size())) < 0.1 *
ParticleSolution:          function.getValue(mesh,jmax)                                 ){
ParticleSolution:       initialMoments[0]=dx[jmax]*f[jmax];
ParticleSolution:       initialMoments[1]=0.;
ParticleSolution:       initialMoments[2]=0.;
ParticleSolution:       particleDensity = 
ParticleSolution:         initialMoments[0]* meshDensity*meshDensity/numberOfParticles;
ParticleSolution: 
ParticleSolution:       for(j=0; j<mesh.size(); j++)
ParticleSolution:         f[j]=(f[j]-fLim[0])/(fLim[1]-fLim[0]);
ParticleSolution: 
ParticleSolution:       for(j=0; j<numberOfParticles; j++)
ParticleSolution:         particlePosition[j] = mesh.point(jmax);
ParticleSolution: 
ParticleSolution:     } else {                                     //----- Regular function
ParticleSolution:     
ParticleSolution:       initialMoments[0]=calculateMoments(0);     //Conserved quantities
ParticleSolution:       initialMoments[1]=calculateMoments(1);
ParticleSolution:       initialMoments[2]=calculateMoments(2);
ParticleSolution: 
ParticleSolution:       particleDensity = 
ParticleSolution:         initialMoments[0]* meshDensity*meshDensity/numberOfParticles;
ParticleSolution: 
ParticleSolution:       for(j=0; j<mesh.size(); j++)               //Normalize to (0,1)
ParticleSolution:         f[j]=(f[j]-fLim[0])/(fLim[1]-fLim[0]);
ParticleSolution: 
ParticleSolution:       double x;
ParticleSolution:       distributionUpToDate = true;
ParticleSolution:       for(j=0; j<numberOfParticles; j++){        // Randomize the positions
ParticleSolution:         while(random.nextDouble() >
ParticleSolution:            getValue(x = xLim[0]+(xLim[1]-xLim[0])*random.nextDouble())
ParticleSolution:            );
ParticleSolution:         particlePosition[j] = x;
ParticleSolution:       } // for
ParticleSolution:     }
ParticleSolution:     distributionUpToDate = false;
ParticleSolution:     rescale();
ParticleSolution:   } // discretize
ParticleSolution: 
ParticleSolution:   /** Calculates the deviation from the m:th initial moment.
ParticleSolution:       @param m The order of the moment
ParticleSolution:       @return The deviation of the m:th moment from the beginning
ParticleSolution:   ****************************************************************************/
ParticleSolution:   public double momentsDeviation(int m){
ParticleSolution:     if(!distributionUpToDate)
ParticleSolution:       generateDistribution();
ParticleSolution:     return super.momentsDeviation(m);
ParticleSolution:   } // moments
ParticleSolution: 
ParticleSolution:   /** Calculates the limits of the solution.
ParticleSolution:       @return A vector consisting of {min(solution), max(solution)}
ParticleSolution:   ****************************************************************************/
ParticleSolution:   public double[] limits(){
ParticleSolution:     if(!distributionUpToDate)
ParticleSolution:       generateDistribution();
ParticleSolution:     return super.limits();
ParticleSolution:   } // limits
ParticleSolution: 
ParticleSolution:   /** Gives the value of the function for an index
ParticleSolution:       @param index The index for which to get the value
ParticleSolution:       @return The value of the distribution function at a given index
ParticleSolution:   ****************************************************************************/
ParticleSolution:   public double getValue(int index) {
ParticleSolution:     if(!distributionUpToDate)
ParticleSolution:       generateDistribution();
ParticleSolution:     return super.getValue(index);
ParticleSolution:   } // getValue
ParticleSolution: 
ParticleSolution:   /** Linear interpolation of the solution. Assumes a uniform mesh.
ParticleSolution:       @param arg Argument
ParticleSolution:       @return A linear interpolation of the function for a given argument
ParticleSolution:   ****************************************************************************/
ParticleSolution:   public double getValue(double arg){
ParticleSolution:     if(!distributionUpToDate)
ParticleSolution:       generateDistribution();
ParticleSolution:     return super.getValue(arg);
ParticleSolution:   } // getValue
ParticleSolution: 
ParticleSolution:   /** Generates the distribution function from the set of test particles. 
ParticleSolution:       Assumes a uniform mesh.
ParticleSolution:   ****************************************************************************/
ParticleSolution:   protected void generateDistribution(){         
ParticleSolution:     int j;
ParticleSolution:     for(j=0; j<mesh.size(); j++) f[j] = 0;
ParticleSolution:     double[] xLim = mesh.limits();
ParticleSolution:     for(j=0; j<numberOfParticles; j++){
ParticleSolution:                                                   // Lower mesh cell index
ParticleSolution:       int index = (int)Math.floor((particlePosition[j] - xLim[0])
ParticleSolution:           / (xLim[1] - xLim[0]) *
ParticleSolution:           (mesh.size() - 1));
ParticleSolution: 
ParticleSolution:       if(index >= 0 && index <= mesh.size()){     //Particle is in plot region
ParticleSolution:         if(index == mesh.size()) index--;
ParticleSolution:         double x_low  = mesh.point(index);
ParticleSolution:         double x_high = mesh.point(index)+dx[0];
ParticleSolution:         double a = (particlePosition[j]-x_low)/(x_high-x_low);
ParticleSolution:         double cell_area_left = 1/dx[0];          // Assume uniform mesh
ParticleSolution:         double cell_area_right = 1/dx[0];
ParticleSolution:         f[index] +=              (1-a)* particleDensity/cell_area_left;
ParticleSolution:         f[(index+1)%mesh.size()] += a * particleDensity/cell_area_right;
ParticleSolution:       } // if
ParticleSolution:     } // for
ParticleSolution:     distributionUpToDate = true;
ParticleSolution:   } // generateDistribution
ParticleSolution: 
ParticleSolution: } // ParticleSolution
PhysData: /* $Id: PhysData.java,v 1.7 2001/01/15 14:22:22 andrej Exp $ */
PhysData: 
PhysData: import java.awt.*;
PhysData: import java.text.*;
PhysData: 
PhysData: /******************************************************************************
PhysData: * PhysData -- Is the class defining physical parameters (such as a potential) 
PhysData: *   @see Solution
PhysData: ******************************************************************************/
PhysData: public class PhysData{
PhysData: 
PhysData:   /** Potential */ public double[] potential;
PhysData: 
PhysData:   /** Creates a PhysData parameters object.
PhysData:       @param runData The run time parameters
PhysData:   */
PhysData:   public PhysData(RunData runData){
PhysData:     // CPU intensive initializations go here...
PhysData:   } // Physics
PhysData: 
PhysData:   /** Evolves the physical data in time
PhysData:   */
PhysData:   public void update(double time){ // No evolution in the input data
PhysData:   } // update
PhysData: 
PhysData:   /** Return the potential on the discrete mesh 
PhysData:       @return Array with discrete values of the potential
PhysData:   */
PhysData:   public double[] getPotential(RunData runData){
PhysData: 
PhysData:     Mesh mesh  = runData.getMesh();
PhysData:     double[] x = mesh.points();
PhysData:     int n      = mesh.size();
PhysData:     int    physDataCase  = runData.getParamValueInt(runData.physDataCaseNm);
PhysData:     double physDataValue = runData.getParamValue(runData.physDataValueNm);
PhysData: 
PhysData:     switch(physDataCase) {
PhysData: 
PhysData:       case 1:  //Barrier = smooth Heavyside(x)          
PhysData:       //=======================================================================
PhysData:         potential = new double[n];             //Create the potential array
PhysData:         double tanhRange = 10.;                //Set range of a in tanh(a)
PhysData:         double tanhDx=2.*tanhRange/((double)n);  
PhysData:         double posBarrier=0.5*(x[n-1]-x[0]);   //Barrier in the middle
PhysData:         for(int k=0; k<n; k++){
PhysData:           double a = (double)k*tanhDx-tanhRange;               
PhysData:           double tanh = (Math.exp(a)-Math.exp(-a))/(Math.exp(a)+Math.exp(-a));
PhysData:           potential[k] = physDataValue*0.5*(1+tanh);
PhysData:         }
PhysData:         break;
PhysData: 
PhysData:       case 2:  //Crystal = harmonic potential           
PhysData:       //=======================================================================
PhysData:         potential = new double[n];             //Create the potential array
PhysData:         for(int k=0; k<n; k++){
PhysData:           double a = 2.*Math.PI*(double)k/(double)n;
PhysData:           double cos = Math.cos(a);
PhysData:           potential[k] = physDataValue*0.5*(1+cos);
PhysData:         }
PhysData:         break;
PhysData: 
PhysData:       case 3:  //Your choice                              
PhysData:       //=======================================================================
PhysData:         //INCLUDE_sol2.6.phys_INCLUDE//
PhysData:         break;
PhysData: 
PhysData:       default:
PhysData:         break;
PhysData:     }
PhysData:     return potential;
PhysData:   } // getPotential
PhysData:   
PhysData: } // PhysData
PlotArea: /* $Id: PlotArea.java,v 1.4 2000/04/11 13:59:20 johanh Exp $ */
PlotArea: 
PlotArea: import java.awt.*;
PlotArea: 
PlotArea: /** Class used for the plot area
PlotArea:     @version $Revision: 1.4 $
PlotArea:  */
PlotArea: class PlotArea extends Canvas{
PlotArea: 
PlotArea:   /** The solution to plot */
PlotArea:   private Solution solution;
PlotArea: 
PlotArea:   /** Whether to draw headers */
PlotArea:   private boolean headers = true;
PlotArea: 
PlotArea:   /** Set the solution to plot
PlotArea:       @param solution The solution to plot
PlotArea:   */
PlotArea:   public void setSolution(Solution solution){
PlotArea:     this.solution = solution;
PlotArea:   } // setSolution
PlotArea: 
PlotArea:   /** Toggles whether to draw headers
PlotArea:     */
PlotArea:   public void toggleHeaders() {
PlotArea:     headers = !headers;
PlotArea:   } // toggleHeaders
PlotArea: 
PlotArea:   /** Plot the graphics
PlotArea:       @param g Graphics to plot
PlotArea:   */
PlotArea:   public void paint(Graphics g){
PlotArea:     Dimension d;
PlotArea:     try{
PlotArea:       // Java 1.1
PlotArea:       d = getSize();
PlotArea:     } catch (NoSuchMethodError e) {
PlotArea:       //Java1.0
PlotArea:       d = size();
PlotArea:     } // try
PlotArea:     Image offScrImage = createImage(d.width, d.height);
PlotArea:     solution.plot(this, offScrImage, headers);
PlotArea:     g.drawImage(offScrImage, 0, 0, this);
PlotArea:   } // paint
PlotArea: 
PlotArea:   /**
PlotArea:     * No need to clear anything; just paint.
PlotArea:     */
PlotArea:   public void update(Graphics g) {
PlotArea:     paint(g);
PlotArea:   }
PlotArea: 
PlotArea: } // PlotArea
RunData: /* $Id: RunData.java,v 1.26 2001/01/16 18:35:55 andrej Exp $ */
RunData: 
RunData: import java.awt.*;
RunData: import java.text.*;
RunData: import java.applet.Applet;
RunData: 
RunData: /** Class taking care of run time parameters
RunData:     @version $Revision: 1.26 $
RunData: */
RunData: public class RunData extends List implements MyEditorNotable {
RunData:                                                          
RunData:   /** Advection velocity */
RunData:   public final static String velocityNm = "Velocity";
RunData:   /** Diffusion constant */
RunData:   public final static String diffusionNm = "Diffusion";
RunData:   /** Dispersion constant*/
RunData:   public final static String dispersionNm = "Dispersion";
RunData:   /** Interval duration  */
RunData:   public final static String timeStepNm = "TimeStep";
RunData:   /** Spatial resolution */
RunData:   public final static String meshPointsNm = "MeshPoints";
RunData:   /** Number of random walkers (particles, states) */
RunData:   public final static String walkersNm = "Walkers";
RunData:   /** Implicit time parameter*/
RunData:   public final static String timeImplicitNm  = "TimeImplicit";
RunData:   /** FEM tunable integration*/
RunData:   public final static String tuneIntegrNm = "TuneIntegr";
RunData:   /** IC amplitude pulse1*/
RunData:   public final static String icAmplitudeNm = "ICAmplitude";
RunData:   /** IC position pulse1 */
RunData:   public final static String icPositionNm = "ICPosition";
RunData:   /** IC width pulse1    */
RunData:   public final static String icWidthNm = "ICWidth";
RunData:   /** IC wavelength pulse1    */
RunData:   public final static String icWavelengthNm = "ICWavelength";
RunData:   /** Final time to reach*/
RunData:   public final static String runTimeNm = "RunTime";
RunData:   /** Left coordinate of x-axis */
RunData:   public final static String meshLeftNm = "MeshLeft";
RunData:   /** Length of the domain   */
RunData:   public final static String meshLengthNm = "MeshLength";
RunData:   /** Physical data switch */
RunData:   public final static String physDataCaseNm = "PhysDataCase";
RunData:   /** Physical data value */
RunData:   public final static String physDataValueNm = "PhysDataValue";
RunData:   /** Maximum length of the parameters strings */
RunData:   private int maxLength;
RunData:   /** The names of all the run time parameters */
RunData:   public final static String[] paramNames = {
RunData:    velocityNm,    diffusionNm,  dispersionNm,    timeStepNm,
RunData:    meshPointsNm,  walkersNm,    timeImplicitNm,  tuneIntegrNm,
RunData:    icAmplitudeNm, icPositionNm, icWidthNm,       icWavelengthNm,
RunData:    runTimeNm,     meshLeftNm,   meshLengthNm,    physDataCaseNm,
RunData:    physDataValueNm};
RunData:   /** The type (integer or double) of the parameter */
RunData:   private final static boolean[] paramIsInt = {
RunData:    false, false, false, false,
RunData:    true,  true,  false, false,
RunData:    false, false, false, false,
RunData:    false, false, false, true,
RunData:    false};
RunData:   /** The value of the parameter converted to double */
RunData:   private double[] paramVal;
RunData:   /** Display the parameters in the applet or not */
RunData:   private boolean[] paramShow;
RunData: 
RunData:   /** Discretization mesh*/ Mesh mesh;
RunData:   /** The calling class */  private RunDataNotable caller;
RunData:   /** Dessert */            private boolean cookme = false;
RunData: 
RunData:   /** Creates the mesh from the parameters */
RunData:   public void createMesh(){
RunData:     int    meshPoints = getParamValueInt(meshPointsNm);
RunData:     double meshLeft   = getParamValue(meshLeftNm);
RunData:     double meshLength = getParamValue(meshLengthNm);
RunData:     mesh = new Mesh(meshPoints, meshLeft, meshLength);
RunData:   } // createMesh
RunData: 
RunData:   /** Constructor */
RunData:   public RunData(RunDataNotable caller) {
RunData:     super(paramNames.length, false); // for window height if not applet
RunData:     this.caller = caller;
RunData:                                      // initialize parameters
RunData:     maxLength = 0; int i;
RunData:     paramShow = new boolean[paramNames.length];
RunData:     paramVal  = new double[paramNames.length];
RunData:     for(i=0; i<paramNames.length; i++) {
RunData:       paramShow[i] = false;
RunData:       if(paramNames[i].length() > maxLength)
RunData:  maxLength = paramNames[i].length();
RunData:     }
RunData:     maxLength =+ 11;
RunData:                                                          
RunData:     setParamValue(velocityNm,1.);         // Advection velocity
RunData:     setParamValue(diffusionNm,0.);        // Diffusion constant
RunData:     setParamValue(dispersionNm,0.);       // Dispersion constan
RunData:     setParamValue(timeStepNm,0.5);        // Interval duration 
RunData:     setParamValue(meshPointsNm,64.);      // Spatial resolution
RunData:     setParamValue(walkersNm,100.);        // Number of walkers
RunData:     setParamValue(timeImplicitNm,0.7);    // Implicit time para
RunData:     setParamValue(tuneIntegrNm,0.333);    // FEM tune integratio
RunData:     setParamValue(runTimeNm,64.);         // Final time to reac
RunData:     setParamValue(icAmplitudeNm,1.);      // IC amplitude pulse
RunData:     setParamValue(icPositionNm,18.);      // IC position pulse1
RunData:     setParamValue(icWidthNm,8.);          // IC width pulse1   
RunData:     setParamValue(icWavelengthNm,4.);     // IC wavelength pulse1   
RunData:     setParamValue(meshLeftNm,0.);         // Left coordinate   
RunData:     setParamValue(meshLengthNm,64.);      // Length of domain  
RunData:     setParamValue(physDataCaseNm,1.);     // Physical data switch
RunData:     setParamValue(physDataValueNm,1.);    // Physical data switch
RunData: 
RunData:                                      // update panel
RunData:     this.setBackground(new Color(Integer.parseInt("88FFFF",16)));
RunData:     setFont(new Font("Courier", Font.PLAIN, 12));
RunData:     syncList();
RunData:     createMesh();
RunData:   } // RunData
RunData: 
RunData:   /** Returns index of a parameter
RunData:       @param name String The parameter name
RunData:       @return The parameter index */
RunData:   final public int getParamIndex(String name){
RunData:     for(int i=0; i<paramNames.length; i++)
RunData:       if (name.equals(paramNames[i])) return i;
RunData:     return -1;
RunData:   }
RunData: 
RunData:   /** Returns the value a double parameter
RunData:       @param name String The parameter name
RunData:       @return The parameter value */
RunData:   final public double getParamValue(String name){
RunData:    for(int i=0; i<paramNames.length; i++) {
RunData:       if (name.equals(paramNames[i])) return paramVal[i];
RunData:    }
RunData:    // This should not happen
RunData:    System.out.println("Unknown param '"+name+"' in RunData.getParamValue()!");
RunData:    return 0.;
RunData:   }
RunData: 
RunData:   /** Returns the value of an integer parameter
RunData:       @param name String The parameter name
RunData:       @return The parameter value */
RunData:   final public int getParamValueInt(String name){
RunData:    for(int i=0; i<paramNames.length; i++) {
RunData:       if (name.equals(paramNames[i])) {
RunData:         return (int)paramVal[i];
RunData:       }
RunData:    }
RunData:    // This should not happen
RunData:    System.out.println("Unknown param '"+name+"' in RunData.getParamValue()!");
RunData:    return 0;
RunData:   }
RunData: 
RunData:   /** Sets the value of a parameter
RunData:       @param name String The parameter name
RunData:       @return The parameter value */
RunData:   final public void setParamValue(String name, double value){
RunData:    for(int i=0; i<paramNames.length; i++) {
RunData:      if (name.equals(paramNames[i])) {
RunData:        paramVal[i]=value; 
RunData:        syncList();
RunData:        return;
RunData:      }
RunData:    }
RunData:    // This should not happen
RunData:    System.out.println("Unknown param '"+name+"' in RunData.setParamValue()!");
RunData:    return;
RunData:   }
RunData: 
RunData:    /** Synchronizes the list with the current parameters */
RunData:   final public void syncList(){
RunData:     removeAll();
RunData:     StringBuffer buffer;
RunData:     for(int i=0; i<paramNames.length; i++) {
RunData:       if (paramShow[i]) {
RunData:         buffer = new StringBuffer(maxLength);
RunData:         buffer.append(paramNames[i]); pad(buffer, maxLength);
RunData:         if (paramIsInt[i]) 
RunData:           buffer.append(" = " + String.valueOf((int)paramVal[i]));
RunData:         else
RunData:           buffer.append(" = " + String.valueOf(paramVal[i]));
RunData:         addItem(buffer.toString());
RunData:       }
RunData:     }
RunData:   } // syncList
RunData: 
RunData:   /** Modify defaults parameters the HTML tags from the web page
RunData:        @param a The applet to get the parameters from
RunData:     */
RunData:   final public void tagModify(Applet a) {
RunData:     for(int i=0; i<paramNames.length; i++) {
RunData:       try { String tmp = a.getParameter(paramNames[i]);
RunData:         if(tmp!=null) {
RunData:           paramVal[i]=Double.valueOf(tmp).doubleValue();
RunData:           paramShow[i]=true;
RunData:         }
RunData:       } catch (NumberFormatException e) {}
RunData:     }
RunData:     String tmp = a.getParameter("Cookme");
RunData:     if(tmp!=null) cookme = false;
RunData:     syncList();
RunData:   } // TagModify
RunData: 
RunData:   /** Selects all the parameters for display in the applet
RunData:     */
RunData:   final public void displayAll() {
RunData:     for(int i=0; i<paramNames.length; i++)
RunData:           paramShow[i]=true;
RunData:     syncList();
RunData:   } // displayAll
RunData: 
RunData:   /** Selects only tag parameters for display in the applet
RunData:     */
RunData:   final public void displayTag(Applet a) {
RunData:     for(int i=0; i<paramNames.length; i++) {
RunData:       if(a.getParameter(paramNames[i]) !=null)
RunData:         paramShow[i]=true;
RunData:       else 
RunData:         paramShow[i]=false;
RunData:     }
RunData:     syncList();
RunData:   } // displayTag
RunData: 
RunData:   /** Copy the string padding it up with sapces to a specified length
RunData:       @param d The output string
RunData:       @param length The length to pad to
RunData:   */
RunData:   private void pad(StringBuffer d, int length){
RunData:     while(d.length() < length)
RunData:       d.append(" ");
RunData:   } // pad
RunData: 
RunData:   /** Responds to the user actions through the mouse and buttons (Java1.0).
RunData:       Yes, we know this sucks compare to Java 1.1, but we want to be
RunData:       compatible with as many browsers as possible. There is a lot of
RunData:       old stuff out there...
RunData:       @deprecated
RunData:   */
RunData:   final public boolean action(Event e, Object arg) {
RunData:    if(e.target instanceof RunData) {
RunData:     for(int i=0; i<paramNames.length; i++) {
RunData:      if(stringPartCompare(paramNames[i], (String)arg)) {
RunData:       if (!cookme) {
RunData:        if (paramIsInt[i]) {
RunData:          MyEditor ed=new MyIntEditor(paramNames[i],(int)paramVal[i],this);
RunData:        } else {
RunData:          MyEditor ed=new MyDoubleEditor(paramNames[i],paramVal[i],this);
RunData:        }
RunData:       } else { // cookme
RunData:        if (paramIsInt[i]) {
RunData:          MyEditor ed=new MyNullEditor(paramNames[i],(int)paramVal[i]);
RunData:        } else {
RunData:          MyEditor ed=new MyNullEditor(paramNames[i],paramVal[i]);
RunData:        }
RunData:       } // cookme
RunData:       return true;
RunData:      } // stringCompare
RunData:     } // for
RunData:    }
RunData:    return false;
RunData:   } // action
RunData: 
RunData:   /** Called by MyEditor
RunData:       @param name The description of the property
RunData:       @param value The value to set
RunData:       @see MyEditor
RunData:       @see MyEditorNotable
RunData:   */
RunData:   final public void myEditorNotify(String name, double value){
RunData:     for(int i=0; i<paramNames.length; i++) {
RunData:      if(paramNames[i].equals(name)) paramVal[i]=value;
RunData:     }
RunData:     syncList();
RunData:   } // myEditorNote
RunData: 
RunData:   /** Internal method usedin action for camparing if two strings are
RunData:       alike upon the length of the shortest string
RunData:       @param s1 String 1 (the sortest)
RunData:       @param s2 String 2
RunData:       @return True if s1 == s2 upon the length of s1
RunData:   */
RunData:   final private boolean stringPartCompare(String s1, String s2) {
RunData:     return s2.substring(0, s1.length()).equals(s1);
RunData:   } // stringPartCompare
RunData: 
RunData:   /** Returns the mesh @return The mesh */
RunData:   final public Mesh getMesh(){ return mesh; }
RunData: 
RunData: } // class RunData
RunDataNotable: /* $Id: RunDataNotable.java,v 1.3 2000/06/25 20:39:55 andrej Exp $ */
RunDataNotable: 
RunDataNotable: /** Interface suppying the methods needed for a calls to be
RunDataNotable:     notified by RunData
RunDataNotable:     @see MyEditor
RunDataNotable:     @version $Revision: 1.3 $
RunDataNotable: */
RunDataNotable: interface RunDataNotable{
RunDataNotable:   /** Invoked by RunData
RunDataNotable:       @see RunData
RunDataNotable:   */
RunDataNotable:   public void runDataNotifyMesh();
RunDataNotable:   /** Invoked by RunData
RunDataNotable:       @see RunData
RunDataNotable:   */
RunDataNotable:   public void runDataNotifyWalkers();
RunDataNotable: } // interface RunDataWalkers
SamplingSolution: /* $Id: SamplingSolution.java,v 1.23 2000/06/25 20:39:55 andrej Exp $ */
SamplingSolution: 
SamplingSolution: import java.util.Random;
SamplingSolution: 
SamplingSolution: /*****************************************************************************
SamplingSolution: * SamplingSolution -- Is an abstract class at the top of all the solvers that 
SamplingSolution: *   that evolve an expected solution by sampling possible realisation.
SamplingSolution: *   @version $Revision: 1.23 $
SamplingSolution: *   @see Solution
SamplingSolution: ******************************************************************************/
SamplingSolution: abstract class SamplingSolution extends Solution{  
SamplingSolution: 
SamplingSolution:   /** The number of independent realisations to evolve */
SamplingSolution:   protected int numberOfRealisations;
SamplingSolution:   /** The weight or probability associated with each initial state */
SamplingSolution:   protected double realisationWeight;
SamplingSolution:   /** A vector with the current state of each realisation */
SamplingSolution:   protected double[] currentState;
SamplingSolution:   /** Whether the expected solution is up to date */
SamplingSolution:   protected boolean solutionUpToDate;
SamplingSolution:   /** Random number generator */
SamplingSolution:   protected Random random;
SamplingSolution: 
SamplingSolution:   /** Creates a SamplingSolution object. Note that discretize must be called
SamplingSolution:       before next is called for the first time.
SamplingSolution:       @param runData The run time parameters
SamplingSolution:       @see Solution#next
SamplingSolution:       @see Solution#discretize
SamplingSolution:   ****************************************************************************/
SamplingSolution:   public SamplingSolution(RunData runData){
SamplingSolution:     super(runData);
SamplingSolution:     numberOfRealisations = runData.getParamValueInt(runData.walkersNm);
SamplingSolution:     currentState = new double[numberOfRealisations];
SamplingSolution:     random = new Random();
SamplingSolution:   } // SamplingSolution
SamplingSolution: 
SamplingSolution:   /** Take the solution backward one step to initialize schemes 
SamplingSolution:       with 3 time levels; not really appropriate in this context.
SamplingSolution:       @param runData List of run parameters
SamplingSolution:       @return False since it is not used here
SamplingSolution:   ****************************************************************************/
SamplingSolution:   public boolean previous(RunData runData, PhysData physData){
SamplingSolution:     return false;
SamplingSolution:   } // previous
SamplingSolution:   
SamplingSolution:   /** Discretize the initial Shape function and initialize the moments
SamplingSolution:       Initializes a new set of particles, the number being determined by 
SamplingSolution:       the numerical scheme parameter.
SamplingSolution:       @param function The initial shape to be approximated
SamplingSolution:       @see Solution#setScheme
SamplingSolution:   ****************************************************************************/
SamplingSolution:   public void discretize(ShapeFunction function){
SamplingSolution:     int j,k;
SamplingSolution:     for (j=0; j<mesh.size(); j++){               //Initial condition
SamplingSolution:       f[j] = function.getValue(mesh, j);
SamplingSolution:       f0[j] = f[j];
SamplingSolution:       g[j] = 0.;
SamplingSolution:     }
SamplingSolution: 
SamplingSolution:     initialMoments[0]=calculateMoments(0);       //Conserved quantities
SamplingSolution:     initialMoments[1]=calculateMoments(1);
SamplingSolution:     initialMoments[2]=calculateMoments(2);
SamplingSolution: 
SamplingSolution:     for (k=0; k<numberOfRealisations; k++)       //Initial position of samplers
SamplingSolution:       currentState[k]=function.getSampling(mesh,j);
SamplingSolution:     
SamplingSolution:     solutionUpToDate = false;
SamplingSolution:   } // discretize
SamplingSolution: 
SamplingSolution:   /** Calculates the deviation from the m:th initial moment.
SamplingSolution:       @param m The order of the moment
SamplingSolution:       @return The deviation of the m:th moment from the beginning
SamplingSolution:   ****************************************************************************/
SamplingSolution:   public double momentsDeviation(int m){
SamplingSolution:     if(!solutionUpToDate)
SamplingSolution:       expectedRealisation();
SamplingSolution:     return super.momentsDeviation(m);
SamplingSolution:   } // moments
SamplingSolution: 
SamplingSolution:   /** Calculates the limits of the solution.
SamplingSolution:       @return A vector consisting of {min(solution), max(solution)}
SamplingSolution:   ****************************************************************************/
SamplingSolution:   public double[] limits(){
SamplingSolution:     if(!solutionUpToDate)
SamplingSolution:       expectedRealisation();
SamplingSolution:     return super.limits();
SamplingSolution:   } // limits
SamplingSolution: 
SamplingSolution:   /** Gives the value of the function for an index
SamplingSolution:       @param index The index for which to get the value
SamplingSolution:       @return The value of the distribution function at a given index
SamplingSolution:   ****************************************************************************/
SamplingSolution:   public double getValue(int index) {
SamplingSolution:     if(!solutionUpToDate)
SamplingSolution:       expectedRealisation();
SamplingSolution:     return super.getValue(index);
SamplingSolution:   } // getValue
SamplingSolution: 
SamplingSolution:   /** Linear interpolation of the solution. Assumes a uniform mesh.
SamplingSolution:       @param arg Argument
SamplingSolution:       @return A linear interpolation of the function for a given argument
SamplingSolution:   ****************************************************************************/
SamplingSolution:   public double getValue(double arg){
SamplingSolution:     if(!solutionUpToDate)
SamplingSolution:       expectedRealisation();
SamplingSolution:     return super.getValue(arg);
SamplingSolution:   } // getValue
SamplingSolution: 
SamplingSolution:   /** Generates a probability distribution and an expectation from the 
SamplingSolution:       set of sampled values. Assumes a uniform mesh.
SamplingSolution:   ****************************************************************************/
SamplingSolution:   protected void expectedRealisation(){         
SamplingSolution:     int j,k;
SamplingSolution:     if(pde.equals(jbone.BSCHOLES)){                       
SamplingSolution:       for (j=0; j<mesh.size(); j++){
SamplingSolution:         f[j]=0;
SamplingSolution:         for (k=0; k<numberOfRealisations; k++)  //Arithmetic average estimatate
SamplingSolution:           f[j]+= Math.max(currentState[k]-mesh.point(j),0.);
SamplingSolution:         f[j]=f[j]/numberOfRealisations;
SamplingSolution:       } // for
SamplingSolution:     }
SamplingSolution:     solutionUpToDate = true;
SamplingSolution:  
SamplingSolution:   }//expectedRealisation
SamplingSolution: 
SamplingSolution: } // SamplingSolution
ShapeBox: /* $Id: ShapeBox.java,v 1.4 2000/05/05 17:32:36 andrej Exp $ */
ShapeBox: 
ShapeBox:                                                               
ShapeBox: /******************************************************************************
ShapeBox:  ShapeBox -- A box function
ShapeBox:     @see Solution#discretize
ShapeBox: ******************************************************************************/
ShapeBox: public class ShapeBox extends ShapeFunction{
ShapeBox: 
ShapeBox:   /** Creates an instance of the class
ShapeBox:       @param amplitude The box height
ShapeBox:       @param position The box center abscisa
ShapeBox:       @param width The box width
ShapeBox:   */
ShapeBox:   public ShapeBox(double amplitude, double position, double width){
ShapeBox:     amplitude_ = amplitude;
ShapeBox:     position_ = position;
ShapeBox:     width_ = width;
ShapeBox:   } // ShapeBox
ShapeBox: 
ShapeBox: 
ShapeBox:   /** Test if the function is complex
ShapeBox:       @return true if complex function
ShapeBox:   */
ShapeBox:   public boolean isComplex(){ return false; };
ShapeBox: 
ShapeBox:   
ShapeBox:   /** Evaluates the shape on a discrete mesh point position.
ShapeBox:       @param mesh The mesh coordinates
ShapeBox:       @param index The mesh index
ShapeBox:       @return The value of the function at the specified mesh location
ShapeBox:   */
ShapeBox:   public double getValue(Mesh mesh, int index){
ShapeBox:     if(mesh.point(index) - position_ > -width_ &&
ShapeBox:        mesh.point(index) - position_ < width_)
ShapeBox:       return amplitude_;
ShapeBox:     else
ShapeBox:       return 0;
ShapeBox:   } // getValue
ShapeBox: 
ShapeBox: 
ShapeBox:   /** Evaluates complex shape on a discrete mesh point position.
ShapeBox:       @param mesh The mesh coordinates
ShapeBox:       @param index The mesh index
ShapeBox:       @return The value of the function at the specified mesh location
ShapeBox:   */
ShapeBox:   public Complex getValueC(Mesh mesh, int index){
ShapeBox:     Complex z = new Complex(getValue(mesh,index));
ShapeBox:     return z;
ShapeBox:   } // getValueC
ShapeBox: 
ShapeBox: 
ShapeBox:   /** Returns initial distribution of samplers
ShapeBox:       @param mesh The mesh coordinates
ShapeBox:       @param index The mesh index
ShapeBox:       @return The initial distribution of samplers
ShapeBox:   */
ShapeBox:   public double getSampling(Mesh mesh, int index){
ShapeBox:     double position = position_;
ShapeBox:     return position;
ShapeBox:   } // getSampling
ShapeBox: 
ShapeBox: } // class ShapeBox
ShapeCosinus: /* $Id: ShapeCosinus.java,v 1.4 2000/05/05 17:32:36 andrej Exp $ */
ShapeCosinus: 
ShapeCosinus: /******************************************************************************
ShapeCosinus:  ShapeCosinus -- A cosinusoidal function
ShapeCosinus:     @see Solution#discretize
ShapeCosinus: ******************************************************************************/
ShapeCosinus: public class ShapeCosinus extends ShapeFunction{
ShapeCosinus: 
ShapeCosinus:   /** Creates an instance of the class
ShapeCosinus:       @param amplitude The wave amplitude
ShapeCosinus:       @param position The wave phase
ShapeCosinus:       @param wavelength The wavelength
ShapeCosinus:   */
ShapeCosinus:   public ShapeCosinus(double amplitude, double position, double wavelength){
ShapeCosinus:     amplitude_ = amplitude;
ShapeCosinus:     position_ = position;
ShapeCosinus:     wavelength_ = wavelength;
ShapeCosinus:   } // ShapeCosinus
ShapeCosinus: 
ShapeCosinus: 
ShapeCosinus:   /** Test if the function is complex
ShapeCosinus:       @return true if complex function
ShapeCosinus:   */
ShapeCosinus:   public boolean isComplex(){ return false; };
ShapeCosinus: 
ShapeCosinus:   
ShapeCosinus:   /** Evaluates the shape on a discrete mesh point position.
ShapeCosinus:       @param mesh The mesh coordinates
ShapeCosinus:       @param index The mesh index
ShapeCosinus:       @return The value of the function at the specified mesh location
ShapeCosinus:   */
ShapeCosinus:   public double getValue(Mesh mesh, int index){
ShapeCosinus:     int    n  = mesh.size();
ShapeCosinus:     double dx = mesh.interval(0);
ShapeCosinus:     double a = 2*Math.PI * (double)(index)*dx / wavelength_;
ShapeCosinus:     return amplitude_ * (1 + Math.cos(a)) / 1.0;
ShapeCosinus:   } // getValue
ShapeCosinus: 
ShapeCosinus: 
ShapeCosinus:   /** Evaluates complex shape on a discrete mesh point position.
ShapeCosinus:       @param mesh The mesh coordinates
ShapeCosinus:       @param index The mesh index
ShapeCosinus:       @return The value of the function at the specified mesh location
ShapeCosinus:   */
ShapeCosinus:   public Complex getValueC(Mesh mesh, int index){
ShapeCosinus:     Complex z = new Complex(getValue(mesh,index));
ShapeCosinus:     return z;
ShapeCosinus:   } // getValueC
ShapeCosinus: 
ShapeCosinus: 
ShapeCosinus:   /** Returns initial distribution of samplers
ShapeCosinus:       @param mesh The mesh coordinates
ShapeCosinus:       @param index The mesh index
ShapeCosinus:       @return The initial distribution of samplers
ShapeCosinus:   */
ShapeCosinus:   public double getSampling(Mesh mesh, int index){
ShapeCosinus:     double position = position_;
ShapeCosinus:     return position;
ShapeCosinus:   } // getSampling
ShapeCosinus: 
ShapeCosinus: } // class ShapeCosinus
ShapeFunction: /* $Id: ShapeFunction.java,v 1.3 2000/05/05 17:32:36 andrej Exp $ */
ShapeFunction: 
ShapeFunction: /** Abstract class for a describing initial shapes
ShapeFunction:     @see Solution#discretize
ShapeFunction: */
ShapeFunction: abstract public class ShapeFunction{
ShapeFunction:   /** The shape's vertical scale */    protected double amplitude_;
ShapeFunction:   /** The shape's horizontal scale */  protected double width_;
ShapeFunction:   /** The shape's abscissa */          protected double position_;
ShapeFunction:   /** The shape's shorter scale */     protected double wavelength_;
ShapeFunction: 
ShapeFunction: 
ShapeFunction:   /** Test if the function is complex
ShapeFunction:       @return true if complex function
ShapeFunction:   */
ShapeFunction:   abstract public boolean isComplex();
ShapeFunction: 
ShapeFunction: 
ShapeFunction:   /** Evaluates the shape on a discrete mesh point position.
ShapeFunction:       @param mesh The mesh coordinates
ShapeFunction:       @param index The mesh index
ShapeFunction:       @return The value or squared norm of the function at the mesh location
ShapeFunction:   */
ShapeFunction:   abstract public double getValue(Mesh mesh, int index);
ShapeFunction: 
ShapeFunction: 
ShapeFunction:   /** Evaluates the shape on a discrete mesh point position.
ShapeFunction:       @param mesh The mesh coordinates
ShapeFunction:       @param index The mesh index
ShapeFunction:       @return The value of the function at the specified mesh location
ShapeFunction:   */
ShapeFunction:   abstract public Complex getValueC(Mesh mesh, int index);
ShapeFunction: 
ShapeFunction:   /** Returns initial distribution of samplers
ShapeFunction:       @param mesh The mesh coordinates
ShapeFunction:       @param index The mesh index
ShapeFunction:       @return The initial distribution of samplers
ShapeFunction:   */
ShapeFunction:   abstract public double getSampling(Mesh mesh, int index);
ShapeFunction: 
ShapeFunction: } // class ShapeFunction
ShapeFunction: 
ShapeGaussian: /* $Id: ShapeGaussian.java,v 1.3 2000/05/05 17:32:36 andrej Exp $ */
ShapeGaussian: 
ShapeGaussian: /******************************************************************************
ShapeGaussian:  ShapeGaussian -- A Gaussian function
ShapeGaussian:     @see Solution#discretize
ShapeGaussian: ******************************************************************************/
ShapeGaussian: public class ShapeGaussian extends ShapeFunction{
ShapeGaussian: 
ShapeGaussian:   /** Creates an instance of the class
ShapeGaussian:       @param amplitude The Gaussian maximum amplitude
ShapeGaussian:       @param position The Gaussian abscissa
ShapeGaussian:       @param width The Gaussian width
ShapeGaussian:   */
ShapeGaussian:   public ShapeGaussian(double amplitude, double position, double width){
ShapeGaussian:     amplitude_ = amplitude;
ShapeGaussian:     position_ = position;
ShapeGaussian:     width_ = width;
ShapeGaussian:   } // ShapeGaussian
ShapeGaussian: 
ShapeGaussian: 
ShapeGaussian:   /** Test if the function is complex
ShapeGaussian:       @return true if complex function
ShapeGaussian:   */
ShapeGaussian:   public boolean isComplex(){ return false; };
ShapeGaussian: 
ShapeGaussian:   
ShapeGaussian:   /** Evaluates the shape on a discrete mesh point position.
ShapeGaussian:       @param mesh The mesh coordinates
ShapeGaussian:       @param index The mesh index
ShapeGaussian:       @return The value of the function at the specified mesh location
ShapeGaussian:   */
ShapeGaussian:   public double getValue(Mesh mesh, int index){
ShapeGaussian:     double a = (mesh.point(index) - position_) / width_;
ShapeGaussian:     return amplitude_ * Math.exp(-a * a);
ShapeGaussian:   } // getValue
ShapeGaussian: 
ShapeGaussian: 
ShapeGaussian:   /** Evaluates complex shape on a discrete mesh point position.
ShapeGaussian:       @param mesh The mesh coordinates
ShapeGaussian:       @param index The mesh index
ShapeGaussian:       @return The value of the function at the specified mesh location
ShapeGaussian:   */
ShapeGaussian:   public Complex getValueC(Mesh mesh, int index){
ShapeGaussian:     Complex z = new Complex(getValue(mesh,index));
ShapeGaussian:     return z;
ShapeGaussian:   } // getValueC
ShapeGaussian: 
ShapeGaussian: 
ShapeGaussian:   /** Returns initial distribution of samplers
ShapeGaussian:       @param mesh The mesh coordinates
ShapeGaussian:       @param index The mesh index
ShapeGaussian:       @return The initial distribution of samplers
ShapeGaussian:   */
ShapeGaussian:   public double getSampling(Mesh mesh, int index){
ShapeGaussian:     double position = position_;
ShapeGaussian:     return position;
ShapeGaussian:   } // getSampling
ShapeGaussian: 
ShapeGaussian: } // class ShapeGaussian
ShapeNumerical: /* $Id: ShapeNumerical.java,v 1.3 2000/05/05 17:32:36 andrej Exp $ */
ShapeNumerical: 
ShapeNumerical: /******************************************************************************
ShapeNumerical:  ShapeNumerical -- A function (interpolated) from numerical data
ShapeNumerical:     @see Solution#discretize
ShapeNumerical: ******************************************************************************/
ShapeNumerical: public class ShapeNumerical extends ShapeFunction{
ShapeNumerical: 
ShapeNumerical:   /** Numerical function abscissa */             private Mesh     myMesh;
ShapeNumerical:   /** Numerical function values */               private Solution mySolution;
ShapeNumerical: 
ShapeNumerical:   /** Creates an instance of the class
ShapeNumerical:       @param solution Values defining the shape numerically
ShapeNumerical:   */
ShapeNumerical:   public ShapeNumerical(Solution solution){
ShapeNumerical:     mySolution = solution;
ShapeNumerical:   } // ShapeNumerical
ShapeNumerical: 
ShapeNumerical: 
ShapeNumerical:   /** Test if the function is complex
ShapeNumerical:       @return true if complex function
ShapeNumerical:   */
ShapeNumerical:   public boolean isComplex(){ return false; };
ShapeNumerical: 
ShapeNumerical:   
ShapeNumerical:   /** Returns the shape on a discrete mesh point position.
ShapeNumerical:       In a future version, this should include a real interpolation,
ShapeNumerical:       since the mesh coordinates may not coincide with the data !
ShapeNumerical:       @param mesh The mesh coordinates. Now Ignored.
ShapeNumerical:       @param index The mesh index
ShapeNumerical:       @return The value of the function at the specified mesh location
ShapeNumerical:   */
ShapeNumerical:   public double getValue(Mesh mesh, int index){
ShapeNumerical:     return mySolution.getValue(index);
ShapeNumerical:   } // getValue
ShapeNumerical: 
ShapeNumerical: 
ShapeNumerical:   /** Evaluates complex shape on a discrete mesh point position.
ShapeNumerical:       @param mesh The mesh coordinates
ShapeNumerical:       @param index The mesh index
ShapeNumerical:       @return The value of the function at the specified mesh location
ShapeNumerical:   */
ShapeNumerical:   public Complex getValueC(Mesh mesh, int index){
ShapeNumerical:     Complex z = new Complex(getValue(mesh,index));
ShapeNumerical:     return z;
ShapeNumerical:   } // getValueC
ShapeNumerical: 
ShapeNumerical: 
ShapeNumerical:   /** Returns initial distribution of samplers
ShapeNumerical:       @param mesh The mesh coordinates
ShapeNumerical:       @param index The mesh index
ShapeNumerical:       @return The initial distribution of samplers
ShapeNumerical:   */
ShapeNumerical:   public double getSampling(Mesh mesh, int index){
ShapeNumerical:     double position = position_;
ShapeNumerical:     return position;
ShapeNumerical:   } // getSampling
ShapeNumerical: 
ShapeNumerical: } // class ShapeNumerical
ShapeOption: /* $Id: ShapeOption.java,v 1.1 2000/05/05 17:32:36 andrej Exp $ */
ShapeOption: 
ShapeOption: /******************************************************************************
ShapeOption:  ShapeOption -- Payoff function of an option at expiry
ShapeOption:     @see Solution#discretize
ShapeOption: ******************************************************************************/
ShapeOption: public class ShapeOption extends ShapeFunction{
ShapeOption: 
ShapeOption:   /** Creates an instance of the class
ShapeOption:       @param position The exercise price (strike)
ShapeOption:       @param amplitude Not used so far
ShapeOption:       @param width Not used so far
ShapeOption:   */
ShapeOption:   public ShapeOption(double amplitude, double position, double width){
ShapeOption:     position_ = position;
ShapeOption:     amplitude_ = amplitude;
ShapeOption:     width_ = width;
ShapeOption:   } // ShapeOption
ShapeOption: 
ShapeOption: 
ShapeOption:   /** Test if the function is complex
ShapeOption:       @return true if complex function
ShapeOption:   */
ShapeOption:   public boolean isComplex(){ return false; };
ShapeOption: 
ShapeOption: 
ShapeOption:   /** Evaluates the shape on a discrete mesh point position.
ShapeOption:       @param mesh The mesh coordinates
ShapeOption:       @param index The mesh index
ShapeOption:       @return The value of the function at the specified mesh location
ShapeOption:   */
ShapeOption:   public double getValue(Mesh mesh, int index){
ShapeOption:     double value = Math.max(position_ - mesh.point(index),0.);
ShapeOption:     return value;
ShapeOption:   } // getValue
ShapeOption: 
ShapeOption: 
ShapeOption:   /** Evaluates complex shape on a discrete mesh point position.
ShapeOption:       @param mesh The mesh coordinates
ShapeOption:       @param index The mesh index
ShapeOption:       @return The value of the function at the specified mesh location
ShapeOption:   */
ShapeOption:   public Complex getValueC(Mesh mesh, int index){
ShapeOption:     Complex z = new Complex(getValue(mesh,index));
ShapeOption:     return z;
ShapeOption:   } // getValueC
ShapeOption: 
ShapeOption: 
ShapeOption:   /** Returns initial distribution of samplers
ShapeOption:       @param mesh The mesh coordinates
ShapeOption:       @param index The mesh index
ShapeOption:       @return The initial distribution of samplers
ShapeOption:   */
ShapeOption:   public double getSampling(Mesh mesh, int index){
ShapeOption:     double position = position_;
ShapeOption:     return position;
ShapeOption:   } // getSampling
ShapeOption: 
ShapeOption: } // class ShapeOption
ShapeSoliton: /* $Id: ShapeSoliton.java,v 1.5 2000/05/05 17:32:36 andrej Exp $ */
ShapeSoliton: 
ShapeSoliton: /******************************************************************************
ShapeSoliton:  ShapeSoliton -- A soliton function
ShapeSoliton:     @see Solution#discretize
ShapeSoliton: ******************************************************************************/
ShapeSoliton:  public class ShapeSoliton extends ShapeFunction{
ShapeSoliton: 
ShapeSoliton:   /** Creates an instance of the class
ShapeSoliton:       @param amplitude The soliton amplitude
ShapeSoliton:       @param position The soliton position
ShapeSoliton:       @param width Is not appropriate for this shape
ShapeSoliton:   */
ShapeSoliton:   public ShapeSoliton(double amplitude, double position, double width){
ShapeSoliton:     amplitude_ = amplitude;
ShapeSoliton:     position_ = position;
ShapeSoliton:     width_ = width;
ShapeSoliton:   } // ShapeSoliton
ShapeSoliton: 
ShapeSoliton: 
ShapeSoliton:   /** Test if the function is complex
ShapeSoliton:       @return true if complex function
ShapeSoliton:   */
ShapeSoliton:   public boolean isComplex(){ return false; };
ShapeSoliton: 
ShapeSoliton:   
ShapeSoliton:   /** Evaluates the shape on a discrete mesh point position.
ShapeSoliton:       @param mesh The mesh coordinates
ShapeSoliton:       @param index The mesh index
ShapeSoliton:       @return The value of the function at the specified mesh location
ShapeSoliton:   */
ShapeSoliton:   public double getValue(Mesh mesh, int index){
ShapeSoliton:     int    n  = mesh.size();
ShapeSoliton:     double dx = mesh.interval(0);
ShapeSoliton:     double len = (double)n*dx;
ShapeSoliton:     double sca = 2./3.*amplitude_;
ShapeSoliton:     double a = (mesh.point(index) -
ShapeSoliton:  (len-position_))*Math.sqrt(sca/2);
ShapeSoliton:     double result = 3*sca/Math.pow( 0.5*(Math.exp(a)+Math.exp(-a)), 2);
ShapeSoliton:     sca=amplitude_ / 3.0;
ShapeSoliton:     a=(mesh.point(index)-position_) *
ShapeSoliton:       Math.sqrt(sca/2);
ShapeSoliton:     result += 3*sca/Math.pow( 0.5*(Math.exp(a)+Math.exp(-a)), 2);
ShapeSoliton:     return result;
ShapeSoliton:   } // getValue
ShapeSoliton: 
ShapeSoliton: 
ShapeSoliton:   /** Evaluates complex shape on a discrete mesh point position.
ShapeSoliton:       @param mesh The mesh coordinates
ShapeSoliton:       @param index The mesh index
ShapeSoliton:       @return The value of the function at the specified mesh location
ShapeSoliton:   */
ShapeSoliton:   public Complex getValueC(Mesh mesh, int index){
ShapeSoliton:     Complex z = new Complex(getValue(mesh,index));
ShapeSoliton:     return z;
ShapeSoliton:   } // getValueC
ShapeSoliton: 
ShapeSoliton: 
ShapeSoliton:   /** Returns initial distribution of samplers
ShapeSoliton:       @param mesh The mesh coordinates
ShapeSoliton:       @param index The mesh index
ShapeSoliton:       @return The initial distribution of samplers
ShapeSoliton:   */
ShapeSoliton:   public double getSampling(Mesh mesh, int index){
ShapeSoliton:     double position = position_;
ShapeSoliton:     return position;
ShapeSoliton:   } // getSampling
ShapeSoliton: 
ShapeSoliton: } // class ShapeSoliton
ShapeWavePacket: /* $Id: ShapeWavePacket.java,v 1.2 2000/05/05 17:32:37 andrej Exp $ */
ShapeWavePacket: 
ShapeWavePacket: /******************************************************************************
ShapeWavePacket:  ShapeWavePacket -- A Wave Packet function
ShapeWavePacket:     @see Solution#discretize
ShapeWavePacket: ******************************************************************************/
ShapeWavePacket: public class ShapeWavePacket extends ShapeFunction{
ShapeWavePacket: 
ShapeWavePacket:   /** Creates an instance of the class
ShapeWavePacket:       @param amplitude The wave packet amplitude
ShapeWavePacket:       @param width The localization
ShapeWavePacket:       @param position The absissa
ShapeWavePacket:   */
ShapeWavePacket:   public ShapeWavePacket(double amplitude, double position, double width, 
ShapeWavePacket:                          double wavelength){
ShapeWavePacket:     amplitude_ = amplitude;
ShapeWavePacket:     position_ = position;
ShapeWavePacket:     width_ = width;
ShapeWavePacket:     wavelength_ = wavelength;
ShapeWavePacket:   } // ShapeWavePacket
ShapeWavePacket: 
ShapeWavePacket: 
ShapeWavePacket:   /** Test if the function is complex
ShapeWavePacket:       @return true if complex function
ShapeWavePacket:   */
ShapeWavePacket:   public boolean isComplex(){ return true; };
ShapeWavePacket: 
ShapeWavePacket: 
ShapeWavePacket:   /** Evaluates the shape on a discrete mesh point position.
ShapeWavePacket:       @param mesh The mesh coordinates
ShapeWavePacket:       @param index The mesh index
ShapeWavePacket:       @return The value of the function at the specified mesh location
ShapeWavePacket:   */
ShapeWavePacket:   public Complex getValueC(Mesh mesh, int index){
ShapeWavePacket:     double norm = Math.sqrt(Math.PI/width_);
ShapeWavePacket:     double x0 = (mesh.point(index) - position_);
ShapeWavePacket:     Complex osc = new Complex(0.,2.*Math.PI/wavelength_*x0);
ShapeWavePacket:     Complex psi = new Complex(osc.exp().scale(
ShapeWavePacket:                          amplitude_*Math.exp(-x0*x0/(4.*width_))));
ShapeWavePacket:     return psi;
ShapeWavePacket: 
ShapeWavePacket:   } // getValueC
ShapeWavePacket: 
ShapeWavePacket:   /** Evaluates the square of the norm
ShapeWavePacket:       @param mesh The mesh coordinates
ShapeWavePacket:       @param index The mesh index
ShapeWavePacket:       @return The value of the function at the specified mesh location
ShapeWavePacket:   */
ShapeWavePacket:   public double getValue(Mesh mesh, int index){
ShapeWavePacket:     Complex psi = getValueC(mesh,index);
ShapeWavePacket:     double z = psi.norm();
ShapeWavePacket:     return z;
ShapeWavePacket: 
ShapeWavePacket:   } // getValue
ShapeWavePacket: 
ShapeWavePacket: 
ShapeWavePacket:   /** Returns initial distribution of samplers
ShapeWavePacket:       @param mesh The mesh coordinates
ShapeWavePacket:       @param index The mesh index
ShapeWavePacket:       @return The initial distribution of samplers
ShapeWavePacket:   */
ShapeWavePacket:   public double getSampling(Mesh mesh, int index){
ShapeWavePacket:     double position = position_;
ShapeWavePacket:     return position;
ShapeWavePacket:   } // getSampling
ShapeWavePacket: 
ShapeWavePacket: } // class ShapeWavePacket
Solution: /* $Id: Solution.java,v 1.38 2001/03/24 20:23:56 andrej Exp $ */
Solution: 
Solution: import java.awt.*;
Solution: import java.text.*;
Solution: 
Solution: /******************************************************************************
Solution: * Solution -- Is an abstract class containing all the solutions and solvers. 
Solution: *   @see FluidSolution
Solution: *   @see ParticleSolution
Solution: ******************************************************************************/
Solution: abstract public class Solution{
Solution:                                                            
Solution:   /** The PDE to be solved  @see #setPde */
Solution:   protected String pde;
Solution:   /** Numerical method name @see #setMethod */
Solution:   protected String method;
Solution:   /** Numerical scheme name @see #setScheme */
Solution:   protected String scheme;
Solution:   /** Initial condition name @see #setIC */
Solution:   protected String ic;
Solution:   /** Absolute time @see #setTime*/
Solution:   protected double time;
Solution: 
Solution:   /** Function time level 0 (IC) @see #f */      protected double[]  f0;
Solution: 
Solution:   /** Function time level n-1 */                 protected double[]  fm;
Solution:   /** Function time level n   */                 protected double[]  f;
Solution:   /** Function time level n+1 */                 protected double[]  fp;
Solution:   /** Derivative time level n-1 @see #fm */      protected double[]  dfm;
Solution:   /** Derivative time level n   @see #f */       protected double[]  df;
Solution:   /** Derivative time level n+1 @see #fp */      protected double[]  dfp;
Solution: 
Solution:   /** Extra Function time level n-1 */           protected double[]  gm;
Solution:   /** Extra Function time level n   */           protected double[]  g;
Solution:   /** Extra Function time level n+1 */           protected double[]  gp;
Solution:   /** Extra Derivative time level n-1 @see #gm */protected double[]  dgm;
Solution:   /** Extra Derivative time level n   @see #g */ protected double[]  dg;
Solution:   /** Extra Derivative time level n+1 @see #gp */protected double[]  dgp;
Solution: 
Solution:   /** Complex Function time level n-1 */         protected Complex[] hm;
Solution:   /** Complex Function time level n   */         protected Complex[] h;
Solution:   /** Complex Function time level n+1 */         protected Complex[] hp;
Solution:   /** Derivative time level n-1 @see #hm */      protected Complex[] dhm;
Solution:   /** Derivative time level n   @see #h */       protected Complex[] dh;
Solution:   /** Derivative time level n+1 @see #hp */      protected Complex[] dhp;
Solution: 
Solution:   /** Complex/spectrum time level n-1 */         protected Complex[] sm;
Solution:   /** Complex/spectrum time level n */           protected Complex[] s;
Solution:   /** Complex/spectrum time level n+1 */         protected Complex[] sp;
Solution: 
Solution:   /** The underlaying mesh of the solution */    protected Mesh mesh;
Solution:   /** The mesh points @see #mesh */              protected double[] x;
Solution:   /** The mesh intervals @see #mesh */           protected double[] dx;
Solution:   /** Store initial moments */                   protected double[] 
Solution:                                                    initialMoments = {0.,0.,0.};
Solution: 
Solution:   /** Horizontal scale of plot area */           protected int xSize;
Solution:   /** Vertical scale of plot area */             protected int ySize;
Solution:   /** Horizontal offset of plot area */          protected int xOffset;
Solution:   /** Vertical offset of plot area */            protected int yOffset;
Solution: 
Solution:   /** Creates an instance of a Solution object with all the attributes.
Solution:       @param runData The run time parameters
Solution:   ****************************************************************************/
Solution:   public Solution(RunData runData) {
Solution:     Mesh mesh = runData.getMesh();
Solution:     this.mesh = mesh;
Solution:     int n = mesh.size();
Solution:     x  = mesh.points();  dx = mesh.intervals(); f0= new double[n];
Solution:     fm = new double[n];  f  = new double[n];  fp  = new double[n];
Solution:     dfm= new double[n];  df = new double[n];  dfp = new double[n];
Solution:     gm = new double[n];  g  = new double[n];  gp  = new double[n];
Solution:     dgm= new double[n];  dg = new double[n];  dgp = new double[n];
Solution:     hm = new Complex[n]; h  = new Complex[n]; hp  = new Complex[n];
Solution:     dhm= new Complex[n]; dh = new Complex[n]; dhp = new Complex[n];
Solution:     sm = new Complex[n]; s  = new Complex[n]; sp  = new Complex[n];
Solution:     lastStep = 0;
Solution:     lastTimeStep = 0;
Solution:   } // Solution
Solution:   
Solution:                                                             
Solution:   /** Internal function to calculate the initial moments of f[] or their 
Solution:       deviation from the beginning of the evolution.
Solution:       @param m The order of the moment
Solution:       @return The value or deviation of the m:th moment of f[]
Solution:       @see #momentsDeviation
Solution:   ****************************************************************************/
Solution:   protected double calculateMoments(int m){
Solution:     int n=f.length-1;
Solution:     double moment = 0.0;
Solution:     if (m==0) {
Solution:       if (pde.equals(jbone.EXERCISE) && 
Solution:           scheme.equals(jbone.EXC3_02)) {                //Cylindrical Jacobian
Solution:         for (int i=0; i<n; i++) {
Solution:           moment= moment+0.5*dx[i]*(f[i+1]+f[i])*0.5*(x[i]+x[i+1]);
Solution:         }
Solution:       } else {                                           //Cartesian Jacobian
Solution:         for (int i=0; i<n; i++) {
Solution:           moment= moment+0.5*dx[i]*(f[i+1]+f[i]);
Solution:         }
Solution:         moment = moment +0.5*dx[n]*(f[0]+f[n]);
Solution:       }
Solution:     } else { moment=0.0; }
Solution:     return moment;                                       //Initial value
Solution:   } // calculateMoments
Solution:   
Solution:   /** Calculates the deviation from the m:th initial moment.
Solution:       @param m The order of the moment
Solution:       @return The deviation of the m:th moment from the beginning
Solution:   ****************************************************************************/
Solution:   public double momentsDeviation(int m){
Solution:       return (calculateMoments(m) - initialMoments[m])
Solution:  / initialMoments[m];
Solution:   } // moments
Solution: 
Solution:   /** Calculates the solution boundaries.
Solution:       @return A vector with {min(solution), max(solution)}
Solution:   ****************************************************************************/
Solution:   protected double[] limits() {
Solution:     double[] lim = {f[0], f[0]};
Solution:     for (int i=1;i<f.length;i++) {
Solution:       if (f[i]<lim[0]) {lim[0]=f[i];};
Solution:       if (f[i]>lim[1]) {lim[1]=f[i];};
Solution:       if (g[i]!=0. && g[i]<lim[0]) {lim[0]=g[i];};
Solution:       if (g[i]!=0. && g[i]>lim[1]) {lim[1]=g[i];};
Solution:     } // for
Solution:     return lim;
Solution:   } // limits
Solution:     
Solution:   
Solution:   /** Set the PDE as a string.
Solution:       @param pde The name of the equation
Solution:       @see jbone#ADVECTION
Solution:   ****************************************************************************/
Solution:   public void setPde(String pde){
Solution:     this.pde = new String(pde);
Solution:   } // setPde
Solution: 
Solution:   /** Set the numerical method as a string.
Solution:       @param method The name of the numerical method
Solution:       @return True
Solution:   ****************************************************************************/
Solution:   public void setMethod(String method){
Solution:     this.method = new String(method);
Solution:   } // setMethod
Solution: 
Solution:   /** Set the numerical scheme as a string.
Solution:       @param scheme The name of the numerical scheme
Solution:       @return True
Solution:   ****************************************************************************/
Solution:   public void setScheme(String scheme){
Solution:     this.scheme = new String(scheme);
Solution:   } // setScheme
Solution:   
Solution:   /** Set the initial condision as a string.
Solution:       @param ic The name of the initial condition
Solution:       @return True
Solution:   ****************************************************************************/
Solution:   public void setIC(String ic){
Solution:     this.ic = new String(ic);
Solution:   } // setIC
Solution:   
Solution:   
Solution:   /** Set the current physical time
Solution:       @param time Current time
Solution:       @return True
Solution:   ****************************************************************************/
Solution:   public boolean setTime(double time){
Solution:     this.time = time;
Solution:     return true;
Solution:   } // setTime
Solution: 
Solution: 
Solution:   /** Increment the current physical time
Solution:       @param time Current time increment
Solution:       @return True
Solution:   ****************************************************************************/
Solution:   public boolean incTime(double time){
Solution:     this.time += time;
Solution:     return true;
Solution:   } // incTime
Solution: 
Solution: 
Solution:   /** Get the current physical time
Solution:       @return current time
Solution:   ****************************************************************************/
Solution:   public double getTime(){
Solution:     return this.time;
Solution:   } // getTime
Solution:   
Solution:   
Solution:   /** Discretize the initial shape and initialize the moments
Solution:       @param function The initial shape to be approximated
Solution:   ****************************************************************************/
Solution:   abstract public void discretize(ShapeFunction function);
Solution: 
Solution:   /** The current step in the time discretization */
Solution:   private int lastStep;
Solution:   /** The last time step used */
Solution:   private double lastTimeStep;
Solution: 
Solution:   /** Updates the information for the headers
Solution:       @param runData List of run parameters
Solution:       @param step The current step in the simulation
Solution:       @see #plot
Solution:   ****************************************************************************/
Solution:   public void updateHeaders(RunData runData, int step){
Solution:     lastStep = step;
Solution:     lastTimeStep = runData.getParamValue(runData.timeStepNm);
Solution:   } // updateHeaders
Solution: 
Solution:   /** Advance the solution forward one step in time.
Solution:       The equation is set by the internal variable equation_ and 
Solution:       the numerical scheme by the internal variable scheme_
Solution:       @param runData List of run parameters
Solution:       @param physData Physical parameters (e.g. potential)
Solution:       @see RunData
Solution:       @see PhysData
Solution:       @return True if a scheme is implemented for that equation
Solution:   */
Solution:   abstract public boolean next(RunData runData, PhysData physData);
Solution:     
Solution:   /** Take the solution backward one step to initialize schemes 
Solution:       with 3 time levels.
Solution:       The equation is set by the internal variable equation_ and 
Solution:       the numerical scheme by the internal variable scheme_
Solution:       @param runData List of run parameters
Solution:       @see RunData
Solution:       @return True if an initialisation scheme is implemented for that equation
Solution:   */
Solution:   abstract public boolean previous(RunData runData, PhysData physData);
Solution:   
Solution:   /** Gives the value of the function for an index
Solution:       @param index The index for which to get the value
Solution:       @return The value of the function at a given index
Solution:   ****************************************************************************/
Solution:   public double getValue(int index) {
Solution:     return f[index];
Solution:   } // getValue
Solution: 
Solution:   /** Linear interpolation of the solution. Assumes a uniform mesh.
Solution:       @param arg Argument
Solution:       @return A linear interpolation of the function for a given argument
Solution:   ****************************************************************************/
Solution:   public double getValue(double arg){
Solution:     double[] xLim = mesh.limits();
Solution:     int index=(int)Math.floor((arg-xLim[0])*      // Lower mesh cell index
Solution:                       (mesh.size()-1)/(xLim[1]-xLim[0]));
Solution:     if(index == mesh.size()-1) index--;
Solution:     double x_low  = mesh.point(index);            //Linear interpolation
Solution:     double x_high = mesh.point(index+1);
Solution:     double a = (arg-x_low)/(x_high-x_low);
Solution:     return f[index]*(1-a) + f[index+1]*a;
Solution:   } // getValue
Solution: 
Solution:   /** Tells whether the solution implements a option
Solution:          @param option The the option to implement
Solution:          @return True if the option is implemented
Solution:          @see jbone#pdeNames
Solution:          @see jbone#schemeNames
Solution:   */
Solution:   abstract public boolean hasOption(String option);
Solution: 
Solution:   /** Set the corners of the plot area
Solution:   ****************************************************************************/
Solution:   public void rescale(){
Solution:     double[] lim = limits();
Solution:     // Extra space needed for the periodic boundary condition line
Solution:     x_0 = x[0] - dx[0] / 2.0;
Solution:     x_1 = x[x.length - 1] + dx[x.length - 1] / 2.0;
Solution:     y_0 = lim[0];
Solution:     y_1 = lim[1];
Solution:     if (y_0 == y_1) { y_0=- 1.; y_1=+ 1.; }
Solution:   } // rescale
Solution: 
Solution:   /** x of lower left corner of plot area */
Solution:   protected double x_0;
Solution:   /** x of upper right corner of plot area */
Solution:   protected double x_1;
Solution:   /** y of lower left corner of plot area */
Solution:   protected double y_0;
Solution:   /** y of upper right corner of plot area */
Solution:   protected double y_1;
Solution: 
Solution:   /** Returns window size
Solution:       @see #plot
Solution:   ****************************************************************************/
Solution:   public int[] getWinSize(){
Solution:     int[] ret = {xSize,ySize,xOffset,yOffset};
Solution:     return ret;
Solution:   } //getWinSize
Solution: 
Solution:   /** Get physical coordinates from mouse coordinates
Solution:       @param x horizontal mouse coordinate
Solution:       @param y vertical  mouse coordinate
Solution:       @see #plot
Solution:   ****************************************************************************/
Solution:   public double[] measure(int x, int y){
Solution:     double dx = (xSize-2*xOffset)/(x_1-x_0);
Solution:     double dy = (ySize-2*yOffset)/(y_1-y_0);
Solution:     double X  = x_0+((double)( x-xOffset))/dx;
Solution:     double Y  = y_0+((double)(-y+ySize+1+5))/dy;
Solution:     double[] coord = {X,Y};
Solution:     return coord;
Solution:   } // measure
Solution: 
Solution:   /** Plots the solution
Solution:       @param plotArea The plot area
Solution:       @param offScrImage The off screen image to draw on
Solution:       @param headers Whether to draw headers
Solution:   ****************************************************************************/
Solution:   public void plot(Canvas plotArea, Image offScrImage, boolean headers){
Solution:   } // plot
Solution: 
Solution:   /** Print the solution in ASCII to java console
Solution:   ****************************************************************************/
Solution:   public void output(int step){
Solution:     System.out.println(" ");
Solution:     System.out.println("Step="+step);
Solution:     for (int i=0; i<mesh.size(); i++) {
Solution:       System.out.println("x["+i+"]="+mesh.point(i)+
Solution:                          "     f0["+i+"]="+f0[i]+
Solution:                          " f["+i+"]="+f[i]);
Solution:     }
Solution:   } // print
Solution: 
Solution: } // class Solution



      
back up next contents bibliography Copyright © Lifelong-learners at
Warning: date() [function.date]: It is not safe to rely on the system's timezone settings. You are *required* to use the date.timezone setting or the date_default_timezone_set() function. In case you used any of those methods and you are still getting this warning, you most likely misspelled the timezone identifier. We selected 'America/Denver' for 'MDT/-6.0/DST' instead in /home/lifejau0/public_html/share/SRC/macros.php on line 369
19:43:55, May 21st, 2012