⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 liquidsph3d.java

📁 JAVA program for Liquid SPH 3D models
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
/* liquid - smoothed particle hydrodynamics 3D *//* coded by Ikeuchi Mitsuru   *//* ver 0.0.1   2005.05.21     *//* ver 0.0.2   2005.07.10 bug of dwwvdr(r,h) fixed */import java.awt.*;import java.awt.event.*;import java.applet.*;public class liquidSPH3D extends Applet  implements MouseListener, MouseMotionListener,    ItemListener, ActionListener, AdjustmentListener, Runnable {/* -------------------------------------- set global ------ */  Button bt_reset, bt_start, bt_stop;  Choice ch_view;  Scrollbar sc_rate,sc_alpha,sc_g;  Thread th = null;  Dimension dim;  Image imgOff;  Graphics gOff;  int sleepTime = 30;  int dispMode = 3;  int incRate = 10;  int resetSW = 0;  int started = 1;  double alpha = 10.0;  double dens0 = 1.0;  double gravity = 1.0;  double xMax = 10.0;  double yMax = 10.0;  double zMax = 10.0;    int dgX, dgY, dgXb,dgYb;  double cx = 0.5*xMax;  double cy = 0.5*yMax;  double cz = 0.5*zMax;  double theta = -20.0*3.14/180.0;  double fai = 10.0*3.14/180.0;  double dtheta = 0.0*3.14/180.0;  double pai = 3.1415926536;  double t = 0.0;  double dt = 0.01;  double hh0 = 0.25;  double rBond = hh0*1.2;  int ncube = 20;  int NNp = ncube*ncube*ncube+100;  int kind[] = new int [NNp];  int bond[][] = new int[NNp][20];  double xx[] = new double [NNp];  double yy[] = new double [NNp];  double zz[] = new double [NNp];  double vx[] = new double [NNp];  double vy[] = new double [NNp];  double vz[] = new double [NNp];  double ax[] = new double [NNp];  double ay[] = new double [NNp];  double az[] = new double [NNp];  double hh[] = new double [NNp];  double mass[] = new double [NNp];  double density[] = new double [NNp];  double pressure[] = new double [NNp];  double energy[] = new double [NNp];  double power[] = new double [NNp];  int Nsx = 20;  int Nsy = 20;  int Nsz = 20;  int section[][][][] = new int[Nsx][Nsy][Nsz][200];  int srtz[][] = new int[2][NNp];  double px[] = new double[NNp];   double py[] = new double[NNp];   double pz[] = new double[NNp];   double wkx[] = new double[8];   double wky[] = new double[8];   double wkz[] = new double[8];   double pwkx[] = new double[8];   double pwky[] = new double[8];   double pwkz[] = new double[8];   int boxp[][] = {   {0,1},{0,2},{0,4},{1,3},{1,5},{2,3},{2,6},{4,5},{4,6},{3,7},{5,7},{6,7}  };/* ----------------------------- applet control ------ */  public void init() {    resize(630,320);    setBackground(Color.white);    dim = getSize();    imgOff = createImage(dim.width,dim.height);    gOff = imgOff.getGraphics();    bt_reset= new Button("reset");    bt_reset.addActionListener(this);    bt_start= new Button("start");    bt_start.addActionListener(this);     bt_stop = new Button("stop");    bt_stop.addActionListener(this);    ch_view = new Choice();    ch_view.addItem("particle"); ch_view.addItem("buble");     ch_view.addItem("x-colored"); ch_view.addItem("y-colored");    ch_view.addItem("z-colored"); ch_view.addItem("density");    ch_view.addItem("pressure"); ch_view.addItem("velocity");    ch_view.addItemListener(this);    ch_view.select("y-colored");    sc_rate= new Scrollbar(Scrollbar.HORIZONTAL,10,10,1,110);    sc_rate.addAdjustmentListener(this);    sc_alpha= new Scrollbar(Scrollbar.HORIZONTAL,100,10,50,210);    sc_alpha.addAdjustmentListener(this);    sc_g= new Scrollbar(Scrollbar.HORIZONTAL,100,10,0,210);    sc_g.addAdjustmentListener(this);    addMouseListener(this);      addMouseMotionListener(this);    setLayout(new BorderLayout());    Panel pnl = new Panel();    pnl.setLayout(new GridLayout(1,6,5,0));    pnl.add(bt_reset);    pnl.add(bt_start);    pnl.add(bt_stop);    pnl.add(sc_g);    pnl.add(sc_alpha);	/*    pnl.add(new Label("  "));*/    pnl.add(ch_view);    add(pnl,"North");    setInitialCondition();    setWaku();  }  public void start() {    if (th == null) {      th = new Thread(this);      th.start();    }  }  public void stop() {    if (th != null) {      th.stop();      th = null;    }  }  public void itemStateChanged(ItemEvent ev){    if (ev.getSource() == ch_view) {      dispMode = ch_view.getSelectedIndex();    }  }  public void actionPerformed(ActionEvent ev){    if(ev.getSource() == bt_reset){       t = 0.0;      resetSW = 1;      started = 0;    } else if(ev.getSource() == bt_start){       started = 1;    } else if(ev.getSource() == bt_stop){      started = 0;    }		}  public void adjustmentValueChanged(AdjustmentEvent ev){    if(ev.getSource() == sc_rate) {       incRate = sc_rate.getValue();    } else if(ev.getSource() == sc_alpha) {       alpha = 0.1*sc_alpha.getValue();    } else if(ev.getSource() == sc_g) {       gravity = 0.01*sc_g.getValue();    }  }  public void mousePressed(MouseEvent ev){ }  public void mouseReleased(MouseEvent ev){    dgXb = 0; dgYb = 0;    dgX = 0; dgY = 0;  }  public void mouseClicked(MouseEvent ev){ }  public void mouseEntered(MouseEvent ev){ }   public void mouseExited (MouseEvent ev){ }  public void mouseMoved  (MouseEvent ev){ }  public void mouseDragged(MouseEvent ev){    dgXb = dgX; dgYb = dgY;    dgX=ev.getX();    dgY=ev.getY();    if (dgXb==0 && dgYb==0) {      dgXb = dgX; dgYb = dgY;    }    theta += 0.5*3.14/180.0*(dgX-dgXb);    fai += 0.5*3.14/180.0*(dgY-dgYb);  }  public void run() {    while (th != null) {      try {        timeEvolution();        offPaint();        repaint();        Thread.sleep(sleepTime);      } catch (InterruptedException e) { }    }  }  public void update(Graphics g) {    paint(g);  }  public void paint(Graphics g) {    g.drawImage(imgOff,0,0,this);  }/* ----------------------------- offPaint -------------------- */  void offPaint() {    int i;    int gbx,gby;    double sc;    gOff.setColor(Color.white);    gOff.fillRect(0,0,dim.width,dim.height);    rotate(theta,fai);    zSort();    gbx = 70;    gby = 80;    sc = 20.0;    plotBoxInit(gbx, gby, sc);    if (dispMode==0) {	  plotParticle(gbx, gby, sc, 1);	} else if (dispMode==1) {      plotParticle(gbx, gby, sc, 0);    } else if (dispMode==2) {      plotColorParticle(gbx, gby, sc, 0);	} else if (dispMode==3) {      plotColorParticle(gbx, gby, sc, 1);	} else if (dispMode==4) {      plotColorParticle(gbx, gby, sc, 2);	} else if (dispMode==5) {      plotColorOf(density, 0.01, gbx, gby, sc);	} else if (dispMode==6) {      plotColorOf(pressure, 0.02, gbx, gby, sc);	} else if (dispMode==7) {      plotVelocity(100.0, gbx, gby, sc);	} else if (dispMode==8) {	}    plotBoxFin(gbx, gby, sc);    gOff.setColor(Color.black);    gOff.drawString("t="+(int)(t*10.0+0.5)/10.0+" ",630/6*0+10,40);    gOff.drawString("gravity="+(int)(gravity*100.0+0.5)/100.0+" ",630/6*3+10,40);	gOff.drawString("viscosity="+(int)(alpha*10.0)/10.0+" ",630/6*4+10,40);    gOff.drawString("view",630/6*5+10,40);/*    gOff.drawString("maxSec="+maxSection()+" ",150,40);*/  }/*------------------------- plot methods -------------------*/  void plotParticle(int gbx, int gby, double scale, int filled) {    int i,j,gx,gy,gz;	double c;    for (i=0; i<NNp; i++) {        j = srtz[0][i];        gx = (int)(scale*px[j])+gbx;        gy = (int)(scale*py[j])+gby;        gz = (int)(10.0*(0.4*(pz[j]/zMax)+0.6));		c = 0.66;		if (kind[j]!=0) c= 0.15;        gOff.setColor(Color.getHSBColor((float)c,0.6f,(float)(0.4*pz[j]/zMax+0.4)));		if (filled==1) {          gOff.fillOval(gx-gz/2,gy-gz/2, gz, gz);		} else {          gOff.drawOval(gx-gz/2,gy-gz/2, gz, gz);		}    }  }  void plotColorParticle(int gbx, int gby, double scale, int direction) {    int i,j,gx,gy,gz;    for (i=0; i<NNp; i++) {      j = srtz[0][i];      gx = (int)(scale*px[j])+gbx;      gy = (int)(scale*py[j])+gby;      gz = (int)(10.0*(0.4*(pz[j]/zMax)+0.6));      if (direction==0) {        gOff.setColor(Color.getHSBColor((float)(0.66*(1.0-xx[j]/xMax)),0.8f,(float)(0.4*pz[j]/zMax+0.4)));      } else if (direction==1) {        gOff.setColor(Color.getHSBColor((float)(0.66*yy[j]/yMax),0.8f,(float)(0.4*pz[j]/zMax+0.4)));      } else if (direction==2) {        gOff.setColor(Color.getHSBColor((float)(0.66*(1.0-zz[j]/zMax)),0.8f,(float)(0.4*pz[j]/zMax+0.4)));      }      gOff.fillOval(gx-gz/2,gy-gz/2, gz, gz);    }  }  void plotColorOf(double a[], double mag, int gbx, int gby, double scale) {    int i,j,gx,gy,gz;	double ai;    for (i=0; i<NNp; i++) {      j = srtz[0][i];      gx = (int)(scale*px[j])+gbx;      gy = (int)(scale*py[j])+gby;      gz = (int)(10.0*(0.4*(pz[j]/zMax)+0.6));	  ai = mag*a[j]; if (ai<=0.0) ai=0.0;	  if (ai>1.0) ai=1.0;      gOff.setColor(Color.getHSBColor((float)(0.66*(1.0-ai)),0.8f,(float)(0.4*pz[j]/zMax+0.4)));      gOff.fillOval(gx-gz/2,gy-gz/2, gz, gz);    }  }  void plotVelocity(double mag, int gbx, int gby, double scale) {    int i,j,gx,gy,gz,g2x,g2y,g2z;	double xx2j,yy2j,zz2j,px2,py2,pz2;    double cosTh,sinTh,cosFi,sinFi;    cosTh = Math.cos(theta); sinTh = Math.sin(theta);    cosFi = Math.cos(fai); sinFi = Math.sin(fai);    for (i=0; i<NNp; i++) {      j = srtz[0][i];      gx = (int)(scale*px[j])+gbx;      gy = (int)(scale*py[j])+gby;      gz = (int)(10.0*(0.4*(pz[j]/zMax)+0.6));	  	  xx2j = xx[j]+vx[j]*dt*mag;	  yy2j = yy[j]+vy[j]*dt*mag;	  zz2j = zz[j]+vz[j]*dt*mag;      py2 = cosFi*(yy2j-cy)+sinFi*(zz2j-cz) + cy;       pz2 = -sinFi*(yy2j-cy)+cosFi*(zz2j-cz) + cz;      px2 = cosTh*(xx2j-cx)+sinTh*(pz2-cz) + cx;       pz2 = -sinTh*(xx2j-cx)+cosTh*(pz2-cz) + cz;      g2x = (int)(scale*px2)+gbx;      g2y = (int)(scale*py2)+gby;      g2z = (int)(10.0*(0.4*(pz[j]/zMax)+0.6));	  if (vy[j]<0.0) {	    gOff.setColor(Color.getHSBColor(0.01f,0.8f,(float)(0.4*pz[j]/zMax+0.4)));	  } else {        gOff.setColor(Color.getHSBColor(0.66f,0.8f,(float)(0.4*pz[j]/zMax+0.4)));	  }      gOff.drawLine(gx,gy, g2x, g2y);    }  }  void plotBoxInit(int gbx, int gby, double scale) {    int i,gx,gy,g2x,g2y,farPoint;    farPoint = findMin();    for (i=0; i<12; i++) {      gx = (int)(scale*pwkx[boxp[i][0]])+gbx;      gy = (int)(scale*pwky[boxp[i][0]])+gby;      g2x = (int)(scale*pwkx[boxp[i][1]])+gbx;      g2y = (int)(scale*pwky[boxp[i][1]])+gby;      if (boxp[i][0]==farPoint || boxp[i][1]==farPoint) {         gOff.setColor(Color.lightGray);        gOff.drawLine(gx,gy, g2x, g2y);      }     }  }  void plotBoxFin(int gbx, int gby, double scale) {    int i,gx,gy,g2x,g2y,farPoint;    farPoint = findMin();    for (i=0; i<12; i++) {      gx = (int)(scale*pwkx[boxp[i][0]])+gbx;      gy = (int)(scale*pwky[boxp[i][0]])+gby;      g2x = (int)(scale*pwkx[boxp[i][1]])+gbx;      g2y = (int)(scale*pwky[boxp[i][1]])+gby;      if (boxp[i][0]!=farPoint && boxp[i][1]!=farPoint) {         gOff.setColor(Color.black);        gOff.drawLine(gx,gy, g2x, g2y);      }    }  }  int findMin() {    int i,im;    double m;    im = 0; m = pwkz[im];    for (i=0; i<8; i++) {      if (pwkz[i]<m) {        m = pwkz[i];        im = i;      }    }    return(im);  }/*-------------------------------------  sort z  ----------*/  void zSort() {    int i,j,w;    for (i=0; i<NNp; i++) {      j = srtz[0][i];      srtz[1][i] = (int)(32767.0*pz[j]/zMax);    }     for (i=0; i<100; i++) {      for (j=0; j<NNp-1; j++) {        if (srtz[1][j]>srtz[1][j+1]) {          w = srtz[0][j]; srtz[0][j]=srtz[0][j+1]; srtz[0][j+1]=w;          w = srtz[1][j]; srtz[1][j]=srtz[1][j+1]; srtz[1][j+1]=w;        }      }    }      }  void zSortInit() {    int i,j,w;    for (i=0; i<NNp; i++) {      srtz[0][i] = i;      srtz[1][i] = (int)(32767.0*pz[i]/zMax);    }     for (i=0; i<NNp; i++) {      for (j=0; j<NNp-1; j++) {        if (srtz[1][j]>srtz[1][j+1]) {          w = srtz[0][j]; srtz[0][j]=srtz[0][j+1]; srtz[0][j+1]=w;          w = srtz[1][j]; srtz[1][j]=srtz[1][j+1]; srtz[1][j+1]=w;        }      }    }      }/*-------------------------------------  rotate  ----------*/  void rotate(double th,double fi) {    int i;    double cosTh,sinTh,cosFi,sinFi;    cosTh = Math.cos(th); sinTh = Math.sin(th);    cosFi = Math.cos(fi); sinFi = Math.sin(fi);    for (i=0; i<NNp; i++) {      py[i] = cosFi*(yy[i]-cy)+sinFi*(zz[i]-cz) + cy;       pz[i] = -sinFi*(yy[i]-cy)+cosFi*(zz[i]-cz) + cz;    }     for (i=0; i<NNp; i++) {      px[i] = cosTh*(xx[i]-cx)+sinTh*(pz[i]-cz) + cx;       pz[i] = -sinTh*(xx[i]-cx)+cosTh*(pz[i]-cz) + cz;    }     for (i=0; i<8; i++) {      pwky[i] = cosFi*(wky[i]-cy)+sinFi*(wkz[i]-cz) + cy;       pwkz[i] = -sinFi*(wky[i]-cy)+cosFi*(wkz[i]-cz) + cz;    }     for (i=0; i<8; i++) {      pwkx[i] = cosTh*(wkx[i]-cx)+sinTh*(pwkz[i]-cz) + cx;       pwkz[i] = -sinTh*(wkx[i]-cx)+cosTh*(pwkz[i]-cz) + cz;    }    }/*-------------------------------------  setWaku  ---------*/  void setWaku() {    int i,ix,iy,iz;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -