サブルーチン allocate.f ではプログラムで使用されるフィールドの上限を決定するために入力が読み込まれます。ユーザーが確認できるようにこの上限は表示されます。この上限は以降の ccx_2.10.c でのメモリー確保処理時に使用されます。この処理は不格好に見えますが、後で入力を読み込むサブルーチンは FORTRAN77 で書かれているのでその場で再確保を行なうことは不可能なのです。従って上限を定義する必要があるのです。
どこでフィールドが確保、再確保、解放されるのか理解しておくことは重要です。これら処理のほとんどは ccx_2.10.c で行なわれます。表(19)に確保(A)、再確保(R)、解放(D)がファイル ccx_2.10.c のどこで行なわるのかの概要を示します。このファイルで重要なのは入力データが解釈されるサブルーチン calinput の呼び出しです。いくつか例をあげると、フィールド kon には要素の形状が保持されていてサイズ nkon で確保されます。これがステップ開始前に推定される上限です。入力が読み込まれサブルーチン calinput の最初のステップがインクルードされると、フィールドは正しいサイズで再確保されます。全ての要素が読み込まれて正確なサイズがわかるからです。ステップ内で新しい要素を定義することはできなため、このサイズは以降のステップでは変更できません。フィールド xforc はサブルーチン calinput に入る前に、推定される上限 nforc_ で確保されます。入力が読み込まれ最初のステップがインクルードされると、フィールドは真のサイズ nforc で再確保されます。2番目のステップ(あるいは以降のステップ)を読み込むために calinput に入る前に xforc はサイズ nforc_ で再確保されます。これは2番目のステップ(あるいは以降のステップ)で新しい力が定義される可能性があるためです。2番目のステップを読み終わるとフィールドは nforc の一時的な値で再確保され、これが続いていきます。ステップの情報に従って変更される可能性のあるフィールドは全て各ステップで再確保を行なう必要があります。
calinput の前 | calinput の後 | サイズ | |||||
---|---|---|---|---|---|---|---|
< ステップ 1 | > ステップ 1 | = ステップ 1 | > ステップ 1 | ≥ ステップ 1 | ステップ 1 または ntrans > 0 | ||
co | A | R | R | 3*nk | |||
kon | A | R | nkon | ||||
ipkon | A | R | ne | ||||
lakon | A | R | 8*ne | ||||
ielprop | A | nprop>0: R それ以外の場合 D | nprop > 0 かつ network = 1: R | ne | |||
prop | A | nprop>0: R それ以外の場合 D | nprop | ||||
nodeboun | A | R | R | nboun | |||
ndirboun | A | R | R | nboun | |||
typeboun | A | R | R | nboun | |||
xboun | A | R | R | nboun | |||
ikboun | A | R | R | nboun | |||
ilboun | A | R | R | nboun | |||
iamboun | A | nam > 0: R | nam ≤ 0: D | nam > 0: R | nboun | ||
nodebounold | irstrt < 0: A | A | R/R | nboun | |||
ndirbounold | irstrt < 0: A | A | R/R | nboun | |||
xbounold | irstrt < 0: A | A | R/R | nboun | |||
ipompc | A | R | R | nmpc | |||
labmpc | A | R | R | 20*nmpc+1 | |||
ikmpc | A | R | R | nmpc | |||
ilmpc | A | R | R | nmpc | |||
fmpc | A | R | R | nmpc | |||
nodempc | A | 3*memmpc_ | |||||
coefmpc | A | memmpc_ | |||||
nodeforc | A | R | R | 2*nforc | |||
ndirforc | A | R | R | nforc | |||
xforc | A | R | R | nforc | |||
ikforc | A | R | R | nforc | |||
ilforc | A | R | R | nforc | |||
iamforc | A | nam > 0: R | nam ≤ 0: D | nam > 0: R | nforc | ||
xforcold | irstr < 0: A | A | R | nforc | |||
idefforc | A | A | D | ||||
nelemload | A | R | network =1: R | 2*nload | |||
sideload | A | R | network =1:R | 20*nload | |||
xload | A | R | network =1:R | 2*nload | |||
iamload | A | nam > 0: R | nam ≤ 0: D | nam > 0 network = 1: R | 2*nload | ||
xloadold | irstrt < 0: A | A | R | network =1: R | 2*nload | ||
idefload | A | A | D | ||||
cbody | A | R | R | 81*nbody | |||
ibody | A | R | R | 3*nbody | |||
xbody | A | R | R | 7*nbody | |||
xbodyold | A | R | R | 7*nbody | |||
idefbody | A | A | D | ||||
nodeflow | A | R | R | 2*nflow | |||
xflow | A | R | R | nflow | |||
iamflow | A | nam > 0: R | nam ≤ 0: D | nam > 0: R | nflow | ||
xflowold | A | R | 2*nflow | ||||
nodeprint | A | R | R | noprint | |||
nelemprint | A | R | R | neprint | |||
noelplab | A | 4*nlabel | |||||
noelflab | A | 4*nlabel | |||||
filab | A | ||||||
prlab | A | ||||||
prset | A | ||||||
set | A | R | 81*nset | ||||
istartset | A | R | nset | ||||
iendset | A | R | nset | ||||
ialset | A | R | nalset | ||||
elcon | A | R | (ncmat_+1)* *ntmat_*nmat | ||||
nelcon | A | R | 2*nmat | ||||
rhcon | A | R | 2*ntmat_*nmat | ||||
nrhcon | A | R | nmat | ||||
shcon | A | R | 4*ntmat_*nmat | ||||
nshcon | A | R | nmat | ||||
cocon | A | R | 7*ntmat_*nmat | ||||
ncocon | A | R | nmat | ||||
alcon | A | R | 7*ntmat_*nmat | ||||
nalcon | A | R | 2*nmat | ||||
alzero | A | R | nmat | ||||
plicon | A | npmat_ > 0: R それ以外の場合 D | (2*npmat_+1)* *ntmat_*nmat | ||||
nplicon | A | npmat_ > 0: R それ以外の場合 D | (ntmat_+1)*nmat | ||||
plkcon | A | npmat_ > 0: R それ以外の場合 D | (2*npmat_+1)* *ntmat_*nmat | ||||
nplkcon | A | npmat_ > 0: R それ以外の場合 D | (ntmat_+1)*nmat | ||||
orname | A | norien > 0: R それ以外の場合 D | 80*norien | ||||
orab | A | norien > 0: R それ以外の場合 D | 7*norien | ||||
ielorien | A | norien > 0: R それ以外の場合 D | norien > 0 かつ network = 1: R | mi[2]*ne | |||
trab | A | ntrans > 0: R それ以外の場合 D | 7*ntrans | ||||
inotr | A | ntrans > 0: R | ntrans ≤ 0: D | ntrans > 0: R | 2*nk | ||
amname | A | nam > 0: R | nam > 0: R それ以外の場合 D | nam > 0: R | 80*nam | ||
amta | A | nam > 0: R それ以外の場合 D | nam > 0: R | nam > 0: R | 2*namta* (3*nam-2) | ||
namta | A | nam > 0: R それ以外の場合 D | nam > 0: R | nam > 0: R | 3*nam | ||
t0 | A | ithermal ≠ 0 R | ithermal = 0: D | ithermal ≠ 0 R | nk (3D) 3*nk_ (1D/2D) | ||
t1 | A | ithermal ≠ 0 R | ithermal = 0: D | ithermal ≠ 0 R | nk (3D) 3*nk_ (1D/2D) | ||
iamt1 | A | ithermal ≠ 0: R | nam ≤ 0 または ithermal = 0: D | ithermal ≠ 0 かつ nam > 0: R | nk | ||
t1old | irstrt < 0, ithermal ≠ 0: A | ithermal ≠ 0: A | ithermal ≠ 0: R | nk | |||
t0g | 1D/2D: A | 1D/2D かつ ithermal ≠ 0: R | 1D/2D かつ ithermal = 0: D | 1D/2D ithermal ≠ 0: R | 2*nk | ||
t1g | 1D/2D: A | 1D/2D かつ ithermal ≠ 0: R | 1D/2D かつ ithermal = 0: D | 1D/2D ithermal ≠ 0: R | 2*nk | ||
ielmat | A | R | mi[2]*ne | ||||
matname | A | R | 80*nmat | ||||
vold | A | R | R | R | mt*nk | ||
veold | A | nmethod ≠ 4 かつ (nmethod ≠ 1 または iperturb < 2): A それ以外の場合 R | nmethod = 4/5 または (||$nmethod|| = 1 かつ iperturb ≥ 2): R それ以外の場合 D | mt*nk | |||
accold | nmethod = 4 かつ iperturb > 1: A | 4*nk | |||||
only ne1d ≠ 0 または ne2d ≠ 0 | |||||||
iponor | A | R | 2*nkon | ||||
xnor | A | R | infree[0] | ||||
knor | A | R | infree[1] | ||||
thickn | A | D | - | ||||
thicke | A | R | mi[2]*nkon | ||||
offset | A | R | network=1: R | 2*ne | |||
iponoel | A | R | infree[3] | ||||
inoel | A | R | 3*(infree[2]-1) | ||||
rig | A | R | infree[3] | ||||
ics | ncs_ > 0 または npt_ > 0: A | R R | ncs_ | ||||
dcs | ncs_ > 0 または npt_ > 0: A | D D | - | ||||
cs | ntie_ > 0: A | mcs > 0: R それ以外の場合 D | |||||
sti | irstrt < 0: A | A | network = 1: R | 6*mint_*ne | |||
eme | irstrt < 0: A | A | network = 1: R | 6*mint_*ne | |||
ener | irstrt < 0 かつ | nener=1 かつ | mint_*ne*2 | ||||
nener=1: A | nenerold=0: A | ||||||
xstate | A | R | nstate_ * *mint_ * ne_ | ||||
tieset | ntie ≥ 0: A | ||||||
tietol | ntie ≥ 0: A | ||||||
prestr | A | iprestr = 1/2: R それ以外の場合 D | iprestr > 0 かつ | 6*mi[0]*ne |
注意:このマニュアルでは ithermal(1) と ithermal は同じ意味で使用されています。