Exemplo n.º 1
0
/* Run a transition of the FSM */
int fsm_step(url_t* url, pfd_t* pfd)
{
    int rc1 = 0, rc2 = 0;
    char buffer[BUFSIZ];        /* To pass in to readConn */

    conn_t* conn = conn_get(pfd_getfd(pfd));

    if (pfd->revents & POLLOUT)
        rc1 = writeConn(url, conn);

    if (pfd->revents & POLLIN)
        rc2 = readConn(conn, buffer, sizeof(buffer));

    if (verbose > 2)
        fprintf(stderr, "Stepped conn #%d -> %s\n", conn->index,
                state_names[conn->state]);

    if (rc2 == ST_OK && out_file != 0)
        fprintf(out_file, "%s %s\n", conn->last_etag, conn->last_path);

    if (rc2 == ST_OK || rc2 == ST_DUP) {
        conn_reset(conn, (struct sockaddr*) &url->addr);
    }

    if (rc1 == ST_ERROR || rc2 == ST_ERROR) {
        if (verbose) {
            char buf[100];
            snprintf(buf, sizeof(buf),
                     "FSM error {r:%s w:%s}", rc_names[rc2], rc_names[rc1]);
            error(conn, buf);
        }
        conn_reset(conn, (struct sockaddr*) &url->addr);
    }

    if (rc1 != ST_OK && rc1 != ST_CONTINUE)
        return rc1;
    return rc2;
}
Exemplo n.º 2
0
void Application::compute(void *)
{
    int fd, numt, skip, ret, i, n;
    char buf[500];

    // read input parameters and data object name

    Covise::get_browser_param("path", &dataPath);
    Covise::get_scalar_param("numt", &numt);
    Covise::get_scalar_param("skip", &skip);
    Covise::get_choice_param("format", &i);
    if (i == 1)
        readDouble = 1;
    else
        readDouble = 0;
    pfactor = 1;
    Covise::get_scalar_param("pfactor", &pfactor);

    coDistributedObject **grids;
    coDistributedObject **DOSveloc;
    coDistributedObject **DOSpress;
    coDistributedObject **DOSrho;
    coDistributedObject **DOSvol;
    coDistributedObject **DOStemperature;
    coDistributedObject **DOSamu;
    coDistributedObject **DOStke;
    coDistributedObject **DOSeps;
    coDistributedObject **DOSparticles;
    coDistributedObject **DOSpveloc;
    coDistributedObject **DOSptemperature;
    grids = new coDistributedObject *[numt + 1];
    DOSveloc = new coDistributedObject *[numt + 1];
    DOSpress = new coDistributedObject *[numt + 1];
    DOSrho = new coDistributedObject *[numt + 1];
    DOSvol = new coDistributedObject *[numt + 1];
    DOStemperature = new coDistributedObject *[numt + 1];
    DOSamu = new coDistributedObject *[numt + 1];
    DOStke = new coDistributedObject *[numt + 1];
    DOSeps = new coDistributedObject *[numt + 1];
    DOSparticles = new coDistributedObject *[numt + 1];
    DOSpveloc = new coDistributedObject *[numt + 1];
    DOSptemperature = new coDistributedObject *[numt + 1];
    for (i = 0; i < numt + 1; i++)
    {
        grids[i] = NULL;
        DOSveloc[i] = NULL;
        DOSpress[i] = NULL;
        DOSrho[i] = NULL;
        DOSvol[i] = NULL;
        DOStemperature[i] = NULL;
        DOSamu[i] = NULL;
        DOStke[i] = NULL;
        DOSeps[i] = NULL;
        DOSparticles[i] = NULL;
        DOSpveloc[i] = NULL;
        DOSptemperature[i] = NULL;
    }

    Mesh = Covise::get_object_name("mesh");
    Veloc = Covise::get_object_name("velocity");
    Press = Covise::get_object_name("pressure");
    rho_name = Covise::get_object_name("rho");
    vol_name = Covise::get_object_name("vol");
    temp_name = Covise::get_object_name("temperature");
    amu_name = Covise::get_object_name("amu");
    tke_name = Covise::get_object_name("tke");
    eps_name = Covise::get_object_name("eps");
    p_name = Covise::get_object_name("particles");
    pv_name = Covise::get_object_name("pvelocity");
    pt_name = Covise::get_object_name("ptemperature");

    if ((fd = Covise::open(dataPath, O_RDONLY)) < 0)
    {
        strcpy(buf, "ERROR: Can't open file >> ");
        strcat(buf, dataPath);
        Covise::sendError(buf);
        return;
    }
    for (n = 0; n < numt; n++)
    {
        ret = readHeader(fd);
        if (ret < 0)
        {
            close(fd);
            break;
        }
        sprintf(buf, "%s_%d", Mesh, n);
        mesh = new coDoUnstructuredGrid(buf, header.numElem, header.numElem * 8, header.numCoords, 1);
        if (!mesh->objectOk())
        {
            Covise::sendError("could not create output object:");
            break;
        }
        sprintf(buf, "%s_%d", Veloc, n);
        DOveloc = new coDoVec3(buf, header.numCoords);
        if (!DOveloc->objectOk())
        {
            Covise::sendError("could not create output object:");
            break;
        }
        sprintf(buf, "%s_%d", Press, n);
        DOpress = new coDoFloat(buf, header.numElem);
        if (!DOpress->objectOk())
        {
            Covise::sendError("could not create output object:");
            break;
        }
        sprintf(buf, "%s_%d", rho_name, n);
        DOrho = new coDoFloat(buf, header.numElem);
        if (!DOrho->objectOk())
        {
            Covise::sendError("could not create output object:");
            break;
        }
        sprintf(buf, "%s_%d", vol_name, n);
        DOvol = new coDoFloat(buf, header.numElem);
        if (!DOvol->objectOk())
        {
            Covise::sendError("could not create output object:");
            break;
        }
        sprintf(buf, "%s_%d", temp_name, n);
        DOtemperature = new coDoFloat(buf, header.numElem);
        if (!DOtemperature->objectOk())
        {
            Covise::sendError("could not create output object:");
            break;
        }
        sprintf(buf, "%s_%d", amu_name, n);
        DOamu = new coDoFloat(buf, header.numElem);
        if (!DOamu->objectOk())
        {
            Covise::sendError("could not create output object:");
            break;
        }
        sprintf(buf, "%s_%d", tke_name, n);
        DOtke = new coDoFloat(buf, header.numElem);
        if (!DOtke->objectOk())
        {
            Covise::sendError("could not create output object:");
            break;
        }
        sprintf(buf, "%s_%d", eps_name, n);
        DOeps = new coDoFloat(buf, header.numElem);
        if (!DOeps->objectOk())
        {
            Covise::sendError("could not create output object:");
            break;
        }
        if (header.np > 0)
        {
            sprintf(buf, "%s_%d", p_name, n);
            DOparticles = new coDoPoints(buf, header.np / pfactor);
            if (!DOeps->objectOk())
            {
                Covise::sendError("could not create output object:");
                break;
            }
            sprintf(buf, "%s_%d", pv_name, n);
            DOpveloc = new coDoVec3(buf, header.np / pfactor);
            if (!DOeps->objectOk())
            {
                Covise::sendError("could not create output object:");
                break;
            }
            sprintf(buf, "%s_%d", pt_name, n);
            DOptemperature = new coDoFloat(buf, header.np / pfactor);
            if (!DOeps->objectOk())
            {
                Covise::sendError("could not create output object:");
                break;
            }
        }
        mesh->getAddresses(&el, &vl, &x_coord, &y_coord, &z_coord);
        mesh->getTypeList(&tl);
        DOveloc->getAddresses(&u, &v, &w);
        DOpress->getAddress(&p);
        DOrho->getAddress(&rho);
        DOvol->getAddress(&vol);
        DOtemperature->getAddress(&temp);
        DOamu->getAddress(&amu);
        DOtke->getAddress(&tke);
        DOeps->getAddress(&eps);
        if (header.np > 0)
        {
            DOparticles->getAddresses(&px, &py, &pz);
            DOpveloc->getAddresses(&pu, &pv, &pw);
            DOptemperature->getAddress(&ptemp);
        }

        if (readData(fd) < 0)
        {
            close(fd);
            break;
        }
        skipBlocks(fd, 1);
        if (readConn(fd) < 0)
        {
            close(fd);
            break;
        }
        if (header.iper > 0)
            skipBlocks(fd, 1);
        if (header.np > 0)
            readParticles(fd);

        grids[n] = mesh;
        DOSveloc[n] = DOveloc;
        DOSpress[n] = DOpress;
        DOSrho[n] = DOrho;
        DOSvol[n] = DOvol;
        DOStemperature[n] = DOtemperature;
        DOSamu[n] = DOamu;
        DOStke[n] = DOtke;
        DOSeps[n] = DOeps;
        if (header.np > 0)
        {
            DOSparticles[n] = DOparticles;
            DOSpveloc[n] = DOpveloc;
            DOSptemperature[n] = DOptemperature;
        }

        if (header.iper > 0)
        {
            if (header.np > 0)
                skipBlocks(fd, skip * 5);
            else
                skipBlocks(fd, skip * 4);
        }
        else if (header.np > 0)
            skipBlocks(fd, skip * 4);
        else
            skipBlocks(fd, skip * 3);
    }

    coDoSet *set = new coDoSet(Mesh, grids);
    set->addAttribute("TIMESTEP", "1 1000");
    delete set;
    set = new coDoSet(Veloc, DOSveloc);
    set->addAttribute("TIMESTEP", "1 1000");
    delete set;
    set = new coDoSet(Press, DOSpress);
    set->addAttribute("TIMESTEP", "1 1000");
    delete set;
    set = new coDoSet(rho_name, DOSrho);
    set->addAttribute("TIMESTEP", "1 1000");
    delete set;
    set = new coDoSet(vol_name, DOSvol);
    set->addAttribute("TIMESTEP", "1 1000");
    delete set;
    set = new coDoSet(temp_name, DOStemperature);
    set->addAttribute("TIMESTEP", "1 1000");
    delete set;
    set = new coDoSet(amu_name, DOSamu);
    set->addAttribute("TIMESTEP", "1 1000");
    delete set;
    set = new coDoSet(tke_name, DOStke);
    set->addAttribute("TIMESTEP", "1 1000");
    delete set;
    set = new coDoSet(eps_name, DOSeps);
    set->addAttribute("TIMESTEP", "1 1000");
    delete set;
    if (header.np > 0)
    {
        set = new coDoSet(p_name, DOSparticles);
        set->addAttribute("TIMESTEP", "1 1000");
        delete set;
        set = new coDoSet(pv_name, DOSpveloc);
        delete set;
        set = new coDoSet(pt_name, DOSptemperature);
        delete set;
    }

    for (i = 0; i < n; i++)
    {
        delete grids[i];
        delete DOSveloc[i];
        delete DOSpress[i];
        delete DOSrho[i];
        delete DOSvol[i];
        delete DOStemperature[i];
        delete DOSamu[i];
        delete DOStke[i];
        delete DOSeps[i];
        delete DOSparticles[i];
        delete DOSpveloc[i];
        delete DOSptemperature[i];
    }
    delete[] grids;
    delete[] DOSveloc;
    delete[] DOSpress;
    delete[] DOSrho;
    delete[] DOSvol;
    delete[] DOStemperature;
    delete[] DOSamu;
    delete[] DOStke;
    delete[] DOSeps;
    delete[] DOSparticles;
    delete[] DOSpveloc;
    delete[] DOSptemperature;
    close(fd);
}