Modify functions for reading values from cnt files
解析制御ファイル(cntファイル)に記載されたカードの値や自由度を読み取る際の、ポインタ変数の挙動の変更
Closes #719 (closed)
例えば !BOUNDARY の読み取りでは
val_ptr => P%SOLID%BOUNDARY_ngrp_val(old_size+1:)
val_ptr = 0
rcode = fstr_ctrl_get_BOUNDARY( ctrl, amp, grp_id_name, HECMW_NAME_LEN, dof_ids, dof_ide, val_ptr)
if( rcode /= 0 ) call fstr_ctrl_err_stop
となっており、 val_ptr は、配列の新たに追加された部分のスライスを指す。この val_ptr は、v5.7.1で更新した(ISO_C_BINDING対応;!467 (merged))読み取りの関数に渡される。
このとき、GPU向けにNVIDIAコンパイラでビルドすると、 P%SOLID%BOUNDARY_ngrp_valの配列全体がゼロで埋められてしまうことが判明した。
そのため、カードを2回以上記載すると、(前の回で設定した)境界条件の非ゼロ値が失われてしまった。
(→ #716 (closed) の解決後もzero RHS normでエラーになった)
したがって
allocate( val_ptr(n) )
...
val_ptr = 0.0d0
rcode = fstr_ctrl_get_BOUNDARY( ctrl, amp, grp_id_name, HECMW_NAME_LEN, dof_ids, dof_ide, val_ptr)
if( rcode /= 0 ) call fstr_ctrl_err_stop
...
do i = 1, n
P%SOLID%BOUNDARY_ngrp_val(old_size+i) = val_ptr(i)
enddo
...
deallocate( val_ptr )
nullify( val_ptr )
のように、ポインタが配列のスライスを直接指さないようにすることで、既存の値が失われないようにする。
注)
- CLOAD, DLOAD, TEMP, SPRING, VELOCITY, ACCELERATIONも同様である。
- FLOADについては、条件分岐や不要なポインタの処理も含めたので別コミットとした。
- そもそも、GRPIDや自由度については修正後のような形式に似た書き方だった。そのため、
allocate/deallocateとループの位置は、既存のものがあれば合わせた。 - FLUX系のように、最初から全てが修正後のような形式で書かれているものも存在する。setup系全体で書式がバラバラのためrefactoringを要する。
Edited by Kanato Kono