Commit 5261b29c authored by Berk Onat's avatar Berk Onat

Initial commit with full parser code.

parents
# CHARMM Parser
[NOMAD Laboratory CoE](http://nomad-coe.eu) parser for [CHARMM](https://www.charmm.org/charmm/)
## Version 0.0.1
This is the parser for CHARMM (Chemistry at HARvard Macromolecular Mechanics) code in [CHARMM](https://www.charmm.org/charmm/).
## Features
- All input and output files are expected to be in the supplied directory and its subdirectories.
- The parser searches for the main input file for extraction more information of the order of the commands and
input CARDS. The main input file is assumed to hold at least 80% of the commands given to charmm main process.
- `MINI`, `DYNA`, `ENER`, `GETE`, `PRINT`, `OPEN`, `READ`, and `WRITE` commands can be prossesed with this parser.
- Any new `MINI`, `DYNA`, `ENER`, `GETE` commands are assumed to be a new simulation and each simulation is given in a new [section\_run](https://metainfo.nomad-coe.eu/nomadmetainfo_public/index.html#/public/section_run) in standardized meta information of NOMAD.
- Parser can extract topology information from **PSF**, **RTF**, **PAR** files and CARDS through MDDataAccess package.
- **SEQ** CARDS can be read only for additional information if topology information is not complete.
- Additional topology information can also be extracted from **COOR**, **CRD** files(ascii) and CARDS.
- Input and output coordinates are mainly extracted from both ascii and binary **COOR** and **CRD** files/CARDS and
`PRINT COOR` commands.
...The coordinate information of the most recent command before any given command in the second item of this list is assumed to be the input coordinates of the simulation. Similarly, the next `PRINT`, `WRITE` command after each simulation is also assumed to be the output coordinates if trajectory data (`IUNCRD` or `IUNWRI` units) are missing.
- Trajectory of the simulations are also accessed through MDDataAccess package of [python-common](https://gitlab.rzg.mpg.de/nomad-lab/python-common).
## Download and
The official version lives at:
git@gitlab.mpcdf.mpg.de:nomad-lab/parser-charmm.git
You can browse it at:
https://gitlab.rzg.mpg.de/nomad-lab/parser-charmm
It relies on having the nomad-meta-info and the python-common repositories one level higher.
The simplest way to have this is to check out nomad-lab-base recursively:
git clone --recursive git@gitlab.mpcdf.mpg.de:nomad-lab/nomad-lab-base.git
This parser will be in the directory parsers/charmm of this repository.
## Running and Testing the Parser
### Requirements
The required python packages can be installed with (see [python-common](https://gitlab.rzg.mpg.de/nomad-lab/python-common)):
pip install -r nomad-lab-base/python-common/requirements.txt
### Usage
CHARMM MD log output files can be parsed with:
python CHARMMParser.py [path/toFile]
### Test Files
Example log output files of CHARMM can be found in the directory test/examples.
More details about the calculations and files are explained in the README file under examples directory.
import logging
import os
PARSERNAME = "CHARMM"
PROGRAMNAME = "charmm"
PARSERVERSION = "0.0.1"
PARSERMETANAME = PARSERNAME.lower()
PARSERTAG = 'x_' + PARSERMETANAME
PARSER_INFO_DEFAULT = {
'name' : PARSERMETANAME+'-parser',
'version': PARSERVERSION
}
META_INFO_PATH = os.path.normpath(os.path.join(
os.path.dirname(os.path.abspath(__file__)),
"../../../../nomad-meta-info/meta_info/nomad_meta_info/"+PARSERMETANAME+".nomadmetainfo.json"))
LOGGER = logging.getLogger("nomad."+PROGRAMNAME+"Parser")
def set_excludeList(self):
"""Sets the exclude list for x_
Returns:
the list of names
"""
excludelist = [
PARSERTAG+'_mdin_verbatim_writeout',
PARSERTAG+'_dumm_text',
PARSERTAG+'_dummy',
PARSERTAG+'_mdin_wt'
]
excludelist.extend([PARSERTAG+'_mdin_file_%s' % fileNL.lower() for fileNL in self.fileDict.keys()])
excludelist.extend([PARSERTAG+'_mdin_%s' % cntrlNL.lower() for cntrlNL in self.cntrlDict.keys()])
excludelist.extend([PARSERTAG+'_mdin_%s' % ewaldNL.lower() for ewaldNL in self.ewaldDict.keys()])
excludelist.extend([PARSERTAG+'_mdin_%s' % qmmmNL.lower() for qmmmNL in self.qmmmDict.keys()])
return excludelist
def set_includeList():
"""Sets the include list for x_
Returns:
the list of names
"""
includelist = []
return includelist
This diff is collapsed.
This diff is collapsed.
import sys
import os
import os.path
basedir = os.path.dirname(os.path.abspath(__file__))
commondir = os.path.normpath(os.path.join(basedir,"../../../../python-common/common/python"))
if not commondir in sys.path:
sys.path.insert(0, commondir)
package eu.nomad_lab.parsers
import eu.nomad_lab
import eu.nomad_lab.DefaultPythonInterpreter
import org.{ json4s => jn }
import eu.{ nomad_lab => lab }
import scala.collection.breakOut
object CHARMMParser extends SimpleExternalParserGenerator(
name = "CHARMMParser",
parserInfo = jn.JObject(
("name" -> jn.JString("CHARMMParser")) ::
("parserId" -> jn.JString("CHARMMParser" + lab.CHARMMVersionInfo.version)) ::
("versionInfo" -> jn.JObject(
("nomadCoreVersion" -> jn.JObject(lab.NomadCoreVersionInfo.toMap.map {
case (k, v) => k -> jn.JString(v.toString)
}(breakOut): List[(String, jn.JString)])) ::
(lab.CHARMMVersionInfo.toMap.map {
case (key, value) =>
(key -> jn.JString(value.toString))
}(breakOut): List[(String, jn.JString)])
)) :: Nil
),
mainFileTypes = Seq("text/.*"),
mainFileRe = """\s*Chemistry\s*at\s*HARvard\s*Macromolecular\s*Mechanics\s*""".r,
cmd = Seq(DefaultPythonInterpreter.pythonExe(), "${envDir}/parsers/namd/parser/parser-namd/CHARMMParser.py",
"${mainFilePath}"),
resList = Seq(
"parser-charmm/CHARMMParser.py",
"parser-charmm/CHARMMDictionary.py",
"parser-charmm/CHARMMCommon.py",
"parser-charmm/setup_paths.py",
"nomad_meta_info/public.nomadmetainfo.json",
"nomad_meta_info/common.nomadmetainfo.json",
"nomad_meta_info/meta_types.nomadmetainfo.json"
) ++ DefaultPythonInterpreter.commonFiles(),
dirMap = Map(
"parser-charmm" -> "parsers/namd/parser/parser-charmm",
"nomad_meta_info" -> "nomad-meta-info/meta_info/nomad_meta_info",
"python" -> "python-common/common/python/nomadcore"
) ++ DefaultPythonInterpreter.commonDirMapping(),
metaInfoEnv = Some(lab.meta.KnownMetaInfoEnvs.namd)
)
package eu.nomad_lab.parsers
import org.specs2.mutable.Specification
object CHARMMParserTests extends Specification {
"CHARMMParserTest" >> {
"[MINI brbtest] test with json-events" >> {
ParserRun.parse(CHARMMParser, "parsers/charmm/test/examples/brbtest/brbtest.out", "json-events") must_== ParseResult.ParseSuccess
}
"[MINI brbtest] test with json" >> {
ParserRun.parse(CHARMMParser, "parsers/charmm/test/examples/brbtest/brbtest.out", "json") must_== ParseResult.ParseSuccess
}
"[DYNA dyntest1] test with json-events" >> {
ParserRun.parse(CHARMMParser, "parsers/charmm/test/examples/dyntest1/dyntest1.out", "json-events") must_== ParseResult.ParseSuccess
}
"[DYNA dyntest1] test with json" >> {
ParserRun.parse(CHARMMParser, "parsers/charmm/test/examples/dyntest1/dyntest1.out", "json") must_== ParseResult.ParseSuccess
}
"[LANGEVIN dyntest2] test with json-events" >> {
ParserRun.parse(CHARMMParser, "parsers/charmm/test/examples/dyntest2/dyntest2.out", "json-events") must_== ParseResult.ParseSuccess
}
"[LANGEVIN dyntest2] test with json" >> {
ParserRun.parse(CHARMMParser, "parsers/charmm/test/examples/dyntest2/dyntest2.out", "json") must_== ParseResult.ParseSuccess
}
"[langtest1] test with json-events" >> {
ParserRun.parse(CHARMMParser, "parsers/charmm/test/examples/langtest1/langtest1.out", "json-events") must_== ParseResult.ParseSuccess
}
"[langtest1] test with json" >> {
ParserRun.parse(CHARMMParser, "parsers/charmm/test/examples/langtest1/langtest1.out", "json") must_== ParseResult.ParseSuccess
}
"[nose1] test with json-events" >> {
ParserRun.parse(CHARMMParser, "parsers/charmm/test/examples/nose1/nose1.out", "json-events") must_== ParseResult.ParseSuccess
}
"[nose1] test with json" >> {
ParserRun.parse(CHARMMParser, "parsers/charmm/test/examples/nose1/nose1.out", "json") must_== ParseResult.ParseSuccess
}
"[tip4ptest] test with json-events" >> {
ParserRun.parse(CHARMMParser, "parsers/charmm/test/examples/tip4ptest/tip4ptest.out", "json-events") must_== ParseResult.ParseSuccess
}
"[tip4ptest] test with json" >> {
ParserRun.parse(CHARMMParser, "parsers/charmm/test/examples/tip4ptest/tip4ptest.out", "json") must_== ParseResult.ParseSuccess
}
}
}
# Tests:
### Source of Tests:
These files are only supplied for test purposes of the charmm parser. Any other usage of the files
need appropriate license from the CHARMM. Please see the CHARMM page for more details
The tests are taken from `charmm` (Free Version 41b2) test in [charmm](http://charmm.chemistry.harvard.edu).
### Example Tests:
#### Minimization test
- brbtest: Test run for Newton Raphson and diagonalization.
#### Molecular Dynamics tests
- dyntest1: Tests a number of dynamics calculations for TRYPTOPHAN using explicit Hydrogen.
- dyntest2: Tests a number of dynamics calculations for TRYPTOPHAN using explicit Hydrogen (LANGEVIN).
- langtest1: A series of Langevin dynamics tests for BUTANE molecule from 4 extended atoms.
- nose1: H2O test run for Nose-Hoover dynamics.
- tip4ptest: TIP4P test with 125 water molecules
* SECOND DERIVATIVE TEST COORDINATES
* DATE: 1/24/18 12: 8: 0 CREATED BY USER: bonat
*
12
1 1 AMN CL -3.13965 -1.54481 0.19285 A 1 0.00000
2 1 AMN C -1.85653 -0.82937 -0.22784 A 1 0.00000
3 1 AMN O -1.03318 -1.44920 -0.89737 A 1 0.00000
4 2 CBX N -1.53757 0.43573 0.07578 A 2 0.00000
5 2 CBX H -0.68605 0.77269 -0.26811 A 2 0.00000
6 2 CBX CA -2.38883 1.35790 0.89148 A 2 0.00000
7 3 AMN CL 3.13965 1.54481 0.19285 A 3 0.00000
8 3 AMN C 1.85653 0.82937 -0.22784 A 3 0.00000
9 3 AMN O 1.03318 1.44920 -0.89737 A 3 0.00000
10 4 CBX N 1.53757 -0.43573 0.07578 A 4 0.00000
11 4 CBX H 0.68605 -0.77269 -0.26811 A 4 0.00000
12 4 CBX CA 2.38883 -1.35790 0.89148 A 4 0.00000
* TEST RUN FOR NEWTON RAPHSON AND DIAGONALIZATION
*
stream datadir.def
bomlev -1
OPEN READ FORM UNIT 1 NAME @0toph8.rtf
READ RTF CARD UNIT 1
OPEN READ FORM UNIT 2 NAME @0param3.prm
READ PARAMETER CARD UNIT 2
READ SEQUENCE CARD
* FIRST SEQUENCE FOR SECOND DERIVATIVE TEST
*
2
AMN CBX
READ SEQUENCE CARD
* SECOND SEQUENCE FOR SECOND DERIVATIVE TEST
*
2
AMN CBX
GENERATE A SETU
IC PARAM
PRINT IC
IC EDIT
DIHE 1 CL 1 C 2 N 2 CA 0.0
DIHE 3 CL 3 C 4 N 4 CA 0.0
DIHE 2 CA 2 N 2 H 4 H 180.0
DIHE 2 N 2 H 4 H 4 N 180.0
DIHE 2 H 4 H 4 N 4 CA 180.0
ANGL 2 N 2 H 4 H 100.0
ANGL 2 H 4 H 4 N 100.0
DIST 2 H 4 H 4.5
END
PRINT IC
IC SEED 2 CA 2 N 2 H
IC BILD
COOR ORIENT MASS
PRINT COORD
COOR COPY COMP
READ COOR CARD
* INITIAL COORDINATES FOR AMN-CBX *2
* DATE: 10/26/83 4:44:54 CREATED BY USER: BROOKSG1
*
12
1 1 AMN CL -3.33267 -1.67441 0.00000 A 1 0.00000
2 1 AMN C -2.19986 -0.66094 0.00000 A 1 0.00000
3 1 AMN O -1.02163 -1.01403 0.00000 A 1 0.00000
4 2 CBX N -2.52876 0.62775 0.00000 A 2 0.00000
5 2 CBX H -1.82759 1.31241 0.00000 A 2 0.00000
6 2 CBX CA -3.96329 1.03051 0.00000 A 2 0.00000
7 3 AMN CL 3.33267 1.67441 0.00000 B 1 0.00000
8 3 AMN C 2.19986 0.66094 0.00000 B 1 0.00000
9 3 AMN O 1.02163 1.01403 0.00000 B 1 0.00000
10 4 CBX N 2.52876 -0.62775 0.00000 B 2 0.00000
11 4 CBX H 1.82759 -1.31241 0.00000 B 2 0.00000
12 4 CBX CA 3.96329 -1.03051 0.00000 B 2 0.00000
HBONDS IHBFRQ 50
PRINT HBONDS ANAL
MINI CONJ NSTEP 100 INBFRQ 100 STEP 0.2 IHBFRQ 100 ncgcyc 50 NPRINT 10
PRINT COORD
COOR ORIE RMS MASS
if ?novibran .eq. 1 then stop
READ COOR CARD
* INITIAL COORDINATES FOR AMN-CBX *2
* DATE: 10/26/83 4:44:54 CREATED BY USER: BROOKSG2
*
12
1 1 AMN CL -3.33267 -1.67441 0.00000 A 1 0.00000
2 1 AMN C -2.19986 -0.66094 0.00000 A 1 0.00000
3 1 AMN O -1.02163 -1.01403 0.00000 A 1 0.00000
4 2 CBX N -2.52876 0.62775 0.00000 A 2 0.00000
5 2 CBX H -1.82759 1.31241 0.00000 A 2 0.00000
6 2 CBX CA -3.96329 1.03051 0.00000 A 2 0.00000
7 3 AMN CL 3.33267 1.67441 0.00000 B 1 0.00000
8 3 AMN C 2.19986 0.66094 0.00000 B 1 0.00000
9 3 AMN O 1.02163 1.01403 0.00000 B 1 0.00000
10 4 CBX N 2.52876 -0.62775 0.00000 B 2 0.00000
11 4 CBX H 1.82759 -1.31241 0.00000 B 2 0.00000
12 4 CBX CA 3.96329 -1.03051 0.00000 B 2 0.00000
MINI NRAP TFREQ 100.0 NSTEP 40 INBFRQ 5 STEP 0.4 PRTMIN 1 IHBFRQ 5 -
TOLGRD 0.0001 NPRINT 1 DEBUG
COOR ORIE RMS MASS
PRINT COORD
open write card unit 14 name @9/brbtest.crd
WRITE COORDS CARD UNIT 14
* SECOND DERIVATIVE TEST COORDINATES
*
IC FILL
PRINT IC
if ?NUMNODE .gt. 1 then
echo "Test NOT performed."
stop
endif
if ?novibran .eq. 1 then
echo "Test NOT performed."
stop
endif
VIBRAN
DIAG
PRINT NORM INTD DIPO MODE 1 THRU 13
END
STOP
This diff is collapsed.
* CHARMM testcase data directory assignment
*
faster on
set pnode =
if ?numnode .gt. 1 set pnode = node 0
set 0 ./ ! input data directory
set 9 ./ ! scratch directory
set testcheck stream @0/test.str
set qcheck stream @0/qtest.str
set testfail 0
return
This diff is collapsed.
* quick absolute test to cut down output (see test.str)
*
calc result = abs( @IN1 - @IN2 ) - abs ( @IN3 )
if @result le 0 then
echo @in4 testcase result: pass
else
echo @in4 testcase result: fail
incr testfail
endif
return
* testing against reference value
*
! stream @0test.str VAL REF TOL TESTID ! All arguments required
! checks if |val-ref| > tol*|ref|
! if tol < 0 or ref=0 an absolute test is performed vs |tol|
! sets teststat to pass or fail and increments testfail by 1 if test not passed
! echo @tstid testcase result: @teststat
! LNilsson, March 2011, September 2014
calc tst01 = abs( @IN1 - @IN2 )
if @IN3 gt 0 then
calc bogus = abs( @in2 )
if @bogus le 0 then
calc tst02 = abs ( @IN3 )
else
calc tst02 = abs( @IN2 * @IN3 )
endif
else
calc tst02 = abs ( @IN3 )
endif
set xxxprnl ?prnlev
prnlev 2 @pnode
if @tst01 .le. @tst02 then
set teststat pass
else
set teststat fail
incr testfail by 1
endif
echo @in4 testcase result: @teststat
prnlev @xxxprnl @pnode
return
This diff is collapsed.
* CHARMM testcase data directory assignment
*
faster on
set pnode =
if ?numnode .gt. 1 set pnode = node 0
set 0 ./ ! input data directory
set 9 ./ ! scratch directory
set testcheck stream @0/test.str
set qcheck stream @0/qtest.str
set testfail 0
return
* TESTS A NUMBER OF DYNAMICS CALCULATIONS
*
stream datadir.def
BOMLEV -1
OPEN READ FORM UNIT 11 NAME @0toph8.rtf
READ RTF CARD UNIT 11
close unit 11
OPEN READ FORM UNIT 12 NAME @0param3.prm
READ PARAM CARD UNIT 12
close unit 12
READ SEQUENCE CARDS
* TRYPTOPHAN
*
1
TRP
GENERATE TRYP SETUP
open write unit 18 formatted name @9dyntest1.psf
WRITE PSF card UNIT 18
* TRYPTOPHAN USING EXPLICIT HYDROGEN
*
READ COORD CARD
* TRYPTOPHAN BUILT AND MINIMIZED WITH SD 50 STEPS, ABNR 500 STEP,
* AND CG 50 STEPS
* EPS=R POTENTIAL
*
19
1 1 TRP HT1 0.10124 0.57409 -1.38529
2 1 TRP HT2 1.71114 0.43637 -1.90440
3 1 TRP N 1.06717 0.30225 -1.10075
4 1 TRP HT3 1.07999 -0.68894 -0.79051
5 1 TRP CA 1.47212 1.19190 0.02727
6 1 TRP CB 2.69565 2.02615 -0.34753
7 1 TRP CG 3.92166 1.16873 -0.67893
8 1 TRP CD1 4.81252 0.77506 0.29018
9 1 TRP CD2 4.29511 0.67909 -1.89046
10 1 TRP NE1 5.72693 0.04608 -0.32026
11 1 TRP HE1 6.09389 -0.74349 0.12669
12 1 TRP CE2 5.42381 -0.01032 -1.60094
13 1 TRP CE3 3.76875 0.77367 -3.15481
14 1 TRP CZ2 6.13756 -0.67683 -2.56270
15 1 TRP CZ3 4.47167 0.10800 -4.14811
16 1 TRP CH2 5.63634 -0.60503 -3.85644
17 1 TRP C 0.27986 2.11295 0.30889
18 1 TRP OT1 -0.40216 2.48057 -0.63623
19 1 TRP OT2 -0.10570 2.19226 1.45887
open write unit 17 file name @9dyntest1.crd
WRITE COOR FILE UNIT 17
* TRYPTOPHAN BUILT AND MINIMIZED WITH SD 50 STEPS, ABNR 500 STEP,
* AND CG 50 STEPS
* EPS=R POTENTIAL
*
PRINT COOR
IC PURGE
IC FILL
NBONDS CUTNB 100.0 CTONNB 99.0 CTOFNB 99.5
!!!!! 1 marker for the first section of dynamics testing
UPDATE INBFRQ 10 IHBFRQ 10 CUTHB 4.5 CUTHA 65.0 CTONHA 55.0 CTOFHA 60.0 -
CTONHB 3.5 CTOFHB 4.0
!!!!! 2 second section of dynamics
open read unit 17 file name @9dyntest1.crd
READ COOR FILE UNIT 17 RESTART
DYNA VERL NSTEP 20 AKMASTP .005 INBFRQ 10 IHBFRQ 10 FIRSTT 1000. NPRINT 1 -
ISEED 311 IPRFRQ 10 IHTFRQ 0 IEQFRQ 0
PRINT COOR
!!!!! 3 third section
open read unit 17 file name @9dyntest1.crd
READ COOR FILE UNIT 17 RESTART
CONS FIX PURGE sele bynum 6 : 16 end
!!!!! 4 fourth section
open read unit 17 file name @9dyntest1.crd
READ COOR FILE UNIT 17 RESTART
DYNA VERL NSTEP 20 AKMASTP .005 INBFRQ 10 IHBFRQ 10 FIRSTT 1000. NPRINT 1 -
ISEED 311 IPRFRQ 10 IHTFRQ 0 IEQFRQ 0
PRINT COOR
!!!!! 5 fifth section
open read unit 18 formatted name @9dyntest1.psf
READ PSF card UNIT 18
open read unit 17 file name @9dyntest1.crd
READ COOR FILE UNIT 17 RESTART
SHAKE BONH PURGE
DYNA NSTEP 20 AKMASTP .02 INBFRQ 10 IHBFRQ 10 FIRSTT 1000. NPRINT 1 -
ISEED 311 IPRFRQ 10 IHTFRQ 0 IEQFRQ 0
PRINT COOR
!ANAL
!COMPARE COOR UNIT 17$
!BUILD DIFF BOND GEOMETRY
!PRINT TABLE PRETTY
!END
!!!!! 6 sixth section
open read unit 17 file name @9dyntest1.crd
READ COOR FILE UNIT 17 RESTART
SHAKE BOND PURGE
DYNA NSTEP 20 AKMASTP .04 INBFRQ 10 IHBFRQ 10 FIRSTT 1000. NPRINT 1 -
ISEED 311 IPRFRQ 10 IHTFRQ 0 IEQFRQ 0
PRINT COOR
!ANAL
!COMPARE COOR UNIT 17$
!BUILD DIFF BOND GEOMETRY
!PRINT TABLE PRETTY
!END
!!!!! 7 seventh section
open read unit 17 file name @9dyntest1.crd
READ COOR FILE UNIT 17 RESTART
CONS FIX PURGE sele bynum 6 : 16 end
SHAKE BOND PURGE
open write unit 40 file name @9for040.dat
open write unit 50 file name @9for050.dat
open write unit 89 CARD name @9for089.dat
DYNA NSTEP 100 AKMASTP .04 INBFRQ 10 IHBFRQ 10 FIRSTT 1000. NPRINT 1 -
IPRFRQ 10 IHTFRQ 0 IEQFRQ 0 NSAVC 2 NSAVV 2 AVERAGE IUNCRD 40 IUNVEL 50 -
ISEED 311 IUNWRI 89
open write unit 41 file name @9for041.dat
open write unit 51 file name @9for051.dat
open read unit 89 CARD name @9for089.dat
DYNA REST IUNREA 89 AVERAGE IUNCRD 41 IUNVEL 51 IUNWRI -1 NSTEP 100
PRINT COOR
open read unit 17 file name @9dyntest1.crd
READ COOR FILE UNIT 17 RESTART
DYNA NSTEP 200 AKMASTP .04 INBFRQ 10 IHBFRQ 10 FIRSTT 1000. NPRINT 20 -
IPRFRQ 200 IHTFRQ 0 IEQFRQ 0 NSAVC 1000 NSAVV 1000 IUNCRD -1 IUNVEL -1 -
ISEED 311 IUNWRI -1
PRINT COOR
!!!!! 8 eight section
open read unit 17 file name @9dyntest1.crd
READ COOR FILE UNIT 17 RESTART
open read unit 40 file name @9for040.dat
open read unit 41 file name @9for041.dat
open write unit 80 file name @9for080.dat
open write unit 81 file name @9for081.dat
open write unit 82 file name @9for082.dat
open write unit 83 file name @9for083.dat
open write unit 84 file name @9for084.dat
MERGE COOR FIRSTU 40 NUNIT 2 SKIP 2 NFILE 20 OUTPUTU 80
open read unit 80 file name @9for080.dat
open read unit 81 file name @9for081.dat
open read unit 82 file name @9for082.dat
open read unit 83 file name @9for083.dat
open read unit 84 file name @9for084.dat
open WRITE unit 85 file name @9for085.dat
MERGE FIRSTU 80 NUNIT 5 OUTPUTU 85
open read unit 50 file name @9for050.dat
open read unit 51 file name @9for051.dat
open write unit 88 file name @9for088.dat
MERGE VEL FIRSTU 50 NUNIT 2 OUTPUTU 88
!!!!! 9 nine section
READ COOR FILE UNIT 17 RESTART
print ic
open read unit 40 file name @9for040.dat
open read unit 41 file name @9for041.dat
ic dyna aver firstu 40 nunit 2
print ic
open read unit 40 file name @9for040.dat
open read unit 41 file name @9for041.dat
ic dyna fluc firstu 40 nunit 2
print ic