/*
* @(#)Graph.java 1.9 99/08/04
* MODIFS PYL juillet Aout 2005!!!!!!!!!!
* www.lmm.jussieu.fr/~lagree
+ py@cccr.jussieu.fr
*
* This software is designed and intended for use in on-line control of
* aircraft, air traffic, aircraft navigation or aircraft communications; or in
* the design, construction, operation or maintenance of any nuclear facility.
*/
//javac guiChalOmegaImp2D.java Kul.java kolor.java tridiag.java;java guiChalOmegaImp2D
//javac guiChalOmegaImp2D.java Kul.java kolor.java tridiag.java; open index.html
import java.util.*;
import java.awt.*;
import java.applet.Applet;
import java.awt.event.*;
import javax.swing.*;
import java.io.*;
class GraphPanel extends Panel
implements Runnable, MouseListener {
guiChalOmegaImp2D graph;
Kul kkul=new Kul();
public double dt0=0.000010;
Thread relaxer;
public GraphPanel (){
}
GraphPanel(guiChalOmegaImp2D graph) {
this.graph = graph;
addMouseListener(this);
}
void initout() {
System.out.println("init t=" + kkul.t +" ....................... dt =" +dt0);
kkul.start();
}
public void sauveparam()
{ String texte = "#OK a poursuivre!";
System.out.println("sauf" );
try{
FileOutputStream filename= new FileOutputStream("xyz.dat");
PrintStream ffile = new PrintStream(filename);
for (int i = 0; i <= kkul.n; i++) {
for (int j = 0; j <= kkul.n; j++) {
ffile.println(i*kkul.dx + " "+ j*kkul.dx + " " + kkul.T[i][j]);
}
ffile.println(" " );}
FileOutputStream filenameF= new FileOutputStream("xy.dat");
PrintStream ffileF = new PrintStream(filenameF);
for (int i = 0; i <= kkul.n; i++) {
ffileF.println(i*kkul.dx + " " + kkul.T[i][0] + " " + (kkul.T[i][1]-kkul.T[i][0])/kkul.dy);
}
}
catch (IOException Ex)
{System.out.println(Ex.getMessage());}
}
public void run() {
Thread me = Thread.currentThread();
while (relaxer == me) {
relax();
try {
Thread.sleep(100);
} catch (InterruptedException e) {
break;
}
}
}
synchronized void relax() {
repaint();
}
Image offscreen;
Dimension offscreensize;
Graphics offgraphics;
public synchronized void update(Graphics g) {
Dimension d = getSize();
if ((offscreen == null) || (d.width != offscreensize.width) || (d.height != offscreensize.height)) {
offscreen = createImage(d.width, d.height);
offscreensize = d;
if (offgraphics != null) {
offgraphics.dispose();
}
offgraphics = offscreen.getGraphics();
offgraphics.setFont(getFont());
}
offgraphics.setColor(getBackground());
offgraphics.fillRect(0, 0, d.width, d.height);
offgraphics.setColor(Color.black) ;
offgraphics.drawLine(d.width/10, d.height*9/10,(9*d.width)/10 , d.height*9/10);
offgraphics.drawLine(d.width/10, d.height*9/10,d.width/10 , d.height/10);
offgraphics.drawLine((9*d.width)/10, d.height*9/10,(9*d.width)/10 , d.height*1/10);
offgraphics.drawLine(d.width/10, d.height*1/10,(9*d.width)/10, d.height*1/10);
offgraphics.drawString("x " , ((int)( 9.5*d.width/10)), ((int) (d.height*9.5/10)));
offgraphics.drawString("T(x,y,t="+(((int)(kkul.t*1000))/1000.)+")", d.width/11, d.height/11);
offgraphics.setColor(Color.red) ;
for (int i = 1 ; i <= kkul.n ; i++) {
// offgraphics.drawLine(d.width/4+(i-1)*d.width/kkul.n/2, d.height*8/10-(int)(d.height*kkul.T[i-1]/2),
// d.width/4+ i* d.width/kkul.n/2, d.height*8/10-(int)(d.height*kkul.T[ i ]/2));
}
for (int i = 0 ; i <= kkul.n ; i++) {
for (int j = 0 ; j <= kkul.n ; j++) {
offgraphics.setColor(kolor.code(kkul.T[i][j]));
offgraphics.fillRect(d.width/10+(i)*d.width/kkul.n*8/10, d.height*9/10-(int)(j*d.height*8/(kkul.n*10)),
(1+d.width*8/(kkul.n*10)), (1+ d.height*8/(kkul.n*10)));
}}
offgraphics.setColor(Color.black) ;
offgraphics.drawLine(d.width/10, d.height*9/10,(9*d.width)/10 , d.height*9/10);
offgraphics.drawLine(d.width/10, d.height*9/10,d.width/10 , d.height/10);
offgraphics.drawLine((9*d.width)/10, d.height*9/10,(9*d.width)/10 , d.height*1/10);
offgraphics.drawLine(d.width/10, d.height*1/10,(9*d.width)/10, d.height*1/10);
offgraphics.drawString("x " , ((int)( 9.5*d.width/10)), ((int) (d.height*9.5/10)));
offgraphics.drawString("T(x,y,t="+(((int)(kkul.t*1000))/1000.)+")", d.width/11, d.height/11);
g.drawImage(offscreen, 0, 0, null);
}
//1.1 event handling
public void mouseClicked(MouseEvent e) {}
public void mousePressed(MouseEvent e) {}
public void mouseReleased(MouseEvent e){}
public void mouseEntered(MouseEvent e) {}
public void mouseExited(MouseEvent e) {}
public void mouseDragged(MouseEvent e) {}
public void mouseMoved(MouseEvent e) {}
public void start() {
relaxer = new Thread(this);
relaxer.start();
}
public void stop() {
relaxer = null;
}
}
public class guiChalOmegaImp2D extends Applet implements ActionListener, ItemListener {
GraphPanel panel;
Panel controlPanel;
JButton raz = new JButton("RAZ");
JButton calcul = new JButton("Calcul");
JButton pause = new JButton("Pause");
JButton kit = new JButton("Quitte");
//JSlider sliderR = new JSlider(JSlider.HORIZONTAL, 0, 250, 180);
JLabel lab = new JLabel("gros coucou rouge
et ligne en italique gras ", JLabel.CENTER) ;
JTextField saizie= new JTextField ("0.000010");
Choice choix = new Choice();
JLabel labo = new JLabel(" ", JLabel.CENTER) ;
JTextField saizio= new JTextField ("0.000");
public void init() {
setLayout(new BorderLayout());
panel = new GraphPanel(this);
add("Center", panel);
controlPanel = new Panel();
add("South", controlPanel);
//controlPanel.add(sliderR);
controlPanel.add(lab) ; lab.setText(" dt= ") ;
controlPanel.add(saizie);
raz.setLocation(10,10);raz.setSize(220,23); controlPanel.add(raz); raz.addActionListener(this);
controlPanel.add(calcul); calcul.addActionListener(this);
controlPanel.add(pause); pause.addActionListener(this);
String champ="T imp....";
controlPanel.add(labo) ; labo.setText(champ) ;
controlPanel.add(saizio);
controlPanel.add(new JLabel("Cond. lim.", Label.RIGHT));
choix.addItemListener(this);
controlPanel.add(choix);
choix.addItem("T(x,0)=0 T(1,y)=0 T(x,1)=0 T(0,y)=0");//0
choix.addItem("T(x,0)=1 T(1,y)=0 T(x,1)=0 T(0,y)=0");
choix.addItem("T(x,0)=0 T(1,y)=1 T(x,1)=0 T(0,y)=0");
choix.addItem("T(x,0)=0 T(1,y)=0 T(x,1)=1 T(0,y)=0");//3
choix.addItem("T(0)=sin(om t),T(1)=0 ");//4
choix.addItem("Bi T'(x,0)=T(x,0), T(autres bords)=1");
choix.addItem("Bi T'(x,0)=T(x,0),T(x,1)=1, T'(0,y)=T'(1,y)=0");
controlPanel.add(kit); kit.addActionListener(this);
panel.initout();
}
public void destroy() {
remove(panel);
remove(controlPanel);
}
public void start() {
razz();
panel.start();
}
public void stop() {
panel.stop();
}
public void razz() {
panel.kkul.prems();
synchronized (panel.kkul) {
panel.kkul.pleaseWait = true;}
change_it();
System.out.println("Init" );
}
public void actionPerformed(ActionEvent e) {
Object src = e.getSource();
if (src == raz) {
razz();
System.out.println("RAZ, t=" + panel.kkul.t);
return;
}
if (src == calcul) {
String ch=saizie.getText();
double z =Double.parseDouble(ch);
System.out.println("calcul, t=" + panel.kkul.t + "................dt =" + z );
panel.kkul.setdt(z);
change_it();
synchronized (panel.kkul) {
panel.kkul.pleaseWait = false;
panel.kkul.notify();}
return;
}
if (src == pause) {
synchronized (panel.kkul) {
panel.kkul.pleaseWait = true;}
panel.sauveparam();
}
if (src == kit) {
destroy();
System.out.println("kenavo");
System.exit(0) ;
}
}
public void itemStateChanged(ItemEvent e) {
change_it();
}
public void change_it(){
int ined=choix.getSelectedIndex();
String ch=saizie.getText();
double z =Double.parseDouble(ch);
ch=saizio.getText();
z =Double.parseDouble(ch);
System.out.println("param " + z );
if (ined==0 ){panel.kkul.cl0000(); labo.setText("T imp....") ;}
if (ined==1 ){panel.kkul.cl1000(); labo.setText("T imp....") ;}
if (ined==2 ){panel.kkul.cl0100(); labo.setText("T imp....") ;}
if (ined==3 ){panel.kkul.cl0010(); labo.setText("T imp....") ;}
if (ined==4 ){panel.kkul.omega=z;panel.kkul.clt0(); labo.setText("omega= ");}
if (ined==5){panel.kkul.Bi=z; panel.kkul.clB1(); labo.setText("Bi= ") ;}
if (ined==6){panel.kkul.Bi=z; panel.kkul.clBqs(); labo.setText("Bi= ") ;}
}
///////////////////////////////////////////////////////////
public static void main(String args[]) {
Frame f = new Frame("guiChaleur Implicite par PYL");
guiChalOmegaImp2D guiChalOmegaImp2D = new guiChalOmegaImp2D();
//System.out.println(args[]);
guiChalOmegaImp2D.init();
guiChalOmegaImp2D.start();
f.add("Center", guiChalOmegaImp2D);
f.setSize(1000,700);
f.setLocation(200, 10);
f.show();
}
public String getAppletInfo() {
return "Calcul interactif par PYL. \n 'java guiGraph' \nou applet.";
}
}