我想在Fortran 90中獲得靈活的(編譯時定義的)存儲順序。爲此,我試圖使用包括一些增強pp頭的C++預處理器。使用C++預處理器在Fortran中編譯時定義的存儲順序
因此,舉例來說,而不是訪問三維陣列是這樣的:
myArray(k,i,j)
我想有這樣的:
myArray(POINT3D(i,j,k))
,並確定在編譯時訪問的順序。
現在我已經試過:
#include "boost_pp_cat.hpp"
#include "boost_pp_comma.hpp"
! ------ Define storage orders here --------- !
!Forward lookup {i,j,k} <- {1,2,3}
#define KIJ_ORDER_ARG1 k
#define KIJ_ORDER_ARG2 i
#define KIJ_ORDER_ARG3 j
! ------ Switch between storage orders ------ !
#define CURR_ORDER KIJ_ORDER
! ------ Generate all required macros ------- !
#define STOR_ORDER_ARG(storOrder, argNum) BOOST_PP_CAT(BOOST_PP_CAT(storOrder, _ARG), argNum)
#define CHOOSE_PARAM(storOrder, argNum) BOOST_PP_CAT(STOR_ORDER_ARG(storOrder, argNum), Param)
#define POINT3D(iParam, jParam, kParam) POINT3D_WITH_STORORDER(CURR_ORDER, iParam, jParam, kParam)
#define POINT3D_WITH_STORORDER(storOrder, iParam, jParam, kParam) POINT3D_WITH_STORORDER_PRE(storOrder)
#define POINT3D_WITH_STORORDER_PRE(storOrder) CHOOSE_PARAM(storOrder, 1), CHOOSE_PARAM(storOrder, 2), CHOOSE_PARAM(storOrder, 3)
這將擴大
myArray(POINT3D(i,j,k))
到
myArray(kParam, iParam, jParam)
。
幾乎在那裏!現在我的問題:
- 是否有可能做我想要使用C預處理器?
- 如果不是 - 你會用什麼技術? (我正在考慮製作我自己的專門的「預處理器」python腳本,但你有另一個建議嗎?)
感謝您的回答。有一些我還沒有提到:這應該是HPC的任務。如果訪問器可以被內聯並被編譯器擴展爲常量,那麼你的答案可能是適用的,否則它會損害性能。那麼我將不得不測試它。 –