From 5b1eb35cb7f40edcfe9b82be1e706369f59a0f9f Mon Sep 17 00:00:00 2001 From: toshinagata1964 Date: Wed, 25 Jun 2014 11:40:38 +0000 Subject: [PATCH] The extra property values are now saved into the mbsf files. git-svn-id: svn+ssh://svn.sourceforge.jp/svnroot/molby/trunk@553 a2be9bc6-48de-4e38-9406-05402d4bc13c --- MolLib/Molecule.c | 88 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 88 insertions(+) diff --git a/MolLib/Molecule.c b/MolLib/Molecule.c index 8330455..408d3f6 100755 --- a/MolLib/Molecule.c +++ b/MolLib/Molecule.c @@ -344,6 +344,7 @@ MoleculeInitWithAtoms(Molecule *mp, const Atom *atoms, int natoms) Molecule * MoleculeInitWithMolecule(Molecule *mp2, Molecule *mp) { + int i, n; MoleculeFlushFrames(mp); MoleculeInitWithAtoms(mp2, mp->atoms, mp->natoms); if (mp->nbonds > 0) { @@ -387,6 +388,17 @@ MoleculeInitWithMolecule(Molecule *mp2, Molecule *mp) memmove(mp2->frame_cells, mp->frame_cells, sizeof(Vector) * 4 * mp->nframe_cells); } + if (mp->nmolprops > 0) { + if (NewArray(&mp2->molprops, &mp2->nmolprops, sizeof(MolProp), mp->nmolprops) == NULL) + goto error; + n = MoleculeGetNumberOfFrames(mp); + for (i = 0; i < mp2->nmolprops; i++) { + mp2->molprops[i].propname = strdup(mp->molprops[i].propname); + mp2->molprops[i].propvals = (Double *)malloc(sizeof(Double) * n); + memcpy(mp2->molprops[i].propvals, mp->molprops[i].propvals, sizeof(Double) * n); + } + } + /* FIXME: should bset (basis set info) and elpot be duplicated or not? */ if (mp->par != NULL) @@ -1639,6 +1651,48 @@ MoleculeLoadMbsfFile(Molecule *mp, const char *fname, char **errbuf) } } continue; + } else if (strcmp(buf, "!:property") == 0) { + char dec[1024]; + i = 0; + bufp = buf + 13; + while (*bufp != 0 && *bufp != '\n' && bufp < (buf + sizeof buf - 3)) { + if (*bufp == '%') { + dec[i] = bufp[1]; + dec[i + 1] = bufp[2]; + dec[i + 2] = 0; + dec[i++] = strtol(dec, NULL, 16); + bufp += 3; + } else { + dec[i++] = *bufp++; + } + if (i >= 1000) + break; + } + if (i == 0) + continue; + dec[i] = 0; + i = MoleculeCreateProperty(mp, dec); + if (i < 0) { + s_append_asprintf(errbuf, "line %d: warning: duplicate molecular property %s - ignored\n", lineNumber, dec); + nwarnings++; + continue; + } + j = 0; + while (ReadLine(buf, sizeof buf, fp, &lineNumber) > 0) { + if (buf[0] == '!') + continue; + if (buf[0] == '\n') + break; + if (j >= nframes) { + s_append_asprintf(errbuf, "line %d: warning: too many molecular property %s - ignored\n", lineNumber, dec); + nwarnings++; + break; + } + dbuf[0] = strtod(buf, NULL); + mp->molprops[i].propvals[j] = dbuf[0]; + j++; + } + continue; } /* Unknown sections are silently ignored */ } @@ -4295,6 +4349,40 @@ MoleculeWriteToMbsfFile(Molecule *mp, const char *fname, char **errbuf) fprintf(fp, "\n"); } + if (mp->nmolprops > 0) { + MolProp *prp; + for (i = 0, prp = mp->molprops; i < mp->nmolprops; i++, prp++) { + /* Encode the property name if necessary */ + char *p; + char enc[1024]; + n1 = n2 = 0; + for (p = prp->propname; *p != 0 && n1 < 900; p++) { + if (*p > ' ' && *p != '%' && *p < 0x7f) { + enc[n1++] = *p; + n2 = n1; + } else { + sprintf(enc + n1, "%%%02x", *p); + n1 += 3; + } + } + if (*p == 0) + enc[n1] = 0; + else { + enc[n2] = 0; /* Truncate after last ASCII character */ + n1 = n2; + } + if (n1 == 0) { + sprintf(enc, "prop_%d", i + 1); + n1 = strlen(enc); + } + fprintf(fp, "!:property ; %s\n", enc); + for (j = 0; j < nframes; j++) { + fprintf(fp, "%.18g\n", prp->propvals[j]); + } + fprintf(fp, "\n"); + } + } + fclose(fp); return 0; } -- 2.11.0