Ignore:
Timestamp:
Mar 14, 2006, 10:39:24 PM (19 years ago)
Author:
mmc
Message:
  • Added src2, which is the start of Rappture 2.0, with various objects for handling complex data and serialization.
  • Fixed Wei's visualization server to load data from a DX file with a structured mesh, using FieldRect3D to interpolate values.
File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/gui/vizservers/nanovis/nanovis.cpp

    r274 r364  
    1313 * ======================================================================
    1414 */
     15#include <stdio.h>
     16#include <math.h>
     17#include <fstream>
     18#include <iostream>
     19#include <string>
    1520
    1621#include "nanovis.h"
     22#include "RpFieldRect3D.h"
    1723
    1824ParticleSystem* psys;
     
    161167}
    162168
     169/* Load a 3D volume from a dx-format file
     170 */
     171void
     172load_volume_file(int index, char *fname) {
     173    int dummy, nx, ny, nz, npts;
     174    double x0, y0, z0, dx, dy, dz, ddx, ddy, ddz;
     175    char line[128], *start;
     176    std::ifstream fin(fname);
     177
     178    do {
     179        fin.getline(line,sizeof(line)-1);
     180        for (start=&line[0]; *start == ' ' || *start == '\t'; start++)
     181            ;  // skip leading blanks
     182
     183        if (*start != '#') {  // skip comment lines
     184            if (sscanf(start, "object %d class gridpositions counts %d %d %d", &dummy, &nx, &ny, &nz) == 4) {
     185                // found grid size
     186            }
     187            else if (sscanf(start, "origin %lg %lg %lg", &x0, &y0, &z0) == 3) {
     188                // found origin
     189            }
     190            else if (sscanf(start, "delta %lg %lg %lg", &ddx, &ddy, &ddz) == 3) {
     191                // found one of the delta lines
     192                if (ddx != 0.0) { dx = ddx; }
     193                else if (ddy != 0.0) { dy = ddy; }
     194                else if (ddz != 0.0) { dz = ddz; }
     195            }
     196            else if (sscanf(start, "object %d class array type double rank 0 items %d data follows", &dummy, &npts) == 2) {
     197                if (npts != nx*ny*nz) {
     198                    std::cerr << "inconsistent data: expected " << nx*ny*nz << " points but found " << npts << " points" << std::endl;
     199                    return;
     200                }
     201                break;
     202            }
     203            else if (sscanf(start, "object %d class gridconnections", &dummy) == 1) {
     204                // ignore this
     205            }
     206        }
     207    } while (!fin.eof());
     208
     209    // read data points
     210    if (!fin.eof()) {
     211        Rappture::Mesh1D xgrid(x0, x0+nx*dx, nx);
     212        Rappture::Mesh1D ygrid(y0, y0+ny*dy, ny);
     213        Rappture::Mesh1D zgrid(z0, z0+nz*dz, nz);
     214        Rappture::FieldRect3D field(xgrid, ygrid, zgrid);
     215
     216        double dval;
     217        int nread = 0;
     218        while (!fin.eof()) {
     219            if (!(fin >> dval).fail()) {
     220                field.define(nread++, dval);
     221            }
     222        }
     223
     224        // make sure that we read all of the expected points
     225        if (nread != nx*ny*nz) {
     226            std::cerr << "inconsistent data: expected " << nx*ny*nz << " points but found " << nread << " points" << std::endl;
     227            return;
     228        }
     229
     230        // figure out a good mesh spacing
     231        int nsample = 100;
     232        dx = field.rangeMax(Rappture::xaxis) - field.rangeMin(Rappture::xaxis);
     233        dy = field.rangeMax(Rappture::yaxis) - field.rangeMin(Rappture::yaxis);
     234        dz = field.rangeMax(Rappture::zaxis) - field.rangeMin(Rappture::zaxis);
     235        double dmin = pow((dx*dy*dz)/(nsample*nsample*nsample), 0.333);
     236
     237        nx = (int)ceil(dx/dmin);
     238        ny = (int)ceil(dy/dmin);
     239        nz = (int)ceil(dz/dmin);
     240        float *data = new float[nx*ny*nz];
     241        std::cout << "generating " << nx << "x" << ny << "x" << nz << " = " << nx*ny*nz << " points" << std::endl;
     242
     243        // generate the uniformly sampled data that we need for a volume
     244        int ngen = 0;
     245        for (int iz=0; iz < nz; iz++) {
     246            double zval = z0 + iz*dmin;
     247            for (int iy=0; iy < ny; iy++) {
     248                double yval = y0 + iy*dmin;
     249                for (int ix=0; ix < nx; ix++) {
     250                    double xval = x0 + ix*dmin;
     251                    data[ngen++] = field.value(xval,yval,zval);
     252                }
     253            }
     254        }
     255        load_volume(index, nx, ny, nz, 1, data);
     256        delete [] data;
     257    } else {
     258        std::cerr << "WARNING: data not found in file " << fname << std::endl;
     259    }
     260}
    163261
    164262/* Load a 3D volume
     
    416514   }
    417515
    418    init_vector_field(); //3d vector field
     516   load_volume_file(0, "./data/A-apbs-2-out-potential-PE0.dx");
    419517   init_fbo();  //frame buffer objects
    420518   init_cg();   //init cg shaders
    421519
    422    psys = new ParticleSystem(NMESH, NMESH, g_context, volume[0]->id);
    423    init_particles();    //fill initial particles
    424 
    425    get_slice_vectors();
     520   //init_vector_field();       //3d vector field
     521   //psys = new ParticleSystem(NMESH, NMESH, g_context, volume[0]->id);
     522   //init_particles();  //fill initial particles
     523
     524   //get_slice_vectors();
    426525}
    427526
Note: See TracChangeset for help on using the changeset viewer.