System struct

提供: ComplexRI: Manual
ナビゲーションに移動 検索に移動

概要

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>