System struct
概要
system_struct は ms ファイルに対する操作を行う構造体である。 現在、(ms ファイルの)バージョンが0.3未満と0.3以上で仕様が大きく異なっている。 以下に使用できるサブルーチンの一覧をバージョンごとに示す。
どのversionにも対応
- read
- write
- set
- allocate
- get_grpstart
version<0.3 専用
- calc
- make_pairtype
version>=0.3 専用
- bonddata_check
- angledata_check
- dihedraldata_check
- outofplanedata_check
- reallocate_intradata
- (clean?)
ms ファイルのバージョンによる仕様の違いは msファイルの仕様 を参照のこと。
モジュールの構造
<source lang="fortran">
module system_module
implicit none
real,parameter,private :: current_version = 0.3 !!! バージョン integer,private,parameter :: maxbonddata = 20 !!! 結合情報の最大行数 integer,private,parameter :: maxangledata = 5 !!! 結合角情報の最大行数 integer,private,parameter :: maxadj = 6 !!! 隣接原子の最大個数
type :: system_struct
!!! システム情報 real :: version !!! 読み取り形式のバージョン REAL8 :: size(1:3) !!! 系のサイズ
! REAL8 :: T !!! 温度
REAL8 :: Tinit !!! 温度
!!! サイト情報 integer :: nsite=0 !!! 全サイト数 character(len=10),allocatable :: name(:) !!! サイト名 (1:nsite) integer,allocatable :: grpnum(:) !!! グループ番号 (1:nsite) REAL8,allocatable :: m(:) !!! 質量 (1:nsite) REAL8,allocatable :: q(:) !!! 電荷 (1:nsite) REAL8,allocatable :: alpha(:) !!! 分極率 (1:nsite) REAL8,allocatable :: sigma(:) !!! LJ パラメータ(sigma) (1:nsite) REAL8,allocatable :: eps(:) !!! LJ パラメータ(epsilon) (1:nsite) REAL8,allocatable :: x(:,:) !!! 座標 (1:3,1:nsite) (1:3=x,y,z) REAL8,allocatable :: v(:,:) !!! 速度 (1:3,1:nsite) (1:3=x,y,z) REAL8,allocatable :: p(:,:) !!! 運動量 (1:3,1:nsite) (1:3=x,y,z) REAL8,allocatable :: F(:,:) !!! 力 (1:3,1:nsite) (1:3=x,y,z)
!!!!!!! version < 0.3 専用 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
integer,allocatable :: nadj(:) !!! 隣接サイト数 (1:nsite) integer,allocatable :: adj(:,:) !!! 隣接サイト番号 (1:nadj,1:nsite)
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!!!!!!! version < 0.3 専用 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!!! 結合情報(BOND_DATA) character(len=20) :: bonddataline(1:maxbonddata) !!! 結合情報のテキスト !!! !!! フォーマット(空白はいくつでも可) !!! !!! サイト1の名前 サイト2の名前 結合距離(A) 結合定数 !!! !!! *** 結合定数は今のところ使っていない。 0 とすること。 !!! integer :: nbonddata !!! データが格納されている bonddataline の数 integer :: nbond !!! 全結合数、重複なし integer,allocatable :: bond(:,:) !!! 結合のリスト (1:2,1:nbond) REAL8,allocatable :: r_eq(:) !!! 結合距離 (1:nbond) REAL8,allocatable :: k_r(:) !!! 結合定数 (1:nbond)
!!! 結合角情報(ANGLE_DATA) character(len=20) :: angledataline(1:maxangledata) integer :: nangledata !!! データが格納されている angledataline の数 integer :: nangle !!! 全結合角数、重複なし integer,allocatable :: angle(:,:) !!! 結合角のリスト (1:3,1:nangle) REAL8,allocatable :: theta_eq(:) !!! 結合角 (1:nangle) REAL8,allocatable :: k_theta(:) !!! 結合定数 (1:naangle)
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!!!!!!! version >= 0.3 専用 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!!! 結合情報(BOND_DATA) character(len=80),allocatable :: bonddataline2(:) !!! 結合情報の文字列 (1:nbonddata2) integer :: nbonddata2 !!! データが格納されている bonddataline2 の数
!!! 結合角情報(ANGLE_DATA) character(len=80),allocatable :: angledataline2(:) !!! 結合角情報の文字列 (1:nangledata2) integer :: nangledata2 !!! データが格納されている angledataline2 の数
!!! 二面角情報(DIHEDRAL_DATA) character(len=80),allocatable :: dihedraldataline2(:) !!! 二面角情報の文字列 (1:ndihedraldata2) integer :: ndihedraldata2 !!! データが格納されている dihedraldataline2 の数
!!! 面外角情報(OUTOFPLANE_DATA) character(len=80),allocatable :: outofplanedataline2(:) !!! 面外角情報の文字列 (1:noutofplanedata2) integer :: noutofplanedata2 !!! データが格納されている outofplanedataline2 の数
integer,allocatable :: pairtype(:,:) !!! (1:nsite,1:nsite) !!! 2つのサイト番号のペア がどの結合状態にあるかを判定する変数。 !!! pairtype = -1 : 同じ番号のペア or 計算しないペア !!! 0 : 異なる分子間のペア or 分子内 1-i(i>=5) ペア !!! 1 : 同じ分子内の 1-2 ペア !!! 10 : 同じ分子内の 1-3 ペア !!! 100 : 同じ分子内の 1-4 ペア !!!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!!! フラグ logical :: done_allocate = .false. logical :: done_reallocate_intradata = .false. logical :: done_calc = .false. logical :: done_init = .false.
contains
procedure :: read !!! (unit)
!!! どの version にも対応
!!! ms ファイルの読み取りを行うサブルーチン。
!!! version < 0.3 では
!!! SITE_DATA(隣接リストあり),BOND_DATA,ANGLE_DATA (ただし、
!!! 角度の拘束等物理的に意味のあることはできない) を読み取る。
!!! version >= 0.3 では
!!! SITE_DATA(隣接リストなし),BOND_DATA,ANGLE_DATA,
!!! DIHEDRAL_DATA,OUTOFPLANE_DATA を読み取る。
!!! 詳しい仕様は mediawiki の
!!! 「ms ファイルの仕様」を参照。
!!! 入力 --- msファイル
!!! 出力 --- system 構造体変数
!!! (ver <0.3, >=0.3 共通)
!!! sys%version, sys%nsite, sys%size, sys%Tinit
!!! sys%name, sys%grpnum, sys%m, sys%q, sys%alpha
!!! sys%sigma, sys%eps, sys%x, sys%v, sys%F, sys%p
!!!
!!! (ver<0.3)
!!! sys%nadj, sys%adj
!!! sys%bonddataline, sys%nbonddata
!!! sys%angledataline, sys%nangledata
!!!
!!! (ver>=0.3)
!!! sys%pairtype
!!! sys%bonddataline2, sys%nbonddata2
!!! sys%angledataline2, sys%nangledata2
!!! sys%dihedraldataline2, sys%ndihedraldata2
!!! sys%outofplanedataline2, sys%noutofplanedata2
!!!
procedure :: write !!! (unit,file)
!!! どの version にも対応
!!! ms ファイルの作成を行うサブルーチン。
!!! version < 0.3 では
!!! SITE_DATA(隣接リストあり),BOND_DATA,ANGLE_DATA (ただし、
!!! 角度の拘束等物理的に意味のあることはできない) を書き込む。
!!! version >= 0.3 では
!!! SITE_DATA(隣接リストなし),BOND_DATA,ANGLE_DATA,
!!! DIHEDRAL_DATA,OUTOFPLANE_DATA を書き込む。
!!! 詳しい仕様は mediawiki の
!!! 「ms ファイルの仕様」を参照。
!!! 入力 --- system 構造体
!!! 出力 --- msファイル
!!!
! procedure :: set !!! set(version,nsite,size,T) (optional):
procedure :: set !!! (version,nsite,size,Tinit)
!!! どの version にも対応
!!! ネームリスト変数(&system)を system_struct にセットする
!!! サブルーチン。
!!! 入力 --- version, nsite, size, Tinit
!!! version (optional) : ms ファイルのバージョン
!!! nsite (optional) : 粒子数
!!! size(1:3) (optional) : セルのサイズ
!!! Tinit (optional) : 初期温度
!!! 出力 --- sys%version, sys%nsite, sys%size, sys%Tinit
!!!
PROCEDURE :: clean !!! ()
!!! Deallocate unneccessary arrays to free memory.
!!! メモリ削減のために不要な配列を deallocate する
!!! サブルーチン
!!! 2016/11/25 現在、
!!! sys%bonddataline2
!!! sys%angledataline2
!!! sys%dihedraldataline2
!!! sys%outofplanedataline2
!!! を deallocate するようになっているが、
!!! これらの変数は msファイルに write する必要があるので、
!!! このサブルーチンは使用されていない。
procedure :: bonddata_check !!! (line,ibonddata2,site1,site2)
!!! version >= 0.3 専用
!!! BOND_DATA (version>=0.3) に格納されているデータと
!!! 重複がないかをチェックするサブルーチン
!!! 基本的に system%read 中でのみ呼ばれると想定している。
!!! 入力 --- line, ibonddata2
!!! line : 重複チェックを行いたい行データ
!!! ibonddata2 : system%read 中で現在
!!! 読み込んでいる行数
!!! 出力 --- 重複判定(エラーがあれば log に出力)
!!! site1, site2
!!! site1,site2 : line 中に入力されているサイト番号
!!! 番号の並びについて 1-2 or 2-1 を同じ情報だと
!!! 見なしているため、どちらかの並びで入力する
!!! 必要がある。
!!!
procedure :: angledata_check !!! (line,iangledata2,site1,site2,site3)
!!! version >= 0.3 専用
!!! ANGLE_DATA (version>=0.3) に格納されているデータと
!!! 重複がないかをチェックするサブルーチン
!!! 基本的に system%read 中でのみ呼ばれると想定している。
!!! 入力 --- line, iangledata2
!!! line : 重複チェックを行いたい行データ
!!! iangledata2 : system%read 中で現在
!!! 読み込んでいる行数
!!! 出力 --- 重複判定(エラーがあれば log に出力)
!!! site1, site2, site3
!!! site1,site2,site3 : line 中に入力されているサイト番号
!!! 番号の並びについて 1-2-3 or 3-2-1 を同じ情報
!!! だと見なしているため、どちらかの並びで入力する
!!! 必要がある。
!!!
procedure :: dihedraldata_check !!! (line,idihedraldata2,
!!! site1,site2,site3,site4)
!!! version >= 0.3 専用
!!! DIHEDRAL_DATA (version>=0.3) に格納されているデータと
!!! 重複がないかをチェックするサブルーチン
!!! 基本的に system%read 中でのみ呼ばれると想定している。
!!! 入力 --- line, idihedraldata2
!!! line : 重複チェックを行いたい行データ
!!! idihedraldata2 : system%read 中で現在
!!! 読み込んでいる行数
!!! 出力 --- 重複判定(エラーがあれば log に出力)
!!! site1, site2, site3, site4
!!! site1,site2,site3,site4 : line 中に入力されている
!!! サイト番号
!!! 番号の並びについて 1-2-3-4 or 4-3-2-1 を同じ情報
!!! だと見なしているため、どちらかの並びで入力する
!!! 必要がある。
!!! 番号の並びによって符号が変化するので注意。
!!!
procedure :: outofplanedata_check !!! (line,ioutofplanedata2,
!!! site1,site2,site3,site4)
!!! version >= 0.3 専用
!!! OUTOFPLANE_DATA (version>=0.3) に格納されているデータと
!!! 重複がないかをチェックするサブルーチン
!!! 基本的に system%read 中でのみ呼ばれると想定している。
!!! 入力 --- line, ioutofplanedata2
!!! line : 重複チェックを行いたい行データ
!!! ioutofplanedata2 : system%read 中で現在
!!! 読み込んでいる行数
!!! 出力 --- 重複判定(エラーがあれば log に出力)
!!! site1, site2, site3, site4
!!! site1,site2,site3,site4 : line 中に入力されている
!!! サイト番号
!!! 番号の並びについて 1-2-3-4 or 1-2-4-3 or
!!! 3-2-1-4 or 3-2-4-1 or
!!! 4-2-1-3 or 4-2-3-1
!!! を同じ情報だと見なしているため、
!!! いずれかの並びで入力する必要がある。
!!! 番号の並びによってポテンシャルの定義
!!! が変化するので注意。
!!!
procedure :: allocate !!! (n)
!!! どの version にも対応
!!! SITE_DATAの配列のアロケーションを行うサブルーチン
!!! 入力 --- n
!!! n (optional) : SITE_DATA を allocate したい粒子数
!!! 入力値を設定しない場合 sys%nsite で
!!! allocate される
!!! 出力 --- system 構造体変数
!!! (ver <0.3, >=0.3 共通)
!!! sys%name, sys%grpnum, sys%m, sys%q, sys%alpha
!!! sys%sigma, sys%eps, sys%x, sys%v, sys%F, sys%p
!!!
!!! (ver<0.3)
!!! sys%nadj, sys%adj
!!!
procedure :: reallocate_intradata !!! (nb,na,nd,no)
!!! version >= 0.3 専用
!!! BOND_DATA以下のデータ(version>=0.3)
!!! の配列のアロケーションを行う
!!! 入力 --- nb, na, nd, no
!!! nb (optional) : bonddataline2 を allocate
!!! したい数
!!! na (optional) : angledataline2 を allocate
!!! したい数
!!! nd (optional) : dihedraldataline2 を allocate
!!! したい数
!!! no (optional) : outofplanedataline2 を allocate
!!! したい数
!!! 入力値を設定しない場合 sys%nbonddata2,
!!! sys%nangledata2, sys%ndihedraldata2,
!!! sys%noutofplanedata2 で allocate される
!!! 出力 --- system 構造体変数
!!! sys%nbonddata2, sys%nangledata2
!!! sys%ndihedraldata2, sys%noutofplanedata2
!!!
procedure :: calc !!! ()
!!! version < 0.3 専用
!!! system%read で格納した BOND_DATA,ANGLE_DATA の文字列データから
!!! パラメータを読み取り、system_struct の変数に格納する
!!! サブルーチン。
!!! 入力 --- system 構造体
!!! 出力 --- system 構造体変数
!!! sys%nbond, sys%nangle, sys%bond, sys%angle
!!! sys%r_eq, sys%k_r, sys%theta_eq, sys%k_theta
!!!
procedure :: get_grpstart !!! (grpstart,ngrp)
!!! どの version にも対応
!!! グループの開始番号を計算するサブルーチン。
!!! 入力 --- system 構造体
!!! 出力 --- grpstart, ngrp
!!! grpstart : 同じグループ番号の中で、
!!! はじめに出てくる
!!! サイトの番号の配列
!!! ngrp : ms ファイルのグループ番号の最大値
!!!
procedure :: make_pairtype !!! (site1,site2) result(check)
!!! version < 0.3 専用
!!! site1 と site2 がどの結合状態にあるかを判定する関数。
!!! 入力 --- site1, site2
!!! site1,site2 : 判定したいサイト番号のペア
!!! 出力 --- check
!!! check : サイト番号ペアのタイプに応じた数
!!!
!!! check = -1 : 同じ番号のペア or 計算しないペア
!!! 0 : 異なる分子間のペア or 分子内 1-i(i>=5) ペア
!!! 1 : 同じ分子内の 1-2 ペア
!!! 10 : 同じ分子内の 1-3 ペア
!!!
endtype
</source>