C++函数Dynamics<T,DESCRIPTOR>::iniRegularized形参类型及用法疑问
问题1:参数声明的含义
这两个是函数的形参声明,结合你贴的LBM(格子玻尔兹曼方法)代码语境:
const T u[DESCRIPTOR::d]:声明元素类型为T的常量数组形参u。DESCRIPTOR是当前类的模板参数,DESCRIPTOR::d是该模板类定义的静态常量,代表模拟空间的维度(比如2维模拟对应值为2,3维对应值为3),用来约定传入的u数组长度,u本身存储宏观速度分量。const T pi[util::TensorVal<DESCRIPTOR >::n]:同样是元素类型为T的常量数组形参pi。util::TensorVal<DESCRIPTOR>是工具类模板,::n是它的静态常量,代表当前离散速度格式下二阶应变率张量的展开元素个数,用来约定传入的pi数组长度,pi存储偏离平衡态的粘性应力张量分量。
问题2:类型与长度说明
- C++语法规定,函数形参列表里的数组声明会自动退化为指向首元素的指针,所以此处
u的实际类型是const T*,pi的实际类型也是const T*,二者都不是数组类型。 DESCRIPTOR::d和util::TensorVal<DESCRIPTOR >::n是代码约定的对应传入数组的长度,写在方括号里仅作为接口语义提示,编译器不会对传入数组的长度做强制校验,调用方需要遵循约定传入对应长度的数组才能保证逻辑正确。
问题3:直接传递的原因
代码中被调用的util::normSqr<T,DESCRIPTOR::d>、computeEquilibrium、firstOrderLbHelpers<T,DESCRIPTOR>::fromPiToFneq三个函数,对应的形参设计就是接收const T*类型的指针。形参u和pi本身就是指向数组首元素的指针,直接传递就等于把数组的首地址传给了被调用函数,被调用函数内部会自行根据约定长度按下标访问数组元素,不需要在调用时手动取下标。
相关代码:
void Dynamics<T,DESCRIPTOR>::iniRegularized( Cell<T,DESCRIPTOR>&cell, T rho, const T u[DESCRIPTOR::d], const T pi[util::TensorVal<DESCRIPTOR >::n]) { T uSqr = util::normSqr<T,DESCRIPTOR::d>(u); for (int iPop=0; iPop<DESCRIPTOR::q; ++iPop) { cell[iPop] = computeEquilibrium(iPop, rho, u, uSqr) + firstOrderLbHelpers<T,DESCRIPTOR>::fromPiToFneq(iPop, pi); } }
内容的提问来源于stack exchange,提问作者user2188453
相关产品推荐
相关产品推荐

