Flexlist module
Flexiest モジュールは、サイズ可変のリスト型データの集まりのフォーマットを変換するサブルーチンをまとめたものである。汎用性が高いので、独立したモジュールとしている。
リスト型データの種類
- (1) リスト
各行はバイアスポテンシャル(#1, #2, ...)ごとに適用するノード番号とする。
| バイアス番号 | ノード番号 |
|---|---|
| #1 | 1 2 |
| #2 | 7 |
| #3 | 0 |
| #4 | -1 -2 -8 |
※ ノード番号は、基本的に正の整数とする。
ただし、0はすべてのノード、負の数はそれを除いた全てのノードを意味すると拡張する。正の数、0、負の数が混在することは許されない。
- (2) テーブル (行はバイアス番号、列はノード番号)
| ノード | ||||||||
|---|---|---|---|---|---|---|---|---|
| バイアス | T | T | F | F | F | F | F | F |
| F | F | F | F | F | F | T | F | |
| T | T | T | T | T | T | T | T | |
| F | F | T | T | T | T | T | F | |
- (3) 転置リスト
各行はノード番号で、それごとに適用されるバイアスポテンシャル番号を示す。
| ノード | バイアス |
|---|---|
| #1 | 1 3 |
| #2 | 1 3 |
| #3 | 3 4 |
| #4 | 3 4 |
| #5 | 3 4 |
| #6 | 3 4 |
| #7 | 2 3 4 |
| #8 | 3 |
変数の形式
- (1) リスト、および (3) 転置リスト
以下のサイズ可変のリストlist_type構造体の1次元配列
type(list_type) :: list(:) で与えられる。
ただし、list_typeの形は、 <source lang="fortran">
type list_type integer, allocatable :: id(:) !!! 1行あたりの要素配列。 end type list_type
</source>
- (2) テーブル
2次元の論理変数配列。 logical :: table(sizex, sizey)
サブルーチン一覧
リスト変数のチェック <source lang="fortran">
- translate_list (list, isize)
</source> (1)のリスト型データの妥当性をチェックする。同じノード番号を重複している場合や、ノード番号に正の数、0、負の数が混在するとエラーとする。 また、ノード番号に0や負の数を含む拡張形の場合、正の数のみのリスト型データに変換して出力する。
データ構造変換のサブルーチン <source lang="fortran">
- list2table (list, table) (1) -> (2)
- table2list (table, list) (2) -> (1)
- transpose_list (list_in, list_out) (1) -> (3)
- table2pair (table,plist,nrow,ncolumn)
- pair2table (plist,table,nrow,ncolumn)
</source> ※ list2tableでは、ノード番号に0や負の数を含む拡張形を認めない。その場合、前もってtranslate_list を行っておく必要がある。
※ transpose_list は、内部的に (1)->(2), (2)の転置、(2)の転置-> (1)の転置 を実施している。
Module structure
<source lang="fortran">
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
MODULE flexlist_module
IMPLICIT NONE
! サイズ可変のリスト。これを1次元配列として、2次元のリスト構造を表す。 ! Neighbor list struct.
TYPE flexlist_struct INTEGER,ALLOCATABLE :: id(:) !!! 1行あたりの要素配列。 END TYPE flexlist_struct
! Pair list struct.
TYPE pairlist_struct INTEGER :: a !!! Index of one side. INTEGER :: b !!! Index of another side. END TYPE pairlist_struct
CONTAINS
!!! Subroutine for copying list. SUBROUTINE copy_list(list,list_cp)
!!! Subroutine for add element to existing flexlist. SUBROUTINE add_id(flexlist,id)
!!! Subroutine for remove element from existing flexlist. SUBROUTINE remove_id(flexlist,id)
</source>