mkl_dfti.f90 31 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770
  1. !===============================================================================
  2. ! Copyright 2002-2022 Intel Corporation.
  3. !
  4. ! This software and the related documents are Intel copyrighted materials, and
  5. ! your use of them is governed by the express license under which they were
  6. ! provided to you (License). Unless the License provides otherwise, you may not
  7. ! use, modify, copy, publish, distribute, disclose or transmit this software or
  8. ! the related documents without Intel's prior written permission.
  9. !
  10. ! This software and the related documents are provided as is, with no express
  11. ! or implied warranties, other than those that are expressly stated in the
  12. ! License.
  13. !===============================================================================
  14. ! Content:
  15. ! Intel(R) oneAPI Math Kernel Library (oneMKL)
  16. ! Discrete Fourier Transform Interface (DFTI)
  17. !*****************************************************************************
  18. MODULE MKL_DFT_TYPE
  19. TYPE, PUBLIC :: DFTI_DESCRIPTOR
  20. PRIVATE
  21. INTEGER :: dontuse
  22. ! Structure of this type is not used in Fortran code
  23. ! the pointer to this type is used only
  24. END TYPE DFTI_DESCRIPTOR
  25. !======================================================================
  26. ! These real type kind parameters are not for direct use
  27. !======================================================================
  28. INTEGER, PARAMETER :: DFTI_SPKP = SELECTED_REAL_KIND(6,37)
  29. INTEGER, PARAMETER :: DFTI_DPKP = SELECTED_REAL_KIND(15,307)
  30. !======================================================================
  31. ! Descriptor configuration parameters [default values in brackets]
  32. !======================================================================
  33. ! Domain for forward transform. No default value
  34. INTEGER, PARAMETER :: DFTI_FORWARD_DOMAIN = 0
  35. ! Dimensionality, or rank. No default value
  36. INTEGER, PARAMETER :: DFTI_DIMENSION = 1
  37. ! Length(s) of transform. No default value
  38. INTEGER, PARAMETER :: DFTI_LENGTHS = 2
  39. ! Floating point precision. No default value
  40. INTEGER, PARAMETER :: DFTI_PRECISION = 3
  41. ! Scale factor for forward transform [1.0]
  42. INTEGER, PARAMETER :: DFTI_FORWARD_SCALE = 4
  43. ! Scale factor for backward transform [1.0]
  44. INTEGER, PARAMETER :: DFTI_BACKWARD_SCALE = 5
  45. ! Exponent sign for forward transform [DFTI_NEGATIVE]
  46. ! INTEGER, PARAMETER :: DFTI_FORWARD_SIGN = 6 ! NOT IMPLEMENTED
  47. ! Number of data sets to be transformed [1]
  48. INTEGER, PARAMETER :: DFTI_NUMBER_OF_TRANSFORMS = 7
  49. ! Storage of finite complex-valued sequences in complex domain
  50. ! [DFTI_COMPLEX_COMPLEX]
  51. INTEGER, PARAMETER :: DFTI_COMPLEX_STORAGE = 8
  52. ! Storage of finite real-valued sequences in real domain
  53. ! [DFTI_REAL_REAL]
  54. INTEGER, PARAMETER :: DFTI_REAL_STORAGE = 9
  55. ! Storage of finite complex-valued sequences in conjugate-even
  56. ! domain [DFTI_COMPLEX_REAL]
  57. INTEGER, PARAMETER :: DFTI_CONJUGATE_EVEN_STORAGE = 10
  58. ! Placement of result [DFTI_INPLACE]
  59. INTEGER, PARAMETER :: DFTI_PLACEMENT = 11
  60. ! Generalized strides for input data layout
  61. ! [tight, col-major for Fortran]
  62. INTEGER, PARAMETER :: DFTI_INPUT_STRIDES = 12
  63. ! Generalized strides for output data layout
  64. ! [tight, col-major for Fortran]
  65. INTEGER, PARAMETER :: DFTI_OUTPUT_STRIDES = 13
  66. ! Distance between first input elements for multiple transforms [0]
  67. INTEGER, PARAMETER :: DFTI_INPUT_DISTANCE = 14
  68. ! Distance between first output elements for multiple transforms [0]
  69. INTEGER, PARAMETER :: DFTI_OUTPUT_DISTANCE = 15
  70. ! Effort spent in initialization [DFTI_MEDIUM]
  71. ! INTEGER, PARAMETER :: DFTI_INITIALIZATION_EFFORT = 16 ! NOT IMPLEMENTED
  72. ! Use of workspace during computation [DFTI_ALLOW]
  73. INTEGER, PARAMETER :: DFTI_WORKSPACE = 17
  74. ! Ordering of the result [DFTI_ORDERED]
  75. INTEGER, PARAMETER :: DFTI_ORDERING = 18
  76. ! Possible transposition of result [DFTI_NONE]
  77. INTEGER, PARAMETER :: DFTI_TRANSPOSE = 19
  78. ! User-settable descriptor name [""]
  79. INTEGER, PARAMETER :: DFTI_DESCRIPTOR_NAME = 20
  80. ! Packing format for DFTI_COMPLEX_REAL storage of finite
  81. ! conjugate-even sequences [DFTI_CCS_FORMAT]
  82. INTEGER, PARAMETER :: DFTI_PACKED_FORMAT = 21
  83. ! Commit status of the descriptor. Read-only parameter
  84. INTEGER, PARAMETER :: DFTI_COMMIT_STATUS = 22
  85. ! Version string for this DFTI implementation. Read-only parameter
  86. INTEGER, PARAMETER :: DFTI_VERSION = 23
  87. ! Ordering of the forward transform. Read-only parameter
  88. ! INTEGER, PARAMETER :: DFTI_FORWARD_ORDERING = 24 ! NOT IMPLEMENTED
  89. ! Ordering of the backward transform. Read-only parameter
  90. ! INTEGER, PARAMETER :: DFTI_BACKWARD_ORDERING = 25 ! NOT IMPLEMENTED
  91. ! Number of user threads that share the descriptor [1]
  92. INTEGER, PARAMETER :: DFTI_NUMBER_OF_USER_THREADS = 26
  93. ! Limit the number of threads used by this descriptor [0 = don't care]
  94. INTEGER, PARAMETER :: DFTI_THREAD_LIMIT = 27
  95. !======================================================================
  96. ! Values of the descriptor configuration parameters
  97. !======================================================================
  98. ! DFTI_COMMIT_STATUS
  99. INTEGER, PARAMETER :: DFTI_COMMITTED = 30
  100. INTEGER, PARAMETER :: DFTI_UNCOMMITTED = 31
  101. ! DFTI_FORWARD_DOMAIN
  102. INTEGER, PARAMETER :: DFTI_COMPLEX = 32
  103. INTEGER, PARAMETER :: DFTI_REAL = 33
  104. ! INTEGER, PARAMETER :: DFTI_CONJUGATE_EVEN = 34 ! NOT IMPLEMENTED
  105. ! DFTI_PRECISION
  106. INTEGER, PARAMETER :: DFTI_SINGLE = 35
  107. INTEGER, PARAMETER :: DFTI_DOUBLE = 36
  108. ! DFTI_PRECISION for reduced size of statically linked application.
  109. ! Recommended use: modify statement 'USE MKL_DFTI' in your program,
  110. ! so that it reads as either of:
  111. ! USE MKL_DFTI, FORGET=>DFTI_SINGLE, DFTI_SINGLE=>DFTI_SINGLE_R
  112. ! USE MKL_DFTI, FORGET=>DFTI_DOUBLE, DFTI_DOUBLE=>DFTI_DOUBLE_R
  113. ! where word 'FORGET' can be any name not used in the program.
  114. REAL(DFTI_SPKP), PARAMETER :: DFTI_SINGLE_R = REAL(35)
  115. REAL(DFTI_DPKP), PARAMETER :: DFTI_DOUBLE_R = REAL(36)
  116. ! DFTI_FORWARD_SIGN
  117. ! INTEGER, PARAMETER :: DFTI_NEGATIVE = 37 ! NOT IMPLEMENTED
  118. ! INTEGER, PARAMETER :: DFTI_POSITIVE = 38 ! NOT IMPLEMENTED
  119. ! DFTI_COMPLEX_STORAGE and DFTI_CONJUGATE_EVEN_STORAGE
  120. INTEGER, PARAMETER :: DFTI_COMPLEX_COMPLEX = 39
  121. INTEGER, PARAMETER :: DFTI_COMPLEX_REAL = 40
  122. ! DFTI_REAL_STORAGE
  123. INTEGER, PARAMETER :: DFTI_REAL_COMPLEX = 41
  124. INTEGER, PARAMETER :: DFTI_REAL_REAL = 42
  125. ! DFTI_PLACEMENT
  126. INTEGER, PARAMETER :: DFTI_INPLACE = 43 ! Result overwrites input
  127. INTEGER, PARAMETER :: DFTI_NOT_INPLACE = 44 ! Have another place for result
  128. ! DFTI_INITIALIZATION_EFFORT
  129. ! INTEGER, PARAMETER :: DFTI_LOW = 45 ! NOT IMPLEMENTED
  130. ! INTEGER, PARAMETER :: DFTI_MEDIUM = 46 ! NOT IMPLEMENTED
  131. ! INTEGER, PARAMETER :: DFTI_HIGH = 47 ! NOT IMPLEMENTED
  132. ! DFTI_ORDERING
  133. INTEGER, PARAMETER :: DFTI_ORDERED = 48
  134. INTEGER, PARAMETER :: DFTI_BACKWARD_SCRAMBLED = 49
  135. ! INTEGER, PARAMETER :: DFTI_FORWARD_SCRAMBLED = 50 ! NOT IMPLEMENTED
  136. ! Allow/avoid certain usages
  137. INTEGER, PARAMETER :: DFTI_ALLOW = 51 ! Allow transposition or workspace
  138. INTEGER, PARAMETER :: DFTI_AVOID = 52 ! Avoid auxiliary storage
  139. INTEGER, PARAMETER :: DFTI_NONE = 53
  140. ! DFTI_PACKED_FORMAT
  141. ! (for storing congugate-even finite sequence in real array)
  142. INTEGER, PARAMETER :: DFTI_CCS_FORMAT = 54 ! Complex conjugate-symmetric
  143. INTEGER, PARAMETER :: DFTI_PACK_FORMAT = 55 ! Pack format for real DFT
  144. INTEGER, PARAMETER :: DFTI_PERM_FORMAT = 56 ! Perm format for real DFT
  145. INTEGER, PARAMETER :: DFTI_CCE_FORMAT = 57 ! Complex conjugate-even
  146. !======================================================================
  147. ! Error classes
  148. !======================================================================
  149. INTEGER, PARAMETER :: DFTI_NO_ERROR = 0
  150. INTEGER, PARAMETER :: DFTI_MEMORY_ERROR = 1
  151. INTEGER, PARAMETER :: DFTI_INVALID_CONFIGURATION = 2
  152. INTEGER, PARAMETER :: DFTI_INCONSISTENT_CONFIGURATION = 3
  153. INTEGER, PARAMETER :: DFTI_MULTITHREADED_ERROR = 4
  154. INTEGER, PARAMETER :: DFTI_BAD_DESCRIPTOR = 5
  155. INTEGER, PARAMETER :: DFTI_UNIMPLEMENTED = 6
  156. INTEGER, PARAMETER :: DFTI_MKL_INTERNAL_ERROR = 7
  157. INTEGER, PARAMETER :: DFTI_NUMBER_OF_THREADS_ERROR = 8
  158. INTEGER, PARAMETER :: DFTI_1D_LENGTH_EXCEEDS_INT32 = 9
  159. INTEGER, PARAMETER :: DFTI_1D_MEMORY_EXCEEDS_INT32 = 9
  160. ! Maximum length of error string
  161. INTEGER, PARAMETER :: DFTI_MAX_MESSAGE_LENGTH = 80
  162. ! Maximum length of user-settable descriptor name
  163. INTEGER, PARAMETER :: DFTI_MAX_NAME_LENGTH = 10
  164. ! Maximum length of oneMKL version string
  165. INTEGER, PARAMETER :: DFTI_VERSION_LENGTH = 198
  166. END MODULE MKL_DFT_TYPE
  167. MODULE MKL_DFTI
  168. USE MKL_DFT_TYPE
  169. INTERFACE DftiCreateDescriptor
  170. ! overloading of DftiCreateDescriptor for 1D DFT
  171. FUNCTION dfti_create_descriptor_1d(desc, precision, domain, dim, length)
  172. USE MKL_DFT_TYPE
  173. !DEC$ ATTRIBUTES C :: dfti_create_descriptor_1d
  174. !DEC$ ATTRIBUTES REFERENCE :: dfti_create_descriptor_1d
  175. INTEGER dfti_create_descriptor_1d
  176. TYPE(DFTI_DESCRIPTOR), POINTER :: desc
  177. INTEGER, INTENT(IN) :: precision
  178. INTEGER, INTENT(IN) :: domain
  179. INTEGER, INTENT(IN) :: dim, length
  180. END FUNCTION dfti_create_descriptor_1d
  181. ! overloading of DftiCreateDescriptor for nD DFT
  182. FUNCTION dfti_create_descriptor_highd(desc, precision, domain, dim,length)
  183. USE MKL_DFT_TYPE
  184. !DEC$ ATTRIBUTES C :: dfti_create_descriptor_highd
  185. !DEC$ ATTRIBUTES REFERENCE :: dfti_create_descriptor_highd
  186. INTEGER dfti_create_descriptor_highd
  187. TYPE(DFTI_DESCRIPTOR), POINTER :: desc
  188. INTEGER, INTENT(IN) :: precision
  189. INTEGER, INTENT(IN) :: domain
  190. INTEGER, INTENT(IN) :: dim
  191. INTEGER, INTENT(IN), DIMENSION(*) :: length
  192. END FUNCTION dfti_create_descriptor_highd
  193. ! overloading of DftiCreateDescriptor for SP 1D DFT
  194. ! second parameter (precision) should be any REAL*4 value
  195. ! for dispatching during compile time
  196. FUNCTION dfti_create_descriptor_s_1d(desc, s, dom, one, dim)
  197. USE MKL_DFT_TYPE
  198. !DEC$ ATTRIBUTES C :: dfti_create_descriptor_s_1d
  199. !DEC$ ATTRIBUTES REFERENCE :: dfti_create_descriptor_s_1d
  200. INTEGER dfti_create_descriptor_s_1d
  201. TYPE(DFTI_DESCRIPTOR), POINTER :: desc
  202. REAL(DFTI_SPKP), INTENT(IN) :: s
  203. INTEGER, INTENT(IN) :: dom
  204. INTEGER, INTENT(IN) :: one
  205. INTEGER, INTENT(IN) :: dim
  206. END FUNCTION dfti_create_descriptor_s_1d
  207. ! overloading of DftiCreateDescriptor for SP nD DFT
  208. ! second parameter (precision) should be any REAL*4 value
  209. ! for dispatching during compile time
  210. FUNCTION dfti_create_descriptor_s_md(desc, s, dom, many, dims)
  211. USE MKL_DFT_TYPE
  212. !DEC$ ATTRIBUTES C :: dfti_create_descriptor_s_md
  213. !DEC$ ATTRIBUTES REFERENCE :: dfti_create_descriptor_s_md
  214. INTEGER dfti_create_descriptor_s_md
  215. TYPE(DFTI_DESCRIPTOR), POINTER :: desc
  216. REAL(DFTI_SPKP), INTENT(IN) :: s
  217. INTEGER, INTENT(IN) :: dom
  218. INTEGER, INTENT(IN) :: many
  219. INTEGER, INTENT(IN), DIMENSION(*) :: dims
  220. END FUNCTION dfti_create_descriptor_s_md
  221. ! overloading of DftiCreateDescriptor for DP 1D DFT
  222. ! second parameter (precision) should be any REAL*8 value
  223. ! for dispatching during compile time
  224. FUNCTION dfti_create_descriptor_d_1d(desc, d, dom, one, dim)
  225. USE MKL_DFT_TYPE
  226. !DEC$ ATTRIBUTES C :: dfti_create_descriptor_d_1d
  227. !DEC$ ATTRIBUTES REFERENCE :: dfti_create_descriptor_d_1d
  228. INTEGER dfti_create_descriptor_d_1d
  229. TYPE(DFTI_DESCRIPTOR), POINTER :: desc
  230. REAL(DFTI_DPKP), INTENT(IN) :: d
  231. INTEGER, INTENT(IN) :: dom
  232. INTEGER, INTENT(IN) :: one
  233. INTEGER, INTENT(IN) :: dim
  234. END FUNCTION dfti_create_descriptor_d_1d
  235. ! overloading of DftiCreateDescriptor for DP nD DFT
  236. ! second parameter (precision) should be any REAL*8 value
  237. ! for dispatching during compile time
  238. FUNCTION dfti_create_descriptor_d_md(desc, d, dom, many, dims)
  239. USE MKL_DFT_TYPE
  240. !DEC$ ATTRIBUTES C :: dfti_create_descriptor_d_md
  241. !DEC$ ATTRIBUTES REFERENCE :: dfti_create_descriptor_d_md
  242. INTEGER dfti_create_descriptor_d_md
  243. TYPE(DFTI_DESCRIPTOR), POINTER :: desc
  244. REAL(DFTI_DPKP), INTENT(IN) :: d
  245. INTEGER, INTENT(IN) :: dom
  246. INTEGER, INTENT(IN) :: many
  247. INTEGER, INTENT(IN), DIMENSION(*) :: dims
  248. END FUNCTION dfti_create_descriptor_d_md
  249. END INTERFACE
  250. INTERFACE DftiCopyDescriptor
  251. FUNCTION dfti_copy_descriptor_external(desc, new_desc)
  252. USE MKL_DFT_TYPE
  253. !DEC$ ATTRIBUTES C :: dfti_copy_descriptor_external
  254. !DEC$ ATTRIBUTES REFERENCE :: dfti_copy_descriptor_external
  255. INTEGER dfti_copy_descriptor_external
  256. TYPE(DFTI_DESCRIPTOR), POINTER :: desc
  257. TYPE(DFTI_DESCRIPTOR), POINTER :: new_desc
  258. END FUNCTION dfti_copy_descriptor_external
  259. END INTERFACE
  260. INTERFACE DftiCommitDescriptor
  261. FUNCTION dfti_commit_descriptor_external(desc)
  262. USE MKL_DFT_TYPE
  263. !DEC$ ATTRIBUTES C :: dfti_commit_descriptor_external
  264. !DEC$ ATTRIBUTES REFERENCE :: dfti_commit_descriptor_external
  265. INTEGER dfti_commit_descriptor_external
  266. TYPE(DFTI_DESCRIPTOR), POINTER :: desc
  267. END FUNCTION dfti_commit_descriptor_external
  268. END INTERFACE
  269. INTERFACE DftiSetValue
  270. ! overloading of DftiSetValue for integer value
  271. FUNCTION dfti_set_value_intval(desc, OptName, IntVal)
  272. USE MKL_DFT_TYPE
  273. !DEC$ ATTRIBUTES C :: dfti_set_value_intval
  274. !DEC$ ATTRIBUTES REFERENCE :: dfti_set_value_intval
  275. INTEGER dfti_set_value_intval
  276. INTEGER, INTENT(IN) :: OptName
  277. INTEGER, INTENT(IN) :: IntVal
  278. TYPE(DFTI_DESCRIPTOR), POINTER :: desc
  279. END FUNCTION dfti_set_value_intval
  280. ! overloading of DftiSetValue for SP value
  281. FUNCTION dfti_set_value_sglval(desc, OptName, sglval)
  282. USE MKL_DFT_TYPE
  283. !DEC$ ATTRIBUTES C :: dfti_set_value_sglval
  284. !DEC$ ATTRIBUTES REFERENCE :: dfti_set_value_sglval
  285. INTEGER dfti_set_value_sglval
  286. INTEGER, INTENT(IN) :: OptName
  287. REAL(DFTI_SPKP), INTENT(IN) :: sglval
  288. TYPE(DFTI_DESCRIPTOR), POINTER :: desc
  289. END FUNCTION dfti_set_value_sglval
  290. ! overloading of DftiSetValue for DP value
  291. FUNCTION dfti_set_value_dblval(desc, OptName, DblVal)
  292. USE MKL_DFT_TYPE
  293. !DEC$ ATTRIBUTES C :: dfti_set_value_dblval
  294. !DEC$ ATTRIBUTES REFERENCE :: dfti_set_value_dblval
  295. INTEGER dfti_set_value_dblval
  296. INTEGER, INTENT(IN) :: OptName
  297. REAL(DFTI_DPKP), INTENT(IN) :: DblVal
  298. TYPE(DFTI_DESCRIPTOR), POINTER :: desc
  299. END FUNCTION dfti_set_value_dblval
  300. ! overloading of DftiSetValue for integer vector
  301. FUNCTION dfti_set_value_intvec(desc, OptName, IntVec)
  302. USE MKL_DFT_TYPE
  303. !DEC$ ATTRIBUTES C :: dfti_set_value_intvec
  304. !DEC$ ATTRIBUTES REFERENCE :: dfti_set_value_intvec
  305. INTEGER dfti_set_value_intvec
  306. INTEGER, INTENT(IN) :: OptName
  307. INTEGER, INTENT(IN), DIMENSION(*) :: IntVec
  308. TYPE(DFTI_DESCRIPTOR), POINTER :: desc
  309. END FUNCTION dfti_set_value_intvec
  310. ! overloading of DftiSetValue for char vector
  311. FUNCTION dfti_set_value_chars(desc, OptName, Chars)
  312. USE MKL_DFT_TYPE
  313. !DEC$ ATTRIBUTES C :: dfti_set_value_chars
  314. !DEC$ ATTRIBUTES REFERENCE :: dfti_set_value_chars
  315. INTEGER dfti_set_value_chars
  316. INTEGER, INTENT(IN) :: OptName
  317. CHARACTER(*), INTENT(IN) :: Chars
  318. TYPE(DFTI_DESCRIPTOR), POINTER :: desc
  319. END FUNCTION dfti_set_value_chars
  320. END INTERFACE
  321. INTERFACE DftiGetValue
  322. ! overloading of DftiGetValue for integer value
  323. FUNCTION dfti_get_value_intval(desc, OptName, IntVal)
  324. USE MKL_DFT_TYPE
  325. !DEC$ ATTRIBUTES C :: dfti_get_value_intval
  326. !DEC$ ATTRIBUTES REFERENCE :: dfti_get_value_intval
  327. INTEGER dfti_get_value_intval
  328. INTEGER, INTENT(IN) :: OptName
  329. INTEGER, INTENT(OUT) :: IntVal
  330. TYPE(DFTI_DESCRIPTOR), POINTER :: desc
  331. END FUNCTION dfti_get_value_intval
  332. ! overloading of DftiGetValue for SP value
  333. FUNCTION dfti_get_value_sglval(desc, OptName, sglval)
  334. USE MKL_DFT_TYPE
  335. !DEC$ ATTRIBUTES C :: dfti_get_value_sglval
  336. !DEC$ ATTRIBUTES REFERENCE :: dfti_get_value_sglval
  337. INTEGER dfti_get_value_sglval
  338. INTEGER, INTENT(IN) :: OptName
  339. REAL(DFTI_SPKP), INTENT(OUT) :: sglval
  340. TYPE(DFTI_DESCRIPTOR), POINTER :: desc
  341. END FUNCTION dfti_get_value_sglval
  342. ! overloading of DftiGetValue for DP value
  343. FUNCTION dfti_get_value_dblval(desc, OptName, DblVal)
  344. USE MKL_DFT_TYPE
  345. !DEC$ ATTRIBUTES C :: dfti_get_value_dblval
  346. !DEC$ ATTRIBUTES REFERENCE :: dfti_get_value_dblval
  347. INTEGER dfti_get_value_dblval
  348. INTEGER, INTENT(IN) :: OptName
  349. REAL(DFTI_DPKP), INTENT(OUT) :: DblVal
  350. TYPE(DFTI_DESCRIPTOR), POINTER :: desc
  351. END FUNCTION dfti_get_value_dblval
  352. ! overloading of DftiGetValue for integer vector
  353. FUNCTION dfti_get_value_intvec(desc, OptName, IntVec)
  354. USE MKL_DFT_TYPE
  355. !DEC$ ATTRIBUTES C :: dfti_get_value_intvec
  356. !DEC$ ATTRIBUTES REFERENCE :: dfti_get_value_intvec
  357. INTEGER dfti_get_value_intvec
  358. INTEGER, INTENT(IN) :: OptName
  359. INTEGER, INTENT(OUT), DIMENSION(*) :: IntVec
  360. TYPE(DFTI_DESCRIPTOR), POINTER :: desc
  361. END FUNCTION dfti_get_value_intvec
  362. ! overloading of DftiGetValue for char vector
  363. FUNCTION dfti_get_value_chars(desc, OptName, Chars)
  364. USE MKL_DFT_TYPE
  365. !DEC$ ATTRIBUTES C :: dfti_get_value_chars
  366. !DEC$ ATTRIBUTES REFERENCE :: dfti_get_value_chars
  367. INTEGER dfti_get_value_chars
  368. INTEGER, INTENT(IN) :: OptName
  369. CHARACTER(*), INTENT(OUT) :: Chars
  370. TYPE(DFTI_DESCRIPTOR), POINTER :: desc
  371. END FUNCTION dfti_get_value_chars
  372. END INTERFACE
  373. INTERFACE DftiComputeForward
  374. ! overloading of DftiComputeForward for SP R2C DFT (inplace)
  375. FUNCTION dfti_compute_forward_s(desc,sSrcDst)
  376. USE MKL_DFT_TYPE
  377. !DEC$ ATTRIBUTES C :: dfti_compute_forward_s
  378. !DEC$ ATTRIBUTES REFERENCE :: dfti_compute_forward_s
  379. INTEGER dfti_compute_forward_s
  380. TYPE(DFTI_DESCRIPTOR), POINTER :: desc
  381. REAL(DFTI_SPKP), INTENT(INOUT), DIMENSION(*) :: sSrcDst
  382. END FUNCTION dfti_compute_forward_s
  383. ! overloading of DftiComputeForward for SP C2C DFT (inplace)
  384. FUNCTION dfti_compute_forward_c(desc,cSrcDst)
  385. USE MKL_DFT_TYPE
  386. !DEC$ ATTRIBUTES C :: dfti_compute_forward_c
  387. !DEC$ ATTRIBUTES REFERENCE :: dfti_compute_forward_c
  388. INTEGER dfti_compute_forward_c
  389. TYPE(DFTI_DESCRIPTOR), POINTER :: desc
  390. COMPLEX(DFTI_SPKP), INTENT(INOUT), DIMENSION(*) :: cSrcDst
  391. END FUNCTION dfti_compute_forward_c
  392. ! overloading of DftiComputeForward for SP C2C DFT (inplace, split complex)
  393. FUNCTION dfti_compute_forward_ss(desc,sSrcDstRe,sSrcDstIm)
  394. USE MKL_DFT_TYPE
  395. !DEC$ ATTRIBUTES C :: dfti_compute_forward_ss
  396. !DEC$ ATTRIBUTES REFERENCE :: dfti_compute_forward_ss
  397. INTEGER dfti_compute_forward_ss
  398. TYPE(DFTI_DESCRIPTOR), POINTER :: desc
  399. REAL(DFTI_SPKP), DIMENSION(*) :: sSrcDstRe
  400. REAL(DFTI_SPKP), DIMENSION(*) :: sSrcDstIm
  401. END FUNCTION dfti_compute_forward_ss
  402. ! overloading of DftiComputeForward for SP R2C DFT (out-of-place)
  403. FUNCTION dfti_compute_forward_sc(desc,sSrc,cDst)
  404. USE MKL_DFT_TYPE
  405. !DEC$ ATTRIBUTES C :: dfti_compute_forward_sc
  406. !DEC$ ATTRIBUTES REFERENCE :: dfti_compute_forward_sc
  407. INTEGER dfti_compute_forward_sc
  408. TYPE(DFTI_DESCRIPTOR), POINTER :: desc
  409. REAL(DFTI_SPKP), INTENT(IN), DIMENSION(*) :: sSrc
  410. COMPLEX(DFTI_SPKP), INTENT(OUT), DIMENSION(*) :: cDst
  411. END FUNCTION dfti_compute_forward_sc
  412. ! overloading of DftiComputeForward for SP C2C DFT (out-of-place)
  413. FUNCTION dfti_compute_forward_cc(desc,cSrc,cDst)
  414. USE MKL_DFT_TYPE
  415. !DEC$ ATTRIBUTES C :: dfti_compute_forward_cc
  416. !DEC$ ATTRIBUTES REFERENCE :: dfti_compute_forward_cc
  417. INTEGER dfti_compute_forward_cc
  418. TYPE(DFTI_DESCRIPTOR), POINTER :: desc
  419. COMPLEX(DFTI_SPKP), INTENT(IN), DIMENSION(*) :: cSrc
  420. COMPLEX(DFTI_SPKP), INTENT(OUT), DIMENSION(*) :: cDst
  421. END FUNCTION dfti_compute_forward_cc
  422. ! overloading of DftiComputeForward for SP C2C DFT (out-of-place, split
  423. ! complex)
  424. FUNCTION dfti_compute_forward_ssss(desc,sSrcRe,sSrcIm,sDstRe,sDstIm)
  425. USE MKL_DFT_TYPE
  426. !DEC$ ATTRIBUTES C :: dfti_compute_forward_ssss
  427. !DEC$ ATTRIBUTES REFERENCE :: dfti_compute_forward_ssss
  428. INTEGER dfti_compute_forward_ssss
  429. TYPE(DFTI_DESCRIPTOR), POINTER :: desc
  430. REAL(DFTI_SPKP), INTENT(IN), DIMENSION(*) :: sSrcRe
  431. REAL(DFTI_SPKP), INTENT(IN), DIMENSION(*) :: sSrcIm
  432. REAL(DFTI_SPKP), INTENT(OUT), DIMENSION(*) :: sDstRe
  433. REAL(DFTI_SPKP), INTENT(OUT), DIMENSION(*) :: sDstIm
  434. END FUNCTION dfti_compute_forward_ssss
  435. ! overloading of DftiComputeForward for DP R2C DFT (inplace)
  436. FUNCTION dfti_compute_forward_d(desc,dSrcDst)
  437. USE MKL_DFT_TYPE
  438. !DEC$ ATTRIBUTES C :: dfti_compute_forward_d
  439. !DEC$ ATTRIBUTES REFERENCE :: dfti_compute_forward_d
  440. INTEGER dfti_compute_forward_d
  441. TYPE(DFTI_DESCRIPTOR), POINTER :: desc
  442. REAL(DFTI_DPKP), INTENT(INOUT), DIMENSION(*) :: dSrcDst
  443. END FUNCTION dfti_compute_forward_d
  444. ! overloading of DftiComputeForward for DP C2C DFT (inplace)
  445. FUNCTION dfti_compute_forward_z(desc,zSrcDst)
  446. USE MKL_DFT_TYPE
  447. !DEC$ ATTRIBUTES C :: dfti_compute_forward_z
  448. !DEC$ ATTRIBUTES REFERENCE :: dfti_compute_forward_z
  449. INTEGER dfti_compute_forward_z
  450. TYPE(DFTI_DESCRIPTOR), POINTER :: desc
  451. COMPLEX(DFTI_DPKP), INTENT(INOUT), DIMENSION(*) :: zSrcDst
  452. END FUNCTION dfti_compute_forward_z
  453. ! overloading of DftiComputeForward for DP C2C DFT (inplace, split complex)
  454. FUNCTION dfti_compute_forward_dd(desc,dSrcDstRe,dSrcDstIm)
  455. USE MKL_DFT_TYPE
  456. !DEC$ ATTRIBUTES C :: dfti_compute_forward_dd
  457. !DEC$ ATTRIBUTES REFERENCE :: dfti_compute_forward_dd
  458. INTEGER dfti_compute_forward_dd
  459. TYPE(DFTI_DESCRIPTOR), POINTER :: desc
  460. REAL(DFTI_DPKP), DIMENSION(*) :: dSrcDstRe
  461. REAL(DFTI_DPKP), DIMENSION(*) :: dSrcDstIm
  462. END FUNCTION dfti_compute_forward_dd
  463. ! overloading of DftiComputeForward for DP R2C DFT (out-of-place)
  464. FUNCTION dfti_compute_forward_dz(desc,dSrc,zDst)
  465. USE MKL_DFT_TYPE
  466. !DEC$ ATTRIBUTES C :: dfti_compute_forward_dz
  467. !DEC$ ATTRIBUTES REFERENCE :: dfti_compute_forward_dz
  468. INTEGER dfti_compute_forward_dz
  469. TYPE(DFTI_DESCRIPTOR), POINTER :: desc
  470. REAL(DFTI_DPKP), INTENT(IN), DIMENSION(*) :: dSrc
  471. COMPLEX(DFTI_DPKP), INTENT(OUT), DIMENSION(*) :: zDst
  472. END FUNCTION dfti_compute_forward_dz
  473. ! overloading of DftiComputeForward for DP C2C DFT (out-of-place)
  474. FUNCTION dfti_compute_forward_zz(desc,zSrc,zDst)
  475. USE MKL_DFT_TYPE
  476. !DEC$ ATTRIBUTES C :: dfti_compute_forward_zz
  477. !DEC$ ATTRIBUTES REFERENCE :: dfti_compute_forward_zz
  478. INTEGER dfti_compute_forward_zz
  479. TYPE(DFTI_DESCRIPTOR), POINTER :: desc
  480. COMPLEX(DFTI_DPKP), INTENT(IN), DIMENSION(*) :: zSrc
  481. COMPLEX(DFTI_DPKP), INTENT(OUT), DIMENSION(*) :: zDst
  482. END FUNCTION dfti_compute_forward_zz
  483. ! overloading of DftiComputeForward for DP C2C DFT (out-of-place, split
  484. ! complex)
  485. FUNCTION dfti_compute_forward_dddd(desc,dSrcRe,dSrcIm,dDstRe,dDstIm)
  486. USE MKL_DFT_TYPE
  487. !DEC$ ATTRIBUTES C :: dfti_compute_forward_dddd
  488. !DEC$ ATTRIBUTES REFERENCE :: dfti_compute_forward_dddd
  489. INTEGER dfti_compute_forward_dddd
  490. TYPE(DFTI_DESCRIPTOR), POINTER :: desc
  491. REAL(DFTI_DPKP), INTENT(IN), DIMENSION(*) :: dSrcRe
  492. REAL(DFTI_DPKP), INTENT(IN), DIMENSION(*) :: dSrcIm
  493. REAL(DFTI_DPKP), INTENT(OUT), DIMENSION(*) :: dDstRe
  494. REAL(DFTI_DPKP), INTENT(OUT), DIMENSION(*) :: dDstIm
  495. END FUNCTION dfti_compute_forward_dddd
  496. END INTERFACE DftiComputeForward
  497. INTERFACE DftiComputeBackward
  498. ! overloading of DftiComputeBackward for SP C2R DFT (inplace)
  499. FUNCTION dfti_compute_backward_s(desc,sSrcDst)
  500. USE MKL_DFT_TYPE
  501. !DEC$ ATTRIBUTES C :: dfti_compute_backward_s
  502. !DEC$ ATTRIBUTES REFERENCE :: dfti_compute_backward_s
  503. INTEGER dfti_compute_backward_s
  504. TYPE(DFTI_DESCRIPTOR), POINTER :: desc
  505. REAL(DFTI_SPKP), INTENT(INOUT), DIMENSION(*) :: sSrcDst
  506. END FUNCTION dfti_compute_backward_s
  507. ! overloading of DftiComputeBackward for SP C2C DFT (inplace)
  508. FUNCTION dfti_compute_backward_c(desc,cSrcDst)
  509. USE MKL_DFT_TYPE
  510. !DEC$ ATTRIBUTES C :: dfti_compute_backward_c
  511. !DEC$ ATTRIBUTES REFERENCE :: dfti_compute_backward_c
  512. INTEGER dfti_compute_backward_c
  513. TYPE(DFTI_DESCRIPTOR), POINTER :: desc
  514. COMPLEX(DFTI_SPKP), INTENT(INOUT), DIMENSION(*) :: cSrcDst
  515. END FUNCTION dfti_compute_backward_c
  516. ! overloading of DftiComputeBackward for SP C2C DFT (inplace, split complex)
  517. FUNCTION dfti_compute_backward_ss(desc,sSrcDstRe,sSrcDstIm)
  518. USE MKL_DFT_TYPE
  519. !DEC$ ATTRIBUTES C :: dfti_compute_backward_ss
  520. !DEC$ ATTRIBUTES REFERENCE :: dfti_compute_backward_ss
  521. INTEGER dfti_compute_backward_ss
  522. TYPE(DFTI_DESCRIPTOR), POINTER :: desc
  523. REAL(DFTI_SPKP), DIMENSION(*) :: sSrcDstRe
  524. REAL(DFTI_SPKP), DIMENSION(*) :: sSrcDstIm
  525. END FUNCTION dfti_compute_backward_ss
  526. ! overloading of DftiComputeBackward for SP C2R DFT (out-of-place)
  527. FUNCTION dfti_compute_backward_cs(desc,cSrc,sDst)
  528. USE MKL_DFT_TYPE
  529. !DEC$ ATTRIBUTES C :: dfti_compute_backward_cs
  530. !DEC$ ATTRIBUTES REFERENCE :: dfti_compute_backward_cs
  531. INTEGER dfti_compute_backward_cs
  532. TYPE(DFTI_DESCRIPTOR), POINTER :: desc
  533. COMPLEX(DFTI_SPKP), INTENT(IN), DIMENSION(*) :: cSrc
  534. REAL(DFTI_SPKP), INTENT(OUT), DIMENSION(*) :: sDst
  535. END FUNCTION dfti_compute_backward_cs
  536. ! overloading of DftiComputeBackward for SP C2C DFT (out-of-place)
  537. FUNCTION dfti_compute_backward_cc(desc,cSrc,cDst)
  538. USE MKL_DFT_TYPE
  539. !DEC$ ATTRIBUTES C :: dfti_compute_backward_cc
  540. !DEC$ ATTRIBUTES REFERENCE :: dfti_compute_backward_cc
  541. INTEGER dfti_compute_backward_cc
  542. TYPE(DFTI_DESCRIPTOR), POINTER :: desc
  543. COMPLEX(DFTI_SPKP), INTENT(IN), DIMENSION(*) :: cSrc
  544. COMPLEX(DFTI_SPKP), INTENT(OUT), DIMENSION(*) :: cDst
  545. END FUNCTION dfti_compute_backward_cc
  546. ! overloading of DftiComputeBackward for SP C2C DFT (out-of-place, split
  547. ! complex)
  548. FUNCTION dfti_compute_backward_ssss(desc,sSrcRe,sSrcIm,sDstRe,sDstIm)
  549. USE MKL_DFT_TYPE
  550. !DEC$ ATTRIBUTES C :: dfti_compute_backward_ssss
  551. !DEC$ ATTRIBUTES REFERENCE :: dfti_compute_backward_ssss
  552. INTEGER dfti_compute_backward_ssss
  553. TYPE(DFTI_DESCRIPTOR), POINTER :: desc
  554. REAL(DFTI_SPKP), INTENT(IN), DIMENSION(*) :: sSrcRe
  555. REAL(DFTI_SPKP), INTENT(IN), DIMENSION(*) :: sSrcIm
  556. REAL(DFTI_SPKP), INTENT(OUT), DIMENSION(*) :: sDstRe
  557. REAL(DFTI_SPKP), INTENT(OUT), DIMENSION(*) :: sDstIm
  558. END FUNCTION dfti_compute_backward_ssss
  559. ! overloading of DftiComputeBackward for DP C2R DFT (inplace)
  560. FUNCTION dfti_compute_backward_d(desc,dSrcDst)
  561. USE MKL_DFT_TYPE
  562. !DEC$ ATTRIBUTES C :: dfti_compute_backward_d
  563. !DEC$ ATTRIBUTES REFERENCE :: dfti_compute_backward_d
  564. INTEGER dfti_compute_backward_d
  565. TYPE(DFTI_DESCRIPTOR), POINTER :: desc
  566. REAL(DFTI_DPKP), INTENT(INOUT), DIMENSION(*) :: dSrcDst
  567. END FUNCTION dfti_compute_backward_d
  568. ! overloading of DftiComputeBackward for DP C2C DFT (inplace)
  569. FUNCTION dfti_compute_backward_z(desc,zSrcDst)
  570. USE MKL_DFT_TYPE
  571. !DEC$ ATTRIBUTES C :: dfti_compute_backward_z
  572. !DEC$ ATTRIBUTES REFERENCE :: dfti_compute_backward_z
  573. INTEGER dfti_compute_backward_z
  574. TYPE(DFTI_DESCRIPTOR), POINTER :: desc
  575. COMPLEX(DFTI_DPKP), INTENT(INOUT), DIMENSION(*) :: zSrcDst
  576. END FUNCTION dfti_compute_backward_z
  577. ! overloading of DftiComputeBackward for DP C2C DFT (inplace, split complex)
  578. FUNCTION dfti_compute_backward_dd(desc,dSrcDstRe,dSrcDstIm)
  579. USE MKL_DFT_TYPE
  580. !DEC$ ATTRIBUTES C :: dfti_compute_backward_dd
  581. !DEC$ ATTRIBUTES REFERENCE :: dfti_compute_backward_dd
  582. INTEGER dfti_compute_backward_dd
  583. TYPE(DFTI_DESCRIPTOR), POINTER :: desc
  584. REAL(DFTI_DPKP), DIMENSION(*) :: dSrcDstRe
  585. REAL(DFTI_DPKP), DIMENSION(*) :: dSrcDstIm
  586. END FUNCTION dfti_compute_backward_dd
  587. ! overloading of DftiComputeBackward for DP C2R DFT (out-of-place)
  588. FUNCTION dfti_compute_backward_zd(desc,zSrc,dDst)
  589. USE MKL_DFT_TYPE
  590. !DEC$ ATTRIBUTES C :: dfti_compute_backward_zd
  591. !DEC$ ATTRIBUTES REFERENCE :: dfti_compute_backward_zd
  592. INTEGER dfti_compute_backward_zd
  593. TYPE(DFTI_DESCRIPTOR), POINTER :: desc
  594. COMPLEX(DFTI_DPKP), INTENT(IN), DIMENSION(*) :: zSrc
  595. REAL(DFTI_DPKP), INTENT(OUT), DIMENSION(*) :: dDst
  596. END FUNCTION dfti_compute_backward_zd
  597. ! overloading of DftiComputeBackward for DP C2C DFT (out-of-place)
  598. FUNCTION dfti_compute_backward_zz(desc,zSrc,zDst)
  599. USE MKL_DFT_TYPE
  600. !DEC$ ATTRIBUTES C :: dfti_compute_backward_zz
  601. !DEC$ ATTRIBUTES REFERENCE :: dfti_compute_backward_zz
  602. INTEGER dfti_compute_backward_zz
  603. TYPE(DFTI_DESCRIPTOR), POINTER :: desc
  604. COMPLEX(DFTI_DPKP), INTENT(IN), DIMENSION(*) :: zSrc
  605. COMPLEX(DFTI_DPKP), INTENT(OUT), DIMENSION(*) :: zDst
  606. END FUNCTION dfti_compute_backward_zz
  607. ! overloading of DftiComputeBackward for DP C2C DFT (out-of-place, split
  608. ! complex)
  609. FUNCTION dfti_compute_backward_dddd(desc,dSrcRe,dSrcIm,dDstRe,dDstIm)
  610. USE MKL_DFT_TYPE
  611. !DEC$ ATTRIBUTES C :: dfti_compute_backward_dddd
  612. !DEC$ ATTRIBUTES REFERENCE :: dfti_compute_backward_dddd
  613. INTEGER dfti_compute_backward_dddd
  614. TYPE(DFTI_DESCRIPTOR), POINTER :: desc
  615. REAL(DFTI_DPKP), INTENT(IN), DIMENSION(*) :: dSrcRe
  616. REAL(DFTI_DPKP), INTENT(IN), DIMENSION(*) :: dSrcIm
  617. REAL(DFTI_DPKP), INTENT(OUT), DIMENSION(*) :: dDstRe
  618. REAL(DFTI_DPKP), INTENT(OUT), DIMENSION(*) :: dDstIm
  619. END FUNCTION dfti_compute_backward_dddd
  620. END INTERFACE DftiComputeBackward
  621. INTERFACE DftiFreeDescriptor
  622. FUNCTION dfti_free_descriptor_external(desc)
  623. USE MKL_DFT_TYPE
  624. !DEC$ ATTRIBUTES C :: dfti_free_descriptor_external
  625. !DEC$ ATTRIBUTES REFERENCE :: dfti_free_descriptor_external
  626. INTEGER dfti_free_descriptor_external
  627. TYPE(DFTI_DESCRIPTOR), POINTER :: desc
  628. END FUNCTION dfti_free_descriptor_external
  629. END INTERFACE
  630. INTERFACE DftiErrorClass
  631. FUNCTION dfti_error_class_external(Status, ErrorClass)
  632. USE MKL_DFT_TYPE
  633. !DEC$ ATTRIBUTES C :: dfti_error_class_external
  634. !DEC$ ATTRIBUTES REFERENCE :: dfti_error_class_external
  635. LOGICAL dfti_error_class_external
  636. INTEGER, INTENT(IN) :: Status
  637. INTEGER, INTENT(IN) :: ErrorClass
  638. END FUNCTION dfti_error_class_external
  639. END INTERFACE
  640. INTERFACE DftiErrorMessage
  641. FUNCTION dfti_error_message_external(Status)
  642. USE MKL_DFT_TYPE
  643. !DEC$ ATTRIBUTES C :: dfti_error_message_external
  644. !DEC$ ATTRIBUTES REFERENCE :: dfti_error_message_external
  645. CHARACTER(LEN=DFTI_MAX_MESSAGE_LENGTH) :: dfti_error_message_external
  646. INTEGER, INTENT(IN) :: Status
  647. END FUNCTION dfti_error_message_external
  648. END INTERFACE
  649. END MODULE MKL_DFTI