次へ 上へ 前へ 目次へ
次へ:Reading the step input 上へ:Allocation of the fields 前へ:readinput 目次へ

allocate

サブルーチン 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 の一時的な値で再確保され、これが続いていきます。ステップの情報に従って変更される可能性のあるフィールドは全て各ステップで再確保を行なう必要があります。


表 19:ファイル ccx2.10.c でのメモリ確保の表
calinput の前calinput の後サイズ
< ステップ 1> ステップ 1= ステップ 1> ステップ 1≥ ステップ 1ステップ 1 または ntrans > 0
coARR3*nk
konARnkon
ipkonARne
lakonAR8*ne
ielpropAnprop>0: R
それ以外の場合 D
nprop > 0 かつ network = 1: Rne
propA nprop>0: R
それ以外の場合 D
nprop
nodebounARRnboun
ndirbounARRnboun
typebounARRnboun
xbounARRnboun
ikbounARRnboun
ilbounARRnboun
iambounAnam > 0: Rnam ≤ 0: Dnam > 0: Rnboun
nodebounoldirstrt < 0: AAR/Rnboun
ndirbounoldirstrt < 0: A AR/Rnboun
xbounoldirstrt < 0: A AR/Rnboun
ipompcARRnmpc
labmpcARR20*nmpc+1
ikmpcARRnmpc
ilmpcARRnmpc
fmpc ARRnmpc
nodempcA3*memmpc_
coefmpcAmemmpc_
nodeforcARR2*nforc
ndirforcARRnforc
xforcARRnforc
ikforcARRnforc
ilforcARRnforc
iamforcAnam > 0: Rnam ≤ 0: Dnam > 0: Rnforc
xforcoldirstr < 0: AARnforc
idefforcAAD
nelemloadARnetwork =1: R2*nload
sideloadAR network =1:R20*nload
xloadAR network =1:R2*nload
iamloadAnam > 0: Rnam ≤ 0: D nam > 0 network = 1: R2*nload
xloadoldirstrt < 0: AARnetwork =1: R2*nload
idefloadAAD
cbodyARR81*nbody
ibodyARR3*nbody
xbodyARR7*nbody
xbodyoldARR7*nbody
idefbodyAAD
nodeflowARR2*nflow
xflowARRnflow
iamflowAnam > 0: Rnam ≤ 0: Dnam > 0: Rnflow
xflowoldAR2*nflow
nodeprintARRnoprint
nelemprintARRneprint
noelplabA4*nlabel
noelflabA4*nlabel
filabA
prlabA
prsetA
setAR81*nset
istartsetARnset
iendsetARnset
ialsetARnalset
elconAR(ncmat_+1)*
*ntmat_*nmat
nelconAR2*nmat
rhconAR2*ntmat_*nmat
nrhconARnmat
shconAR4*ntmat_*nmat
nshconARnmat
coconAR7*ntmat_*nmat
ncoconARnmat
alconAR7*ntmat_*nmat
nalconAR2*nmat
alzeroARnmat
pliconAnpmat_ > 0: R
それ以外の場合 D
(2*npmat_+1)*
*ntmat_*nmat
npliconAnpmat_ > 0: R
それ以外の場合 D
(ntmat_+1)*nmat
plkconAnpmat_ > 0: R
それ以外の場合 D
(2*npmat_+1)*
*ntmat_*nmat
nplkconAnpmat_ > 0: R
それ以外の場合 D
(ntmat_+1)*nmat
ornameAnorien > 0: R
それ以外の場合 D
80*norien
orabAnorien > 0: R
それ以外の場合 D
7*norien
ielorienAnorien > 0: R
それ以外の場合 D
norien > 0 かつ network = 1: Rmi[2]*ne
trabAntrans > 0: R
それ以外の場合 D
7*ntrans
inotrAntrans > 0: Rntrans ≤ 0: Dntrans > 0: R2*nk
amnameAnam > 0: R nam > 0: R
それ以外の場合 D
nam > 0: R 80*nam
amtaA nam > 0: R
それ以外の場合 D
nam > 0: R nam > 0: R2*namta*
(3*nam-2)
namtaA nam > 0: R
それ以外の場合 D
nam > 0: R nam > 0: R3*nam
t0Aithermal ≠ 0
R
ithermal = 0: Dithermal ≠ 0
R
nk (3D)
3*nk_ (1D/2D)
t1Aithermal ≠ 0
R
ithermal = 0: Dithermal ≠ 0
R
nk (3D)
3*nk_ (1D/2D)
iamt1Aithermal ≠ 0: Rnam ≤ 0 または ithermal = 0: Dithermal ≠ 0 かつ nam > 0: Rnk
t1oldirstrt < 0, ithermal ≠ 0: Aithermal ≠ 0: Aithermal ≠ 0: Rnk
t0g1D/2D: A1D/2D かつ ithermal ≠ 0: R1D/2D かつ ithermal = 0: D1D/2D ithermal ≠ 0: R2*nk
t1g1D/2D: A1D/2D かつ ithermal ≠ 0: R1D/2D かつ ithermal = 0: D1D/2D ithermal ≠ 0: R2*nk
ielmatARmi[2]*ne
matnameAR80*nmat
voldARRRmt*nk
veoldAnmethod ≠ 4 かつ (nmethod ≠ 1 または iperturb < 2): A それ以外の場合 Rnmethod = 4/5 または (||$nmethod|| = 1 かつ iperturb ≥ 2): R それ以外の場合 Dmt*nk
accoldnmethod = 4 かつ iperturb > 1: A4*nk
only ne1d ≠ 0 または ne2d ≠ 0
iponorAR2*nkon
xnorARinfree[0]
knorARinfree[1]
thicknAD-
thickeARmi[2]*nkon
offsetARnetwork=1: R2*ne
iponoelARinfree[3]
inoelAR3*(infree[2]-1)
rigARinfree[3]
icsncs_ > 0 または npt_ > 0: AR
R
ncs_
dcsncs_ > 0 または npt_ > 0: AD
D
-
csntie_ > 0: Amcs > 0: R それ以外の場合 D
stiirstrt < 0: AAnetwork = 1: R6*mint_*ne
emeirstrt < 0: AAnetwork = 1: R6*mint_*ne
enerirstrt < 0 かつnener=1 かつ mint_*ne*2
nener=1: Anenerold=0: A
xstateARnstate_ *
*mint_ * ne_
tiesetntie ≥ 0: A
tietolntie ≥ 0: A
prestrAiprestr = 1/2: R
それ以外の場合 D
iprestr > 0 かつ6*mi[0]*ne

注意:このマニュアルでは ithermal(1) と ithermal は同じ意味で使用されています。



次へ 上へ 前へ 目次へ
次へ:Reading the step input 上へ:Allocation of the fields 前へ:readinput 目次へ
guido dhondt 2016-03-08