package jass.generators; import java.io.*; import java.net.*; /** Modal model, which is loaded from an .sy format text file. @author Kees van den Doel (kvdoel@cs.ubc.ca) */ public class ModalModel { /** Mode frequencies in Hertz. */ public float[] f; /** Angular decay rates in Hertz. */ public float[] d; /** Gains. a[p][k] is gain at point p for mode k. */ public float[][] a; /** Number of modes available. */ public int nf; /** Number of modes used. */ public int nfUsed; /** Number of points. */ public int np; /** Multiplies all frequencies. */ public float fscale = 1f; /** Multiplies all dampings. */ public float dscale = 1f; /** Multiplies all gains. */ public float ascale = 1f; /** Constructor. @param fn File name with modal data in .sy format. */ public ModalModel(String fn) throws FileNotFoundException { readModes(fn); } /** Constructor. @param url Url name with modal data in .sy format. */ public ModalModel(URL url) throws IOException { readModes(url); } /** Constructor. Just allocates data. @param nf number of modes. @param np numpber of locations. */ public ModalModel(int nf, int np) { this.nf = this.nfUsed = nf; this.np = np; allocate(nf,np); } /** Allocated arrays. @param nf number of modes. @param np number of locations. */ protected void allocate(int nf, int np) { f = new float[nf]; d = new float[nf]; a = new float[np][nf]; } private boolean isURLComment(String s) { if(s.charAt(0) == '<' && s.charAt(1) == '!') { return true; } else { return false; } } private void readModes(BufferedReader br) { try { float dval; int ival; String s = "<!"; // BufferedReader may contain Netscape 7.1 generated JavaScript code due to a bug in Netscape. Get rid of it. // It starts with "<!". I guess "any URL string is supposed to be able to contains this kinda // comment"s is the idea. while(isURLComment(s)) { s = br.readLine(); } // s is now: "nactive_freq:" s = br.readLine(); //System.out.println(":"+s+":"); nfUsed = Integer.parseInt(s); s = br.readLine(); // n_freq: s = br.readLine(); nf = new Integer(s).intValue(); s = br.readLine(); // n_points: s = br.readLine(); np = new Integer(s).intValue(); s = br.readLine(); // freq_scale: s = br.readLine(); fscale = new Float(s).floatValue(); s = br.readLine(); // d_scale: s = br.readLine(); dscale = new Float(s).floatValue(); s = br.readLine(); // a_scale: s = br.readLine(); ascale = new Float(s).floatValue(); allocate(nf,np); s = br.readLine(); // frequencies: for(int i=0;i<nf;i++) { s = br.readLine(); f[i] = new Float(s).floatValue(); } s = br.readLine(); // dampings: for(int i=0;i<nf;i++) { s = br.readLine(); d[i] = new Float(s).floatValue(); } s = br.readLine(); // amplitudes[point][freq]: for(int p=0;p<np;p++) { for(int i=0;i<nf;i++) { s = br.readLine(); a[p][i] = new Float(s).floatValue(); } } s = br.readLine(); // END } catch( IOException e) { System.out.println(e+" Error parsing sy data "); } } /** Read the modes file in .sy format. @param fn File name with modal data in .sy format. */ public void readModes(String fn) throws FileNotFoundException { BufferedReader br = new BufferedReader(new FileReader(fn)); readModes(br); } /** Read the modes url in .sy format. @param url URL name with modal data in .sy format. */ public void readModes(URL url) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(url.openStream())); readModes(br); } }