当該コードは
https://github.com/NREL/EnergyPlus/blob/9e88f630aeacbd4d030305988ac2d6d071005d80/src/EnergyPlus/HeatBalanceSurfaceManager.cc#L2147
これかな?今度からどこから引っ張ったコードか質問文に含めるのをお忘れなきよう。
cpp
1THM(1, {1, Construct(Surface(SurfNum).Construction).NumCTFTerms + 1}, SurfNum) = Surface(SurfNum).OutDryBulbTemp;
を分解していきます。
まずTHM
は
cpp
1Array3D<Real64> THM; // Master Temperature History (on the time step for the construct)
のように定義されている変数です。
https://github.com/NREL/EnergyPlus/blob/e3becf2f977340f20dc05a3b3836dc7ecd60b8ed/src/EnergyPlus/DataHeatBalSurface.cc#L240
さて、変数のあとに()
を続ける記法といえばなにか、そう、operator()
です。Array3D
というクラスはこのoperatorを持つはずです。
探してみるとその基底クラスのArray3
クラスが持っています。いくつかoverloadされていますが、該当するのはこれでしょう。
cpp
1 // array( i1, s2, i3 )
2 Array1S< T >
3 operator ()( int const i1, IS const & s2, int const i3 )
4 {
5 std::int64_t k( -shift_ );
6 k += slice_k( I1_, i1, z2_ * z3_ );
7 DS const d2( I2_, s2, z3_ );
8 k += slice_k( I3_, i3 );
9 return Array1S< T >( data_, k, d2 );
10 }
https://github.com/NREL/EnergyPlus/blob/eb68ccb2bfb3d01807412e33399299da8cdb4b11/third_party/ObjexxFCL/src/ObjexxFCL/Array3.hh#L1127-L1136
第2引数のIS
が何かというと
cpp
1typedef typename Super::IS IS;
https://github.com/NREL/EnergyPlus/blob/eb68ccb2bfb3d01807412e33399299da8cdb4b11/third_party/ObjexxFCL/src/ObjexxFCL/Array3.hh#L53
となっており、Super
は
cpp
1 typedef Array< T > Super;
https://github.com/NREL/EnergyPlus/blob/eb68ccb2bfb3d01807412e33399299da8cdb4b11/third_party/ObjexxFCL/src/ObjexxFCL/Array3.hh#L35
となっていますから、Array
クラスをみると
cpp
1 typedef IndexSlice IS;
https://github.com/NREL/EnergyPlus/blob/eb68ccb2bfb3d01807412e33399299da8cdb4b11/third_party/ObjexxFCL/src/ObjexxFCL/BArray.hh#L31
となっています。
さて、{1, Construct(Surface(SurfNum).Construction).NumCTFTerms + 1}
の{}
はなにかを調べるにはIndexSlice
クラスのコンストラクタを見る必要があります。{}
記法は、まずstd::initializer_list
を引数に取るコンストラクタを探し、なければ通常の()
でのコンストラクタ呼び出しと等価になる(こっちはuniform initialization)記法です
探してみるとstd::initializer_list
を取るコンストラクタがありました。
cpp
1 // Initializer List of Integer Constructor
2 template< typename U, class = typename std::enable_if< std::is_constructible< int, U >::value >::type >
3 IndexSlice( std::initializer_list< U > const lus ) :
4 l_init_( lus.size() > 0u ),
5 u_init_( lus.size() > 1u ),
6 scalar_( false ),
7 l_( 1 ),
8 u_( 0 ),
9 s_( 1 ),
10 size_( 0u )
11 {
12 size_type const n( lus.size() );
13 assert( n <= 3 );
14 auto i( lus.begin() );
15 switch ( n ) {
16 case 0: // {}
17 l_ = 1;
18 u_ = 0;
19 s_ = 1;
20 break;
21 case 1: // {l}
22 l_ = *i;
23 u_ = 0;
24 s_ = 1;
25 break;
26 case 2: // {l,u}
27 l_ = *i;
28 u_ = *(++i);
29 s_ = 1;
30 break;
31 case 3: // {l,u,s}
32 l_ = *i;
33 u_ = *(++i);
34 s_ = *(++i);
35 break;
36 }
37 assert( s_ != 0 );
38 size_ = computed_size();
39 }
https://github.com/NREL/EnergyPlus/blob/eb68ccb2bfb3d01807412e33399299da8cdb4b11/third_party/ObjexxFCL/src/ObjexxFCL/IndexSlice.hh#L92-L130
という感じで{}
の謎は解決されました。