| version 1.5 | version 1.6 |
|---|
| |
| /*************************************************************************** | /*************************************************************************** |
| *cr | *cr |
| *cr (C) Copyright 1995-2009 The Board of Trustees of the | *cr (C) Copyright 1995-2016 The Board of Trustees of the |
| *cr University of Illinois | *cr University of Illinois |
| *cr All Rights Reserved | *cr All Rights Reserved |
| *cr | *cr |
| |
| * | * |
| * $RCSfile: jsplugin.c,v $ | * $RCSfile: jsplugin.c,v $ |
| * $Author: jim $ $Locker: $ $State: Exp $ | * $Author: jim $ $Locker: $ $State: Exp $ |
| * $Revision: 1.5 $ $Date: 2013/09/30 22:02:44 $ | * $Revision: 1.6 $ $Date: 2017/03/29 21:38:15 $ |
| * | * |
| *************************************************************************** | *************************************************************************** |
| * DESCRIPTION: | * DESCRIPTION: |
| |
| * | * |
| ***************************************************************************/ | ***************************************************************************/ |
| | |
| #if 1 | |
| #define INFOMSGS 1 | #define INFOMSGS 1 |
| #endif | |
| | |
| #if 1 | #if 1 |
| #define ENABLEJSSHORTREADS 1 | #define ENABLEJSSHORTREADS 1 |
| |
| #define JSENDIANISM 0x12345678 | #define JSENDIANISM 0x12345678 |
| | |
| #define JSMAJORVERSION 2 | #define JSMAJORVERSION 2 |
| #define JSMINORVERSION 12 | #define JSMINORVERSION 15 |
| | |
| #define JSNFRAMESOFFSET (strlen(JSHEADERSTRING) + 20) | #define JSNFRAMESOFFSET (strlen(JSHEADERSTRING) + 20) |
| | |
| |
| #define JSBADFORMAT 2 | #define JSBADFORMAT 2 |
| | |
| | |
| | /* Threshold atom count beyond which block-based I/O is used by default */ |
| | /* The overhead from block-alignment padding bytes becomes essentially */ |
| | /* inconsequential (< 1%) for structures with more than 50,000 atoms. */ |
| | #define JSBLOCKIO_THRESH 50000 |
| | |
| | |
| | /* Option flag macros and their meanings */ |
| #define JSOPT_NOOPTIONS 0x00000000 /* no structure, only coords */ | #define JSOPT_NOOPTIONS 0x00000000 /* no structure, only coords */ |
| | |
| /* Timesteps are block-size padded and page- or sector-aligned for */ | /* Timesteps are block-size padded and page- or sector-aligned for */ |
| |
| } jshandle; | } jshandle; |
| | |
| | |
| | /* Use block-based I/O by default when writing structures larger */ |
| | /* than JSBLOCKIO_THRESH atoms, or when directed by the user and */ |
| | /* not otherwise prohibited... */ |
| | static void js_blockio_check_and_set(jshandle *js) { |
| | if ((getenv("VMDJSNOBLOCKIO") == NULL) && |
| | ((js->natoms > JSBLOCKIO_THRESH) || getenv("VMDJSBLOCKIO"))) { |
| | js->optflags |= JSOPT_TS_BLOCKIO; |
| | js->directio_block_size = MOLFILE_DIRECTIO_MIN_BLOCK_SIZE; |
| | } |
| | } |
| | |
| | |
| static void *open_js_read(const char *path, const char *filetype, int *natoms) { | static void *open_js_read(const char *path, const char *filetype, int *natoms) { |
| jshandle *js; | jshandle *js; |
| int jsmagicnumber, jsendianism, jsmajorversion, jsminorversion; | int jsmagicnumber, jsendianism, jsmajorversion, jsminorversion; |
| |
| /* skip forward to first TS if the caller gives us NULL ptrs */ | /* skip forward to first TS if the caller gives us NULL ptrs */ |
| if (optflags == NULL && atoms == NULL) { | if (optflags == NULL && atoms == NULL) { |
| size_t offset=0; | size_t offset=0; |
| offset += numatomnames * (16 * sizeof(char)); | offset += numatomnames * (16L * sizeof(char)); |
| offset += numatomtypes * (16 * sizeof(char)); | offset += numatomtypes * (16L * sizeof(char)); |
| offset += numresnames * (8 * sizeof(char)); | offset += numresnames * (8L * sizeof(char)); |
| offset += numsegids * (8 * sizeof(char)); | offset += numsegids * (8L * sizeof(char)); |
| offset += numchains * (2 * sizeof(char)); | offset += numchains * (2L * sizeof(char)); |
| offset += js->natoms * sizeof(short); /* atom name indices */ | offset += js->natoms * sizeof(short); /* atom name indices */ |
| offset += js->natoms * sizeof(short); /* atom type indices */ | offset += js->natoms * sizeof(short); /* atom type indices */ |
| offset += js->natoms * sizeof(short); /* residue name indices */ | offset += js->natoms * sizeof(short); /* residue name indices */ |
| |
| } | } |
| #endif | #endif |
| | |
| offset += 2 * js->nbonds * sizeof(int); | offset += 2L * js->nbonds * sizeof(int); |
| if (js->optflags & JSOPT_BONDORDERS) | if (js->optflags & JSOPT_BONDORDERS) |
| offset += js->nbonds * sizeof(float); | offset += js->nbonds * sizeof(float); |
| | |
| |
| | |
| /* read in the string tables */ | /* read in the string tables */ |
| for (i=0; i<numatomnames; i++) { | for (i=0; i<numatomnames; i++) { |
| atomnames[i] = (char *) malloc(16 * sizeof(char)); | atomnames[i] = (char *) malloc(16L * sizeof(char)); |
| fio_fread(atomnames[i], 16 * sizeof(char), 1, js->fd); | fio_fread(atomnames[i], 16L * sizeof(char), 1, js->fd); |
| } | } |
| | |
| #if defined(INFOMSGS) | #if defined(INFOMSGS) |
| |
| printf("jsplugin) atom types...\n"); | printf("jsplugin) atom types...\n"); |
| #endif | #endif |
| for (i=0; i<numatomtypes; i++) { | for (i=0; i<numatomtypes; i++) { |
| atomtypes[i] = (char *) malloc(16 * sizeof(char)); | atomtypes[i] = (char *) malloc(16L * sizeof(char)); |
| fio_fread(atomtypes[i], 16 * sizeof(char), 1, js->fd); | fio_fread(atomtypes[i], 16L * sizeof(char), 1, js->fd); |
| } | } |
| | |
| #if defined(INFOMSGS) | #if defined(INFOMSGS) |
| |
| printf("jsplugin) residue names...\n"); | printf("jsplugin) residue names...\n"); |
| #endif | #endif |
| for (i=0; i<numresnames; i++) { | for (i=0; i<numresnames; i++) { |
| resnames[i] = (char *) malloc(8 * sizeof(char)); | resnames[i] = (char *) malloc(8L * sizeof(char)); |
| fio_fread(resnames[i], 8 * sizeof(char), 1, js->fd); | fio_fread(resnames[i], 8L * sizeof(char), 1, js->fd); |
| } | } |
| | |
| #if defined(INFOMSGS) | #if defined(INFOMSGS) |
| |
| printf("jsplugin) segment names...\n"); | printf("jsplugin) segment names...\n"); |
| #endif | #endif |
| for (i=0; i<numsegids; i++) { | for (i=0; i<numsegids; i++) { |
| segids[i] = (char *) malloc(8 * sizeof(char)); | segids[i] = (char *) malloc(8L * sizeof(char)); |
| fio_fread(segids[i], 8 * sizeof(char), 1, js->fd); | fio_fread(segids[i], 8L * sizeof(char), 1, js->fd); |
| } | } |
| | |
| #if defined(INFOMSGS) | #if defined(INFOMSGS) |
| |
| printf("jsplugin) chain names...\n"); | printf("jsplugin) chain names...\n"); |
| #endif | #endif |
| for (i=0; i<numchains; i++) { | for (i=0; i<numchains; i++) { |
| chains[i] = (char *) malloc(2 * sizeof(char)); | chains[i] = (char *) malloc(2L * sizeof(char)); |
| fio_fread(chains[i], 2 * sizeof(char), 1, js->fd); | fio_fread(chains[i], 2L * sizeof(char), 1, js->fd); |
| } | } |
| | |
| #if defined(INFOMSGS) | #if defined(INFOMSGS) |
| |
| jshandle *js = (jshandle *) mydata; | jshandle *js = (jshandle *) mydata; |
| long i; | long i; |
| | |
| #if 1 | /* use block-based I/O by default when writing structures larger */ |
| if (getenv("VMDJSBLOCKIO")) { | /* than JSBLOCKIO_THRESH atoms, or when directed by the user */ |
| js->optflags |= JSOPT_TS_BLOCKIO; | js_blockio_check_and_set(js); |
| js->directio_block_size = MOLFILE_DIRECTIO_MIN_BLOCK_SIZE; | |
| } | |
| #endif | |
| | |
| js->optflags |= JSOPT_STRUCTURE; | js->optflags |= JSOPT_STRUCTURE; |
| | |
| |
| for (hashcnt=0,i=0; i<js->natoms; i++) { | for (hashcnt=0,i=0; i<js->natoms; i++) { |
| /* add a new string table entry for hash inserts that don't yet exist */ | /* add a new string table entry for hash inserts that don't yet exist */ |
| if (hash_insert(&atomnamehash, atoms[i].name, hashcnt) == HASH_FAIL) { | if (hash_insert(&atomnamehash, atoms[i].name, hashcnt) == HASH_FAIL) { |
| atomnames[hashcnt] = (char *) calloc(1, 16 * sizeof(char)); | atomnames[hashcnt] = (char *) calloc(1, 16L * sizeof(char)); |
| strcpy(atomnames[hashcnt], atoms[i].name); | strcpy(atomnames[hashcnt], atoms[i].name); |
| hashcnt++; | hashcnt++; |
| } | } |
| } | } |
| for (i=0; i<numatomnames; i++) { | for (i=0; i<numatomnames; i++) { |
| fio_fwrite(atomnames[i], 16 * sizeof(char), 1, js->fd); | fio_fwrite(atomnames[i], 16L * sizeof(char), 1, js->fd); |
| } | } |
| | |
| | |
| |
| for (hashcnt=0,i=0; i<js->natoms; i++) { | for (hashcnt=0,i=0; i<js->natoms; i++) { |
| /* add a new string table entry for hash inserts that don't yet exist */ | /* add a new string table entry for hash inserts that don't yet exist */ |
| if (hash_insert(&atomtypehash, atoms[i].type, hashcnt) == HASH_FAIL) { | if (hash_insert(&atomtypehash, atoms[i].type, hashcnt) == HASH_FAIL) { |
| atomtypes[hashcnt] = (char *) calloc(1, 16 * sizeof(char)); | atomtypes[hashcnt] = (char *) calloc(1, 16L * sizeof(char)); |
| strcpy(atomtypes[hashcnt], atoms[i].type); | strcpy(atomtypes[hashcnt], atoms[i].type); |
| hashcnt++; | hashcnt++; |
| } | } |
| } | } |
| for (i=0; i<numatomtypes; i++) { | for (i=0; i<numatomtypes; i++) { |
| fio_fwrite(atomtypes[i], 16 * sizeof(char), 1, js->fd); | fio_fwrite(atomtypes[i], 16L * sizeof(char), 1, js->fd); |
| } | } |
| | |
| | |
| |
| for (hashcnt=0,i=0; i<js->natoms; i++) { | for (hashcnt=0,i=0; i<js->natoms; i++) { |
| /* add a new string table entry for hash inserts that don't yet exist */ | /* add a new string table entry for hash inserts that don't yet exist */ |
| if (hash_insert(&resnamehash, atoms[i].resname, hashcnt) == HASH_FAIL) { | if (hash_insert(&resnamehash, atoms[i].resname, hashcnt) == HASH_FAIL) { |
| resnames[hashcnt] = (char *) calloc(1, 8 * sizeof(char)); | resnames[hashcnt] = (char *) calloc(1, 8L * sizeof(char)); |
| strcpy(resnames[hashcnt], atoms[i].resname); | strcpy(resnames[hashcnt], atoms[i].resname); |
| hashcnt++; | hashcnt++; |
| } | } |
| } | } |
| for (i=0; i<numresnames; i++) { | for (i=0; i<numresnames; i++) { |
| fio_fwrite(resnames[i], 8 * sizeof(char), 1, js->fd); | fio_fwrite(resnames[i], 8L * sizeof(char), 1, js->fd); |
| } | } |
| | |
| | |
| |
| for (hashcnt=0,i=0; i<js->natoms; i++) { | for (hashcnt=0,i=0; i<js->natoms; i++) { |
| /* add a new string table entry for hash inserts that don't yet exist */ | /* add a new string table entry for hash inserts that don't yet exist */ |
| if (hash_insert(&segidhash, atoms[i].segid, hashcnt) == HASH_FAIL) { | if (hash_insert(&segidhash, atoms[i].segid, hashcnt) == HASH_FAIL) { |
| segids[hashcnt] = (char *) calloc(1, 8 * sizeof(char)); | segids[hashcnt] = (char *) calloc(1, 8L * sizeof(char)); |
| strcpy(segids[hashcnt], atoms[i].segid); | strcpy(segids[hashcnt], atoms[i].segid); |
| hashcnt++; | hashcnt++; |
| } | } |
| } | } |
| for (i=0; i<numsegids; i++) { | for (i=0; i<numsegids; i++) { |
| fio_fwrite(segids[i], 8 * sizeof(char), 1, js->fd); | fio_fwrite(segids[i], 8L * sizeof(char), 1, js->fd); |
| } | } |
| | |
| | |
| |
| for (hashcnt=0,i=0; i<js->natoms; i++) { | for (hashcnt=0,i=0; i<js->natoms; i++) { |
| /* add a new string table entry for hash inserts that don't yet exist */ | /* add a new string table entry for hash inserts that don't yet exist */ |
| if (hash_insert(&chainhash, atoms[i].chain, hashcnt) == HASH_FAIL) { | if (hash_insert(&chainhash, atoms[i].chain, hashcnt) == HASH_FAIL) { |
| chains[hashcnt] = (char *) calloc(1, 2 * sizeof(char)); | chains[hashcnt] = (char *) calloc(1, 2L * sizeof(char)); |
| strcpy(chains[hashcnt], atoms[i].chain); | strcpy(chains[hashcnt], atoms[i].chain); |
| hashcnt++; | hashcnt++; |
| } | } |
| } | } |
| for (i=0; i<numchains; i++) { | for (i=0; i<numchains; i++) { |
| fio_fwrite(chains[i], 2 * sizeof(char), 1, js->fd); | fio_fwrite(chains[i], 2L * sizeof(char), 1, js->fd); |
| } | } |
| | |
| | |
| |
| int nbondtypes, char **bondtypename) { | int nbondtypes, char **bondtypename) { |
| jshandle *js = (jshandle *) mydata; | jshandle *js = (jshandle *) mydata; |
| | |
| | #if defined(INFOMSGS) |
| | if (js->verbose) { |
| | printf("jsplugin) write_js_bonds():\n"); |
| | printf("jsplugin) storing bond info for writing...\n"); |
| | printf("jsplugin) %d %d\n", nbonds, nbondtypes); |
| | } |
| | #endif |
| | |
| if (nbonds > 0 && fromptr != NULL && toptr != NULL) { | if (nbonds > 0 && fromptr != NULL && toptr != NULL) { |
| js->optflags |= JSOPT_BONDS; | js->optflags |= JSOPT_BONDS; |
| | |
| |
| js->numimpropers = numimpropers; | js->numimpropers = numimpropers; |
| js->numcterms = numcterms; | js->numcterms = numcterms; |
| | |
| | #if defined(INFOMSGS) |
| | if (js->verbose) { |
| | printf("jsplugin) write_js_angles():\n"); |
| | printf("jsplugin) storing angles/dihedrals/impropers for writing...\n"); |
| | printf("jsplugin) %d %d %d %d\n", |
| | numangles, numdihedrals, numimpropers, numcterms); |
| | } |
| | #endif |
| | |
| if (js->numangles > 0 || js->numdihedrals > 0 || js->numimpropers > 0) { | if (js->numangles > 0 || js->numdihedrals > 0 || js->numimpropers > 0) { |
| js->optflags |= JSOPT_ANGLES; | js->optflags |= JSOPT_ANGLES; |
| | |
| |
| /* using direct I/O APIs... */ | /* using direct I/O APIs... */ |
| if (js->directio_ucell_blkbuf == NULL) { | if (js->directio_ucell_blkbuf == NULL) { |
| printf("jsplugin) no structure data, writing timesteps only...\n"); | printf("jsplugin) no structure data, writing timesteps only...\n"); |
| if (getenv("VMDJSBLOCKIO")) { | |
| js->optflags |= JSOPT_TS_BLOCKIO; | /* use block-based I/O by default when writing structures larger */ |
| js->directio_block_size = MOLFILE_DIRECTIO_MIN_BLOCK_SIZE; | /* than JSBLOCKIO_THRESH atoms, or when directed by the user */ |
| } | js_blockio_check_and_set(js); |
| | |
| /* write flags data to the file */ | /* write flags data to the file */ |
| fio_write_int32(js->fd, js->optflags); | fio_write_int32(js->fd, js->optflags); |