mkl_spblas.f90 97 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750
  1. !===============================================================================
  2. ! Copyright 2014-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. !
  15. ! This file contains preliminary version of new SpBLAS API which supports
  16. ! two-step execution (inspector-executor) model.
  17. !
  18. !*******************************************************************************
  19. !*******************************************************************************
  20. !*********************************** Basic types and constants *****************
  21. !*******************************************************************************
  22. MODULE MKL_SPBLAS
  23. USE, INTRINSIC :: ISO_C_BINDING , ONLY : C_INTPTR_T, C_INT
  24. ! status of the routines
  25. ENUM, BIND(C)
  26. ENUMERATOR :: SPARSE_STATUS_SUCCESS = 0, & !
  27. SPARSE_STATUS_NOT_INITIALIZED = 1, & ! empty handle or matrix arrays
  28. SPARSE_STATUS_ALLOC_FAILED = 2, & ! internal error: memory allocation failed
  29. SPARSE_STATUS_INVALID_VALUE = 3, & ! invalid input value
  30. SPARSE_STATUS_EXECUTION_FAILED = 4, & ! e.g. 0-diagonal element for triangular solver, etc
  31. SPARSE_STATUS_INTERNAL_ERROR = 5, & !
  32. SPARSE_STATUS_NOT_SUPPORTED = 6 ! e.g. operation for double precision don't support other types
  33. END ENUM
  34. ! sparse matrix operations
  35. ENUM, BIND(C)
  36. ENUMERATOR :: SPARSE_OPERATION_NON_TRANSPOSE = 10, & !
  37. SPARSE_OPERATION_TRANSPOSE = 11, & !
  38. SPARSE_OPERATION_CONJUGATE_TRANSPOSE= 12 !
  39. END ENUM
  40. ! supported matrix types
  41. ENUM, BIND(C)
  42. ENUMERATOR :: SPARSE_MATRIX_TYPE_GENERAL = 20, & ! general case
  43. SPARSE_MATRIX_TYPE_SYMMETRIC = 21, & ! triangular part of
  44. SPARSE_MATRIX_TYPE_HERMITIAN = 22, & ! the matrix is to be processed
  45. SPARSE_MATRIX_TYPE_TRIANGULAR = 23, & !
  46. SPARSE_MATRIX_TYPE_DIAGONAL = 24 ! diagonal matrix; only diagonal elements should be processed
  47. END ENUM
  48. ! sparse matrix indexing: C-style or Fortran-style
  49. ENUM, BIND(C)
  50. ENUMERATOR :: SPARSE_INDEX_BASE_ZERO = 0, & ! C-style
  51. SPARSE_INDEX_BASE_ONE = 1 ! Fortran-style
  52. END ENUM
  53. ! makes sense for triangular matrices only
  54. ! ( SPARSE_MATRIX_TYPE_SYMMETRIC, SPARSE_MATRIX_TYPE_HERMITIAN, SPARSE_MATRIX_TYPE_TRIANGULAR )
  55. ENUM, BIND(C)
  56. ENUMERATOR :: SPARSE_FILL_MODE_LOWER = 40, & ! lower triangular part of the matrix is stored
  57. SPARSE_FILL_MODE_UPPER = 41, & ! upper triangular part of the matrix is stored
  58. SPARSE_FILL_MODE_FULL = 42 ! upper triangular part of the matrix is stored
  59. END ENUM
  60. ! makes sense for triangular matrices only
  61. ! ( SPARSE_MATRIX_TYPE_SYMMETRIC, SPARSE_MATRIX_TYPE_HERMITIAN, SPARSE_MATRIX_TYPE_TRIANGULAR )
  62. ENUM, BIND(C)
  63. ENUMERATOR :: SPARSE_DIAG_NON_UNIT = 50, & ! triangular matrix with non-unit diagonal
  64. SPARSE_DIAG_UNIT = 51 ! triangular matrix with unit diagonal
  65. END ENUM
  66. ! applicable for Level 3 operations with dense matrices; describes storage scheme for dense matrix (row major or column major)
  67. ENUM, BIND(C)
  68. ENUMERATOR :: SPARSE_LAYOUT_ROW_MAJOR = 101, & ! C-style
  69. SPARSE_LAYOUT_COLUMN_MAJOR = 102 ! Fortran-style
  70. END ENUM
  71. ! verbose mode; if verbose mode activated, handle should collect and report profiling / optimization info
  72. ENUM, BIND(C)
  73. ENUMERATOR :: SPARSE_VERBOSE_OFF = 70, & !
  74. SPARSE_VERBOSE_BASIC = 71, & ! report high-level info about optimization algorithms, issues, etc.
  75. SPARSE_VERBOSE_EXTENDED = 72 ! provide detailed information
  76. END ENUM
  77. ! memory optimization hints from customer: describe how much memory could be used on optimization stage
  78. ENUM, BIND(C)
  79. ENUMERATOR :: SPARSE_MEMORY_NONE = 80, & ! no memory should be allocated for matrix values and structures
  80. ! auxiliary structures could be created only for workload balancing,
  81. ! parallelization, etc.
  82. SPARSE_MEMORY_AGGRESSIVE = 81 ! matrix could be converted to any internal format
  83. END ENUM
  84. ENUM, BIND(C)
  85. ENUMERATOR :: SPARSE_STAGE_FULL_MULT = 90, & !
  86. SPARSE_STAGE_NNZ_COUNT = 91, & !
  87. SPARSE_STAGE_FINALIZE_MULT = 92, & !
  88. SPARSE_STAGE_FULL_MULT_NO_VAL = 93, & !
  89. SPARSE_STAGE_FINALIZE_MULT_NO_VAL = 94
  90. END ENUM
  91. ! applies to SOR interface; define type of (S)SOR operation to perform
  92. ENUM, BIND(C)
  93. ENUMERATOR :: SPARSE_SOR_FORWARD = 110, & ! (omega∗L + D)∗x^1 = (D - omega*D - omega*U)∗alpha*x^0 + omega*b
  94. SPARSE_SOR_BACKWARD = 111, & ! (omega∗U + D)∗x^1 = (D - omega*D - omega*L)∗alpha*x^0 + omega*b
  95. SPARSE_SOR_SYMMETRIC = 112 ! SSOR, for e.g. with omega == 1 && alpha == 1, equal to solving a system:
  96. ! (L + D)∗x^1 = b - U*x; (U + D)∗x = b - L*x^1
  97. END ENUM
  98. !*************************************************************************************************
  99. !*** Opaque structure for sparse matrix in internal format, further D - means double precision ***
  100. !*************************************************************************************************
  101. ! struct sparse_matrix;
  102. ! typedef struct sparse_matrix *sparse_matrix_t;
  103. TYPE, BIND(C) :: SPARSE_MATRIX_T
  104. INTEGER(C_INTPTR_T) :: PTR
  105. END TYPE SPARSE_MATRIX_T
  106. ! descriptor of main sparse matrix properties
  107. TYPE, BIND(C) :: MATRIX_DESCR
  108. INTEGER(C_INT) :: TYPE
  109. INTEGER(C_INT) :: MODE
  110. INTEGER(C_INT) :: DIAG
  111. END TYPE MATRIX_DESCR
  112. !*****************************************************************************************
  113. !*************************************** Creation routines *******************************
  114. !*****************************************************************************************
  115. INTERFACE
  116. ! Matrix handle is used for storing information about the matrix and matrix values
  117. ! Create matrix from one of the existing sparse formats, just create the handle with matrix info and copy matrix values if
  118. ! requested
  119. ! Collect high-level info about the matrix. Need to use this interface for the case with several calls in program for
  120. ! performance reasons, where optimizations are not required
  121. ! coordinate format,
  122. ! SPARSE_MATRIX_TYPE_GENERAL by default, pointers to input arrays are stored in the handle
  123. FUNCTION MKL_SPARSE_S_CREATE_COO(A,indexing,rows,cols,nnz,row_indx,col_indx,values) &
  124. BIND(C, name='MKL_SPARSE_S_CREATE_COO')
  125. USE, INTRINSIC :: ISO_C_BINDING , ONLY : C_INT, C_FLOAT
  126. IMPORT SPARSE_MATRIX_T
  127. TYPE(SPARSE_MATRIX_T), INTENT(INOUT) :: A
  128. INTEGER(C_INT) , INTENT(IN) :: indexing
  129. INTEGER , INTENT(IN) :: rows
  130. INTEGER , INTENT(IN) :: cols
  131. INTEGER , INTENT(IN) :: nnz
  132. INTEGER , INTENT(IN), DIMENSION(*) :: row_indx
  133. INTEGER , INTENT(IN), DIMENSION(*) :: col_indx
  134. REAL(C_FLOAT) , INTENT(IN), DIMENSION(*) :: values
  135. INTEGER(C_INT) MKL_SPARSE_S_CREATE_COO
  136. END FUNCTION
  137. FUNCTION MKL_SPARSE_D_CREATE_COO(A,indexing,rows,cols,nnz,row_indx,col_indx,values) &
  138. BIND(C, name='MKL_SPARSE_D_CREATE_COO')
  139. USE, INTRINSIC :: ISO_C_BINDING , ONLY : C_INT, C_DOUBLE
  140. IMPORT SPARSE_MATRIX_T
  141. TYPE(SPARSE_MATRIX_T), INTENT(INOUT) :: A
  142. INTEGER(C_INT) , INTENT(IN) :: indexing
  143. INTEGER , INTENT(IN) :: rows
  144. INTEGER , INTENT(IN) :: cols
  145. INTEGER , INTENT(IN) :: nnz
  146. INTEGER , INTENT(IN), DIMENSION(*) :: row_indx
  147. INTEGER , INTENT(IN), DIMENSION(*) :: col_indx
  148. REAL(C_DOUBLE) , INTENT(IN), DIMENSION(*) :: values
  149. INTEGER(C_INT) MKL_SPARSE_D_CREATE_COO
  150. END FUNCTION
  151. FUNCTION MKL_SPARSE_C_CREATE_COO(A,indexing,rows,cols,nnz,row_indx,col_indx,values) &
  152. BIND(C, name='MKL_SPARSE_C_CREATE_COO')
  153. USE, INTRINSIC :: ISO_C_BINDING , ONLY : C_INT, C_FLOAT_COMPLEX
  154. IMPORT SPARSE_MATRIX_T
  155. TYPE(SPARSE_MATRIX_T) , INTENT(INOUT) :: A
  156. INTEGER(C_INT) , INTENT(IN) :: indexing
  157. INTEGER , INTENT(IN) :: rows
  158. INTEGER , INTENT(IN) :: cols
  159. INTEGER , INTENT(IN) :: nnz
  160. INTEGER , INTENT(IN), DIMENSION(*) :: row_indx
  161. INTEGER , INTENT(IN), DIMENSION(*) :: col_indx
  162. COMPLEX(C_FLOAT_COMPLEX), INTENT(IN), DIMENSION(*) :: values
  163. INTEGER(C_INT) MKL_SPARSE_C_CREATE_COO
  164. END FUNCTION
  165. FUNCTION MKL_SPARSE_Z_CREATE_COO(A,indexing,rows,cols,nnz,row_indx,col_indx,values) &
  166. BIND(C, name='MKL_SPARSE_Z_CREATE_COO')
  167. USE, INTRINSIC :: ISO_C_BINDING , ONLY : C_INT, C_DOUBLE_COMPLEX
  168. IMPORT SPARSE_MATRIX_T
  169. TYPE(SPARSE_MATRIX_T) , INTENT(INOUT) :: A
  170. INTEGER(C_INT) , INTENT(IN) :: indexing
  171. INTEGER , INTENT(IN) :: rows
  172. INTEGER , INTENT(IN) :: cols
  173. INTEGER , INTENT(IN) :: nnz
  174. INTEGER , INTENT(IN), DIMENSION(*) :: row_indx
  175. INTEGER , INTENT(IN), DIMENSION(*) :: col_indx
  176. COMPLEX(C_DOUBLE_COMPLEX), INTENT(IN), DIMENSION(*) :: values
  177. INTEGER(C_INT) MKL_SPARSE_Z_CREATE_COO
  178. END FUNCTION
  179. ! compressed sparse row format (4-arrays version),
  180. ! SPARSE_MATRIX_TYPE_GENERAL by default, pointers to input arrays are stored in the handle
  181. FUNCTION MKL_SPARSE_S_CREATE_CSR(A,indexing,rows,cols,rows_start,rows_end,col_indx,values) &
  182. BIND(C, name='MKL_SPARSE_S_CREATE_CSR')
  183. USE, INTRINSIC :: ISO_C_BINDING , ONLY : C_INT, C_FLOAT
  184. IMPORT SPARSE_MATRIX_T
  185. TYPE(SPARSE_MATRIX_T), INTENT(INOUT) :: A
  186. INTEGER(C_INT) , INTENT(IN) :: indexing
  187. INTEGER , INTENT(IN) :: rows
  188. INTEGER , INTENT(IN) :: cols
  189. INTEGER , INTENT(IN), DIMENSION(*) :: rows_start
  190. INTEGER , INTENT(IN), DIMENSION(*) :: rows_end
  191. INTEGER , INTENT(IN), DIMENSION(*) :: col_indx
  192. REAL(C_FLOAT) , INTENT(IN), DIMENSION(*) :: values
  193. INTEGER(C_INT) MKL_SPARSE_S_CREATE_CSR
  194. END FUNCTION
  195. FUNCTION MKL_SPARSE_D_CREATE_CSR(A,indexing,rows,cols,rows_start,rows_end,col_indx,values) &
  196. BIND(C, name='MKL_SPARSE_D_CREATE_CSR')
  197. USE, INTRINSIC :: ISO_C_BINDING , ONLY : C_INT, C_DOUBLE
  198. IMPORT SPARSE_MATRIX_T
  199. TYPE(SPARSE_MATRIX_T), INTENT(INOUT) :: A
  200. INTEGER(C_INT) , INTENT(IN) :: indexing
  201. INTEGER , INTENT(IN) :: rows
  202. INTEGER , INTENT(IN) :: cols
  203. INTEGER , INTENT(IN), DIMENSION(*) :: rows_start
  204. INTEGER , INTENT(IN), DIMENSION(*) :: rows_end
  205. INTEGER , INTENT(IN), DIMENSION(*) :: col_indx
  206. REAL(C_DOUBLE) , INTENT(IN), DIMENSION(*) :: values
  207. INTEGER(C_INT) MKL_SPARSE_D_CREATE_CSR
  208. END FUNCTION
  209. FUNCTION MKL_SPARSE_C_CREATE_CSR(A,indexing,rows,cols,rows_start,rows_end,col_indx,values) &
  210. BIND(C, name='MKL_SPARSE_C_CREATE_CSR')
  211. USE, INTRINSIC :: ISO_C_BINDING , ONLY : C_INT, C_FLOAT_COMPLEX
  212. IMPORT SPARSE_MATRIX_T
  213. TYPE(SPARSE_MATRIX_T) , INTENT(INOUT) :: A
  214. INTEGER(C_INT) , INTENT(IN) :: indexing
  215. INTEGER , INTENT(IN) :: rows
  216. INTEGER , INTENT(IN) :: cols
  217. INTEGER , INTENT(IN), DIMENSION(*) :: rows_start
  218. INTEGER , INTENT(IN), DIMENSION(*) :: rows_end
  219. INTEGER , INTENT(IN), DIMENSION(*) :: col_indx
  220. COMPLEX(C_FLOAT_COMPLEX), INTENT(IN), DIMENSION(*) :: values
  221. INTEGER(C_INT) MKL_SPARSE_C_CREATE_CSR
  222. END FUNCTION
  223. FUNCTION MKL_SPARSE_Z_CREATE_CSR(A,indexing,rows,cols,rows_start,rows_end,col_indx,values) &
  224. BIND(C, name='MKL_SPARSE_Z_CREATE_CSR')
  225. USE, INTRINSIC :: ISO_C_BINDING , ONLY : C_INT, C_DOUBLE_COMPLEX
  226. IMPORT SPARSE_MATRIX_T
  227. TYPE(SPARSE_MATRIX_T) , INTENT(INOUT) :: A
  228. INTEGER(C_INT) , INTENT(IN) :: indexing
  229. INTEGER , INTENT(IN) :: rows
  230. INTEGER , INTENT(IN) :: cols
  231. INTEGER , INTENT(IN), DIMENSION(*) :: rows_start
  232. INTEGER , INTENT(IN), DIMENSION(*) :: rows_end
  233. INTEGER , INTENT(IN), DIMENSION(*) :: col_indx
  234. COMPLEX(C_DOUBLE_COMPLEX), INTENT(IN), DIMENSION(*) :: values
  235. INTEGER(C_INT) MKL_SPARSE_Z_CREATE_CSR
  236. END FUNCTION
  237. ! compressed sparse column format (4-arrays version),
  238. ! SPARSE_MATRIX_TYPE_GENERAL by default, pointers to input arrays are stored in the handle
  239. FUNCTION MKL_SPARSE_S_CREATE_CSC(A,indexing,rows,cols,cols_start,cols_end,row_indx,values) &
  240. BIND(C, name='MKL_SPARSE_S_CREATE_CSC')
  241. USE, INTRINSIC :: ISO_C_BINDING , ONLY : C_INT, C_FLOAT
  242. IMPORT SPARSE_MATRIX_T
  243. TYPE(SPARSE_MATRIX_T), INTENT(INOUT) :: A
  244. INTEGER(C_INT) , INTENT(IN) :: indexing
  245. INTEGER , INTENT(IN) :: rows
  246. INTEGER , INTENT(IN) :: cols
  247. INTEGER , INTENT(IN), DIMENSION(*) :: cols_start
  248. INTEGER , INTENT(IN), DIMENSION(*) :: cols_end
  249. INTEGER , INTENT(IN), DIMENSION(*) :: row_indx
  250. REAL(C_FLOAT) , INTENT(IN), DIMENSION(*) :: values
  251. INTEGER(C_INT) MKL_SPARSE_S_CREATE_CSC
  252. END FUNCTION
  253. FUNCTION MKL_SPARSE_D_CREATE_CSC(A,indexing,rows,cols,cols_start,cols_end,row_indx,values) &
  254. BIND(C, name='MKL_SPARSE_D_CREATE_CSC')
  255. USE, INTRINSIC :: ISO_C_BINDING , ONLY : C_INT, C_DOUBLE
  256. IMPORT SPARSE_MATRIX_T
  257. TYPE(SPARSE_MATRIX_T), INTENT(INOUT) :: A
  258. INTEGER(C_INT) , INTENT(IN) :: indexing
  259. INTEGER , INTENT(IN) :: rows
  260. INTEGER , INTENT(IN) :: cols
  261. INTEGER , INTENT(IN), DIMENSION(*) :: cols_start
  262. INTEGER , INTENT(IN), DIMENSION(*) :: cols_end
  263. INTEGER , INTENT(IN), DIMENSION(*) :: row_indx
  264. REAL(C_DOUBLE) , INTENT(IN), DIMENSION(*) :: values
  265. INTEGER(C_INT) MKL_SPARSE_D_CREATE_CSC
  266. END FUNCTION
  267. FUNCTION MKL_SPARSE_C_CREATE_CSC(A,indexing,rows,cols,cols_start,cols_end,row_indx,values) &
  268. BIND(C, name='MKL_SPARSE_C_CREATE_CSC')
  269. USE, INTRINSIC :: ISO_C_BINDING , ONLY : C_INT, C_FLOAT_COMPLEX
  270. IMPORT SPARSE_MATRIX_T
  271. TYPE(SPARSE_MATRIX_T) , INTENT(INOUT) :: A
  272. INTEGER(C_INT) , INTENT(IN) :: indexing
  273. INTEGER , INTENT(IN) :: rows
  274. INTEGER , INTENT(IN) :: cols
  275. INTEGER , INTENT(IN), DIMENSION(*) :: cols_start
  276. INTEGER , INTENT(IN), DIMENSION(*) :: cols_end
  277. INTEGER , INTENT(IN), DIMENSION(*) :: row_indx
  278. COMPLEX(C_FLOAT_COMPLEX), INTENT(IN), DIMENSION(*) :: values
  279. INTEGER(C_INT) MKL_SPARSE_C_CREATE_CSC
  280. END FUNCTION
  281. FUNCTION MKL_SPARSE_Z_CREATE_CSC(A,indexing,rows,cols,cols_start,cols_end,row_indx,values) &
  282. BIND(C, name='MKL_SPARSE_Z_CREATE_CSC')
  283. USE, INTRINSIC :: ISO_C_BINDING , ONLY : C_INT, C_DOUBLE_COMPLEX
  284. IMPORT SPARSE_MATRIX_T
  285. TYPE(SPARSE_MATRIX_T) , INTENT(INOUT) :: A
  286. INTEGER(C_INT) , INTENT(IN) :: indexing
  287. INTEGER , INTENT(IN) :: rows
  288. INTEGER , INTENT(IN) :: cols
  289. INTEGER , INTENT(IN), DIMENSION(*) :: cols_start
  290. INTEGER , INTENT(IN), DIMENSION(*) :: cols_end
  291. INTEGER , INTENT(IN), DIMENSION(*) :: row_indx
  292. COMPLEX(C_DOUBLE_COMPLEX), INTENT(IN), DIMENSION(*) :: values
  293. INTEGER(C_INT) MKL_SPARSE_Z_CREATE_CSC
  294. END FUNCTION
  295. ! compressed block sparse row format (4-arrays version, square blocks),
  296. ! SPARSE_MATRIX_TYPE_GENERAL by default, pointers to input arrays are stored in the handle
  297. FUNCTION MKL_SPARSE_S_CREATE_BSR(A,indexing,block_layout,rows,cols,block_size,rows_start,rows_end,col_indx,values) &
  298. BIND(C, name='MKL_SPARSE_S_CREATE_BSR')
  299. USE, INTRINSIC :: ISO_C_BINDING , ONLY : C_INT, C_FLOAT
  300. IMPORT SPARSE_MATRIX_T
  301. TYPE(SPARSE_MATRIX_T), INTENT(INOUT) :: A
  302. INTEGER(C_INT) , INTENT(IN) :: indexing
  303. INTEGER(C_INT) , INTENT(IN) :: block_layout
  304. INTEGER , INTENT(IN) :: rows
  305. INTEGER , INTENT(IN) :: cols
  306. INTEGER , INTENT(IN) :: block_size
  307. INTEGER , INTENT(IN), DIMENSION(*) :: rows_start
  308. INTEGER , INTENT(IN), DIMENSION(*) :: rows_end
  309. INTEGER , INTENT(IN), DIMENSION(*) :: col_indx
  310. REAL(C_FLOAT) , INTENT(IN), DIMENSION(*) :: values
  311. INTEGER(C_INT) MKL_SPARSE_S_CREATE_BSR
  312. END FUNCTION
  313. FUNCTION MKL_SPARSE_D_CREATE_BSR(A,indexing,block_layout,rows,cols,block_size,rows_start,rows_end,col_indx,values) &
  314. BIND(C, name='MKL_SPARSE_D_CREATE_BSR')
  315. USE, INTRINSIC :: ISO_C_BINDING , ONLY : C_INT, C_DOUBLE
  316. IMPORT SPARSE_MATRIX_T
  317. TYPE(SPARSE_MATRIX_T), INTENT(INOUT) :: A
  318. INTEGER(C_INT) , INTENT(IN) :: indexing
  319. INTEGER(C_INT) , INTENT(IN) :: block_layout
  320. INTEGER , INTENT(IN) :: rows
  321. INTEGER , INTENT(IN) :: cols
  322. INTEGER , INTENT(IN) :: block_size
  323. INTEGER , INTENT(IN), DIMENSION(*) :: rows_start
  324. INTEGER , INTENT(IN), DIMENSION(*) :: rows_end
  325. INTEGER , INTENT(IN), DIMENSION(*) :: col_indx
  326. REAL(C_DOUBLE) , INTENT(IN), DIMENSION(*) :: values
  327. INTEGER(C_INT) MKL_SPARSE_D_CREATE_BSR
  328. END FUNCTION
  329. FUNCTION MKL_SPARSE_C_CREATE_BSR(A,indexing,block_layout,rows,cols,block_size,rows_start,rows_end,col_indx,values) &
  330. BIND(C, name='MKL_SPARSE_C_CREATE_BSR')
  331. USE, INTRINSIC :: ISO_C_BINDING , ONLY : C_INT, C_FLOAT_COMPLEX
  332. IMPORT SPARSE_MATRIX_T
  333. TYPE(SPARSE_MATRIX_T) , INTENT(INOUT) :: A
  334. INTEGER(C_INT) , INTENT(IN) :: indexing
  335. INTEGER(C_INT) , INTENT(IN) :: block_layout
  336. INTEGER , INTENT(IN) :: rows
  337. INTEGER , INTENT(IN) :: cols
  338. INTEGER , INTENT(IN) :: block_size
  339. INTEGER , INTENT(IN), DIMENSION(*) :: rows_start
  340. INTEGER , INTENT(IN), DIMENSION(*) :: rows_end
  341. INTEGER , INTENT(IN), DIMENSION(*) :: col_indx
  342. COMPLEX(C_FLOAT_COMPLEX), INTENT(IN), DIMENSION(*) :: values
  343. INTEGER(C_INT) MKL_SPARSE_C_CREATE_BSR
  344. END FUNCTION
  345. FUNCTION MKL_SPARSE_Z_CREATE_BSR(A,indexing,block_layout,rows,cols,block_size,rows_start,rows_end,col_indx,values) &
  346. BIND(C, name='MKL_SPARSE_Z_CREATE_BSR')
  347. USE, INTRINSIC :: ISO_C_BINDING , ONLY : C_INT, C_DOUBLE_COMPLEX
  348. IMPORT SPARSE_MATRIX_T
  349. TYPE(SPARSE_MATRIX_T) , INTENT(INOUT) :: A
  350. INTEGER(C_INT) , INTENT(IN) :: indexing
  351. INTEGER(C_INT) , INTENT(IN) :: block_layout
  352. INTEGER , INTENT(IN) :: rows
  353. INTEGER , INTENT(IN) :: cols
  354. INTEGER , INTENT(IN) :: block_size
  355. INTEGER , INTENT(IN), DIMENSION(*) :: rows_start
  356. INTEGER , INTENT(IN), DIMENSION(*) :: rows_end
  357. INTEGER , INTENT(IN), DIMENSION(*) :: col_indx
  358. COMPLEX(C_DOUBLE_COMPLEX), INTENT(IN), DIMENSION(*) :: values
  359. INTEGER(C_INT) MKL_SPARSE_Z_CREATE_BSR
  360. END FUNCTION
  361. ! Create copy of the existing handle; matrix properties could be changed.
  362. ! For example it could be used for extracting triangular or diagonal parts from existing matrix.
  363. FUNCTION MKL_SPARSE_COPY(source,descr,dest) &
  364. BIND(C, name='MKL_SPARSE_COPY')
  365. USE, INTRINSIC :: ISO_C_BINDING , ONLY : C_INT
  366. IMPORT SPARSE_MATRIX_T
  367. IMPORT MATRIX_DESCR
  368. TYPE(SPARSE_MATRIX_T), INTENT(IN) :: source
  369. TYPE(MATRIX_DESCR) , INTENT(IN) :: descr
  370. TYPE(SPARSE_MATRIX_T), INTENT(INOUT) :: dest
  371. INTEGER(C_INT) MKL_SPARSE_COPY
  372. END FUNCTION
  373. ! destroy matrix handle; if sparse matrix was stored inside the handle it also deallocates the matrix
  374. ! It is customer responsibility not to delete the handle with the matrix, if this matrix is shared with other handles
  375. FUNCTION MKL_SPARSE_DESTROY(A) &
  376. BIND(C, name='MKL_SPARSE_DESTROY')
  377. USE, INTRINSIC :: ISO_C_BINDING , ONLY : C_INT
  378. IMPORT SPARSE_MATRIX_T
  379. TYPE(SPARSE_MATRIX_T), INTENT(INOUT) :: A
  380. INTEGER(C_INT) MKL_SPARSE_DESTROY
  381. END FUNCTION
  382. ! return extended error information from last operation;
  383. ! eg. info about wrong input parameter, memory sizes that couldn't be allocated, etc.
  384. FUNCTION MKL_SPARSE_GET_ERROR_INFO(A,info) &
  385. BIND(C, name='MKL_SPARSE_GET_ERROR_INFO')
  386. USE, INTRINSIC :: ISO_C_BINDING , ONLY : C_INT
  387. IMPORT SPARSE_MATRIX_T
  388. TYPE(SPARSE_MATRIX_T), INTENT(INOUT) :: A
  389. INTEGER , INTENT(IN), DIMENSION(*) :: info
  390. INTEGER(C_INT) MKL_SPARSE_GET_ERROR_INFO
  391. END FUNCTION
  392. !****************************************************************************************
  393. !************************ Converters of internal representation ************************
  394. !****************************************************************************************
  395. ! converters from current format to another
  396. ! convert original matrix to CSR representation
  397. FUNCTION MKL_SPARSE_CONVERT_CSR(source,operation,dest) &
  398. BIND(C, name='MKL_SPARSE_CONVERT_CSR')
  399. USE, INTRINSIC :: ISO_C_BINDING , ONLY : C_INT
  400. IMPORT SPARSE_MATRIX_T
  401. TYPE(SPARSE_MATRIX_T), INTENT(IN) :: source
  402. INTEGER(C_INT) , INTENT(IN) :: operation ! as is, transposed or conjugate transposed
  403. TYPE(SPARSE_MATRIX_T), INTENT(INOUT) :: dest
  404. INTEGER(C_INT) MKL_SPARSE_CONVERT_CSR
  405. END FUNCTION
  406. ! convert original matrix to BSR representation
  407. FUNCTION MKL_SPARSE_CONVERT_BSR(source,block_size,block_layout,operation,dest) &
  408. BIND(C, name='MKL_SPARSE_CONVERT_BSR')
  409. USE, INTRINSIC :: ISO_C_BINDING , ONLY : C_INT
  410. IMPORT SPARSE_MATRIX_T
  411. TYPE(SPARSE_MATRIX_T), INTENT(IN) :: source
  412. INTEGER , INTENT(IN) :: block_size
  413. INTEGER(C_INT) , INTENT(IN) :: block_layout ! block storage: row-major or column-major
  414. INTEGER(C_INT) , INTENT(IN) :: operation ! as is, transposed or conjugate transposed
  415. TYPE(SPARSE_MATRIX_T), INTENT(INOUT) :: dest
  416. INTEGER(C_INT) MKL_SPARSE_CONVERT_BSR
  417. END FUNCTION
  418. FUNCTION MKL_SPARSE_S_EXPORT_BSR(source,indexing,block_layout,rows,cols,block_size,rows_start,rows_end,col_indx,values) &
  419. BIND(C, name='MKL_SPARSE_S_EXPORT_BSR')
  420. USE, INTRINSIC :: ISO_C_BINDING , ONLY : C_INT, C_FLOAT, C_PTR
  421. IMPORT SPARSE_MATRIX_T
  422. TYPE(SPARSE_MATRIX_T), INTENT(IN) :: source
  423. INTEGER(C_INT) , INTENT(INOUT) :: indexing
  424. INTEGER(C_INT) , INTENT(INOUT) :: block_layout
  425. INTEGER , INTENT(INOUT) :: rows
  426. INTEGER , INTENT(INOUT) :: cols
  427. INTEGER , INTENT(INOUT) :: block_size
  428. TYPE(C_PTR) , INTENT(INOUT) :: rows_start
  429. TYPE(C_PTR) , INTENT(INOUT) :: rows_end
  430. TYPE(C_PTR) , INTENT(INOUT) :: col_indx
  431. TYPE(C_PTR) , INTENT(INOUT) :: values
  432. INTEGER(C_INT) MKL_SPARSE_S_EXPORT_BSR
  433. END FUNCTION
  434. FUNCTION MKL_SPARSE_D_EXPORT_BSR(source,indexing,block_layout,rows,cols,block_size,rows_start,rows_end,col_indx,values) &
  435. BIND(C, name='MKL_SPARSE_D_EXPORT_BSR')
  436. USE, INTRINSIC :: ISO_C_BINDING , ONLY : C_INT, C_DOUBLE, C_PTR
  437. IMPORT SPARSE_MATRIX_T
  438. TYPE(SPARSE_MATRIX_T), INTENT(IN) :: source
  439. INTEGER(C_INT) , INTENT(INOUT) :: indexing
  440. INTEGER(C_INT) , INTENT(INOUT) :: block_layout
  441. INTEGER , INTENT(INOUT) :: rows
  442. INTEGER , INTENT(INOUT) :: cols
  443. INTEGER , INTENT(INOUT) :: block_size
  444. TYPE(C_PTR) , INTENT(INOUT) :: rows_start
  445. TYPE(C_PTR) , INTENT(INOUT) :: rows_end
  446. TYPE(C_PTR) , INTENT(INOUT) :: col_indx
  447. TYPE(C_PTR) , INTENT(INOUT) :: values
  448. INTEGER(C_INT) MKL_SPARSE_D_EXPORT_BSR
  449. END FUNCTION
  450. FUNCTION MKL_SPARSE_C_EXPORT_BSR(source,indexing,block_layout,rows,cols,block_size,rows_start,rows_end,col_indx,values) &
  451. BIND(C, name='MKL_SPARSE_C_EXPORT_BSR')
  452. USE, INTRINSIC :: ISO_C_BINDING , ONLY : C_INT, C_FLOAT_COMPLEX, C_PTR
  453. IMPORT SPARSE_MATRIX_T
  454. TYPE(SPARSE_MATRIX_T), INTENT(IN) :: source
  455. INTEGER(C_INT) , INTENT(INOUT) :: indexing
  456. INTEGER(C_INT) , INTENT(INOUT) :: block_layout
  457. INTEGER , INTENT(INOUT) :: rows
  458. INTEGER , INTENT(INOUT) :: cols
  459. INTEGER , INTENT(INOUT) :: block_size
  460. TYPE(C_PTR) , INTENT(INOUT) :: rows_start
  461. TYPE(C_PTR) , INTENT(INOUT) :: rows_end
  462. TYPE(C_PTR) , INTENT(INOUT) :: col_indx
  463. TYPE(C_PTR) , INTENT(INOUT) :: values
  464. INTEGER(C_INT) MKL_SPARSE_C_EXPORT_BSR
  465. END FUNCTION
  466. FUNCTION MKL_SPARSE_Z_EXPORT_BSR(source,indexing,block_layout,rows,cols,block_size,rows_start,rows_end,col_indx,values) &
  467. BIND(C, name='MKL_SPARSE_Z_EXPORT_BSR')
  468. USE, INTRINSIC :: ISO_C_BINDING , ONLY : C_INT, C_DOUBLE_COMPLEX, C_PTR
  469. IMPORT SPARSE_MATRIX_T
  470. TYPE(SPARSE_MATRIX_T), INTENT(IN) :: source
  471. INTEGER(C_INT) , INTENT(INOUT) :: indexing
  472. INTEGER(C_INT) , INTENT(INOUT) :: block_layout
  473. INTEGER , INTENT(INOUT) :: rows
  474. INTEGER , INTENT(INOUT) :: cols
  475. INTEGER , INTENT(INOUT) :: block_size
  476. TYPE(C_PTR) , INTENT(INOUT) :: rows_start
  477. TYPE(C_PTR) , INTENT(INOUT) :: rows_end
  478. TYPE(C_PTR) , INTENT(INOUT) :: col_indx
  479. TYPE(C_PTR) , INTENT(INOUT) :: values
  480. INTEGER(C_INT) MKL_SPARSE_Z_EXPORT_BSR
  481. END FUNCTION
  482. FUNCTION MKL_SPARSE_S_EXPORT_CSR(source,indexing,rows,cols,rows_start,rows_end,col_indx,values) &
  483. BIND(C, name='MKL_SPARSE_S_EXPORT_CSR')
  484. USE, INTRINSIC :: ISO_C_BINDING , ONLY : C_INT, C_FLOAT, C_PTR
  485. IMPORT SPARSE_MATRIX_T
  486. TYPE(SPARSE_MATRIX_T), INTENT(IN) :: source
  487. INTEGER(C_INT) , INTENT(INOUT) :: indexing
  488. INTEGER , INTENT(INOUT) :: rows
  489. INTEGER , INTENT(INOUT) :: cols
  490. TYPE(C_PTR) , INTENT(INOUT) :: rows_start
  491. TYPE(C_PTR) , INTENT(INOUT) :: rows_end
  492. TYPE(C_PTR) , INTENT(INOUT) :: col_indx
  493. TYPE(C_PTR) , INTENT(INOUT) :: values
  494. INTEGER(C_INT) MKL_SPARSE_S_EXPORT_CSR
  495. END FUNCTION
  496. FUNCTION MKL_SPARSE_D_EXPORT_CSR(source,indexing,rows,cols,rows_start,rows_end,col_indx,values) &
  497. BIND(C, name='MKL_SPARSE_D_EXPORT_CSR')
  498. USE, INTRINSIC :: ISO_C_BINDING , ONLY : C_INT, C_DOUBLE, C_PTR
  499. IMPORT SPARSE_MATRIX_T
  500. TYPE(SPARSE_MATRIX_T), INTENT(IN) :: source
  501. INTEGER(C_INT) , INTENT(INOUT) :: indexing
  502. INTEGER , INTENT(INOUT) :: rows
  503. INTEGER , INTENT(INOUT) :: cols
  504. TYPE(C_PTR) , INTENT(INOUT) :: rows_start
  505. TYPE(C_PTR) , INTENT(INOUT) :: rows_end
  506. TYPE(C_PTR) , INTENT(INOUT) :: col_indx
  507. TYPE(C_PTR) , INTENT(INOUT) :: values
  508. INTEGER(C_INT) MKL_SPARSE_D_EXPORT_CSR
  509. END FUNCTION
  510. FUNCTION MKL_SPARSE_C_EXPORT_CSR(source,indexing,rows,cols,rows_start,rows_end,col_indx,values) &
  511. BIND(C, name='MKL_SPARSE_C_EXPORT_CSR')
  512. USE, INTRINSIC :: ISO_C_BINDING , ONLY : C_INT, C_FLOAT_COMPLEX, C_PTR
  513. IMPORT SPARSE_MATRIX_T
  514. TYPE(SPARSE_MATRIX_T), INTENT(IN) :: source
  515. INTEGER(C_INT) , INTENT(INOUT) :: indexing
  516. INTEGER , INTENT(INOUT) :: rows
  517. INTEGER , INTENT(INOUT) :: cols
  518. TYPE(C_PTR) , INTENT(INOUT) :: rows_start
  519. TYPE(C_PTR) , INTENT(INOUT) :: rows_end
  520. TYPE(C_PTR) , INTENT(INOUT) :: col_indx
  521. TYPE(C_PTR) , INTENT(INOUT) :: values
  522. INTEGER(C_INT) MKL_SPARSE_C_EXPORT_CSR
  523. END FUNCTION
  524. FUNCTION MKL_SPARSE_Z_EXPORT_CSR(source,indexing,rows,cols,rows_start,rows_end,col_indx,values) &
  525. BIND(C, name='MKL_SPARSE_Z_EXPORT_CSR')
  526. USE, INTRINSIC :: ISO_C_BINDING , ONLY : C_INT, C_DOUBLE_COMPLEX, C_PTR
  527. IMPORT SPARSE_MATRIX_T
  528. TYPE(SPARSE_MATRIX_T) , INTENT(IN) :: source
  529. INTEGER(C_INT) , INTENT(INOUT) :: indexing
  530. INTEGER , INTENT(INOUT) :: rows
  531. INTEGER , INTENT(INOUT) :: cols
  532. TYPE(C_PTR) , INTENT(INOUT) :: rows_start
  533. TYPE(C_PTR) , INTENT(INOUT) :: rows_end
  534. TYPE(C_PTR) , INTENT(INOUT) :: col_indx
  535. TYPE(C_PTR) , INTENT(INOUT) :: values
  536. INTEGER(C_INT) MKL_SPARSE_Z_EXPORT_CSR
  537. END FUNCTION
  538. FUNCTION MKL_SPARSE_S_EXPORT_CSC(source,indexing,rows,cols,cols_start,cols_end,row_indx,values) &
  539. BIND(C, name='MKL_SPARSE_S_EXPORT_CSC')
  540. USE, INTRINSIC :: ISO_C_BINDING , ONLY : C_INT, C_FLOAT, C_PTR
  541. IMPORT SPARSE_MATRIX_T
  542. TYPE(SPARSE_MATRIX_T), INTENT(IN) :: source
  543. INTEGER(C_INT) , INTENT(INOUT) :: indexing
  544. INTEGER , INTENT(INOUT) :: rows
  545. INTEGER , INTENT(INOUT) :: cols
  546. TYPE(C_PTR) , INTENT(INOUT) :: cols_start
  547. TYPE(C_PTR) , INTENT(INOUT) :: cols_end
  548. TYPE(C_PTR) , INTENT(INOUT) :: row_indx
  549. TYPE(C_PTR) , INTENT(INOUT) :: values
  550. INTEGER(C_INT) MKL_SPARSE_S_EXPORT_CSC
  551. END FUNCTION
  552. FUNCTION MKL_SPARSE_D_EXPORT_CSC(source,indexing,rows,cols,cols_start,cols_end,row_indx,values) &
  553. BIND(C, name='MKL_SPARSE_D_EXPORT_CSC')
  554. USE, INTRINSIC :: ISO_C_BINDING , ONLY : C_INT, C_DOUBLE, C_PTR
  555. IMPORT SPARSE_MATRIX_T
  556. TYPE(SPARSE_MATRIX_T), INTENT(IN) :: source
  557. INTEGER(C_INT) , INTENT(INOUT) :: indexing
  558. INTEGER , INTENT(INOUT) :: rows
  559. INTEGER , INTENT(INOUT) :: cols
  560. TYPE(C_PTR) , INTENT(INOUT) :: cols_start
  561. TYPE(C_PTR) , INTENT(INOUT) :: cols_end
  562. TYPE(C_PTR) , INTENT(INOUT) :: row_indx
  563. TYPE(C_PTR) , INTENT(INOUT) :: values
  564. INTEGER(C_INT) MKL_SPARSE_D_EXPORT_CSC
  565. END FUNCTION
  566. FUNCTION MKL_SPARSE_C_EXPORT_CSC(source,indexing,rows,cols,cols_start,cols_end,row_indx,values) &
  567. BIND(C, name='MKL_SPARSE_C_EXPORT_CSC')
  568. USE, INTRINSIC :: ISO_C_BINDING , ONLY : C_INT, C_FLOAT_COMPLEX, C_PTR
  569. IMPORT SPARSE_MATRIX_T
  570. TYPE(SPARSE_MATRIX_T), INTENT(IN) :: source
  571. INTEGER(C_INT) , INTENT(INOUT) :: indexing
  572. INTEGER , INTENT(INOUT) :: rows
  573. INTEGER , INTENT(INOUT) :: cols
  574. TYPE(C_PTR) , INTENT(INOUT) :: cols_start
  575. TYPE(C_PTR) , INTENT(INOUT) :: cols_end
  576. TYPE(C_PTR) , INTENT(INOUT) :: row_indx
  577. TYPE(C_PTR) , INTENT(INOUT) :: values
  578. INTEGER(C_INT) MKL_SPARSE_C_EXPORT_CSC
  579. END FUNCTION
  580. FUNCTION MKL_SPARSE_Z_EXPORT_CSC(source,indexing,rows,cols,cols_start,cols_end,row_indx,values) &
  581. BIND(C, name='MKL_SPARSE_Z_EXPORT_CSC')
  582. USE, INTRINSIC :: ISO_C_BINDING , ONLY : C_INT, C_DOUBLE_COMPLEX, C_PTR
  583. IMPORT SPARSE_MATRIX_T
  584. TYPE(SPARSE_MATRIX_T), INTENT(IN) :: source
  585. INTEGER(C_INT) , INTENT(INOUT) :: indexing
  586. INTEGER , INTENT(INOUT) :: rows
  587. INTEGER , INTENT(INOUT) :: cols
  588. TYPE(C_PTR) , INTENT(INOUT) :: cols_start
  589. TYPE(C_PTR) , INTENT(INOUT) :: cols_end
  590. TYPE(C_PTR) , INTENT(INOUT) :: row_indx
  591. TYPE(C_PTR) , INTENT(INOUT) :: values
  592. INTEGER(C_INT) MKL_SPARSE_Z_EXPORT_CSC
  593. END FUNCTION
  594. !****************************************************************************************
  595. !************************** Step-by-step modification routines **************************
  596. !****************************************************************************************
  597. ! update existing value in the matrix
  598. ! ( for internal storage only, should not work with customer-allocated matrices)
  599. FUNCTION MKL_SPARSE_S_SET_VALUE(A,row,col,value) &
  600. BIND(C, name='MKL_SPARSE_S_SET_VALUE')
  601. USE, INTRINSIC :: ISO_C_BINDING , ONLY : C_INT, C_FLOAT
  602. IMPORT SPARSE_MATRIX_T
  603. TYPE(SPARSE_MATRIX_T), INTENT(INOUT) :: A
  604. INTEGER , INTENT(IN) :: row
  605. INTEGER , INTENT(IN) :: col
  606. REAL(C_FLOAT) , INTENT(IN) :: value
  607. INTEGER(C_INT) MKL_SPARSE_S_SET_VALUE
  608. END FUNCTION
  609. FUNCTION MKL_SPARSE_D_SET_VALUE(A,row,col,value) &
  610. BIND(C, name='MKL_SPARSE_D_SET_VALUE')
  611. USE, INTRINSIC :: ISO_C_BINDING , ONLY : C_INT, C_DOUBLE
  612. IMPORT SPARSE_MATRIX_T
  613. TYPE(SPARSE_MATRIX_T), INTENT(INOUT) :: A
  614. INTEGER , INTENT(IN) :: row
  615. INTEGER , INTENT(IN) :: col
  616. REAL(C_DOUBLE) , INTENT(IN) :: value
  617. INTEGER(C_INT) MKL_SPARSE_D_SET_VALUE
  618. END FUNCTION
  619. FUNCTION MKL_SPARSE_C_SET_VALUE(A,row,col,value) &
  620. BIND(C, name='MKL_SPARSE_C_SET_VALUE')
  621. USE, INTRINSIC :: ISO_C_BINDING , ONLY : C_INT, C_FLOAT_COMPLEX
  622. IMPORT SPARSE_MATRIX_T
  623. TYPE(SPARSE_MATRIX_T) , INTENT(INOUT) :: A
  624. INTEGER , INTENT(IN) :: row
  625. INTEGER , INTENT(IN) :: col
  626. COMPLEX(C_FLOAT_COMPLEX) , INTENT(IN) :: value
  627. INTEGER(C_INT) MKL_SPARSE_C_SET_VALUE
  628. END FUNCTION
  629. FUNCTION MKL_SPARSE_Z_SET_VALUE(A,row,col,value) &
  630. BIND(C, name='MKL_SPARSE_Z_SET_VALUE')
  631. USE, INTRINSIC :: ISO_C_BINDING , ONLY : C_INT, C_DOUBLE_COMPLEX
  632. IMPORT SPARSE_MATRIX_T
  633. TYPE(SPARSE_MATRIX_T) , INTENT(INOUT) :: A
  634. INTEGER , INTENT(IN) :: row
  635. INTEGER , INTENT(IN) :: col
  636. COMPLEX(C_DOUBLE_COMPLEX) , INTENT(IN) :: value
  637. INTEGER(C_INT) MKL_SPARSE_Z_SET_VALUE
  638. END FUNCTION
  639. !****************************************************************************************
  640. !****************************** Verbose mode routine ************************************
  641. !****************************************************************************************
  642. ! allow to switch on/off verbose mode
  643. FUNCTION MKL_SPARSE_SET_VERBOSE_MODE(verbose) &
  644. BIND(C, name='MKL_SPARSE_SET_VERBOSE_MODE')
  645. USE, INTRINSIC :: ISO_C_BINDING , ONLY : C_INT
  646. INTEGER(C_INT), INTENT(IN) :: verbose
  647. INTEGER(C_INT) MKL_SPARSE_SET_VERBOSE_MODE
  648. END FUNCTION
  649. !****************************************************************************************
  650. !****************************** Optimization routines ***********************************
  651. !****************************************************************************************
  652. ! Describe expected operations with amount of iterations
  653. FUNCTION MKL_SPARSE_SET_MV_HINT(A,operation,descr,expected_calls) &
  654. BIND(C, name='MKL_SPARSE_SET_MV_HINT')
  655. USE, INTRINSIC :: ISO_C_BINDING , ONLY : C_INT
  656. IMPORT SPARSE_MATRIX_T
  657. IMPORT MATRIX_DESCR
  658. TYPE(SPARSE_MATRIX_T), INTENT(INOUT) :: A
  659. INTEGER(C_INT) , INTENT(IN) :: operation ! SPARSE_OPERATION_NON_TRANSPOSE is default value for
  660. ! infinite amount of calls
  661. TYPE(MATRIX_DESCR) , INTENT(IN) :: descr ! sparse_matrix_type_t + sparse_fill_mode_t + sparse_diag_type_t
  662. INTEGER , INTENT(IN) :: expected_calls
  663. INTEGER(C_INT) MKL_SPARSE_SET_MV_HINT
  664. END FUNCTION
  665. FUNCTION MKL_SPARSE_SET_MM_HINT(A,operation,descr,layout,dense_matrix_size,expected_calls) &
  666. BIND(C, name='MKL_SPARSE_SET_MM_HINT')
  667. USE, INTRINSIC :: ISO_C_BINDING , ONLY : C_INT
  668. IMPORT SPARSE_MATRIX_T
  669. IMPORT MATRIX_DESCR
  670. TYPE(SPARSE_MATRIX_T), INTENT(INOUT) :: A
  671. INTEGER(C_INT) , INTENT(IN) :: operation
  672. TYPE(MATRIX_DESCR) , INTENT(IN) :: descr ! sparse_matrix_type_t + sparse_fill_mode_t + sparse_diag_type_t
  673. INTEGER(C_INT) , INTENT(IN) :: layout ! storage scheme for the dense matrix: C-style or Fortran-style
  674. INTEGER , INTENT(IN) :: dense_matrix_size ! amount of columns in dense matrix
  675. INTEGER , INTENT(IN) :: expected_calls
  676. INTEGER(C_INT) MKL_SPARSE_SET_MM_HINT
  677. END FUNCTION
  678. FUNCTION MKL_SPARSE_SET_SV_HINT(A,operation,descr,expected_calls) &
  679. BIND(C, name='MKL_SPARSE_SET_SV_HINT')
  680. USE, INTRINSIC :: ISO_C_BINDING , ONLY : C_INT
  681. IMPORT SPARSE_MATRIX_T
  682. IMPORT MATRIX_DESCR
  683. TYPE(SPARSE_MATRIX_T), INTENT(INOUT) :: A
  684. INTEGER(C_INT) , INTENT(IN) :: operation ! SPARSE_OPERATION_NON_TRANSPOSE is default value for
  685. ! infinite amount of calls
  686. TYPE(MATRIX_DESCR) , INTENT(IN) :: descr ! sparse_matrix_type_t + sparse_fill_mode_t + sparse_diag_type_t
  687. INTEGER , INTENT(IN) :: expected_calls
  688. INTEGER(C_INT) MKL_SPARSE_SET_SV_HINT
  689. END FUNCTION
  690. FUNCTION MKL_SPARSE_SET_SM_HINT(A,operation,descr,layout,dense_matrix_size,expected_calls) &
  691. BIND(C, name='MKL_SPARSE_SET_SM_HINT')
  692. USE, INTRINSIC :: ISO_C_BINDING , ONLY : C_INT
  693. IMPORT SPARSE_MATRIX_T
  694. IMPORT MATRIX_DESCR
  695. TYPE(SPARSE_MATRIX_T), INTENT(INOUT) :: A
  696. INTEGER(C_INT) , INTENT(IN) :: operation
  697. TYPE(MATRIX_DESCR) , INTENT(IN) :: descr ! sparse_matrix_type_t + sparse_fill_mode_t + sparse_diag_type_t
  698. INTEGER(C_INT) , INTENT(IN) :: layout ! storage scheme for the dense matrix: C-style or Fortran-style
  699. INTEGER , INTENT(IN) :: dense_matrix_size ! amount of columns in dense matrix
  700. INTEGER , INTENT(IN) :: expected_calls
  701. INTEGER(C_INT) MKL_SPARSE_SET_SM_HINT
  702. END FUNCTION
  703. FUNCTION MKL_SPARSE_SET_MEMORY_HINT(A,policy) &
  704. BIND(C, name='MKL_SPARSE_SET_MEMORY_HINT')
  705. USE, INTRINSIC :: ISO_C_BINDING , ONLY : C_INT
  706. IMPORT SPARSE_MATRIX_T
  707. TYPE(SPARSE_MATRIX_T), INTENT(INOUT) :: A
  708. INTEGER(C_INT) , INTENT(IN) :: policy ! SPARSE_MEMORY_AGGRESSIVE is default value
  709. INTEGER(C_INT) MKL_SPARSE_SET_MEMORY_HINT
  710. END FUNCTION
  711. ! optimize matrix described by the handle. It uses hints (optimization and memory) that should be set up before this call.
  712. ! if hints were not explicitly defined, default vales are:
  713. ! SPARSE_OPERATION_NON_TRANSPOSE for matrix-vector multiply with infinite amount of expected iterations
  714. FUNCTION MKL_SPARSE_OPTIMIZE(A) &
  715. BIND(C, name='MKL_SPARSE_OPTIMIZE')
  716. USE, INTRINSIC :: ISO_C_BINDING , ONLY : C_INT
  717. IMPORT SPARSE_MATRIX_T
  718. TYPE(SPARSE_MATRIX_T), INTENT(INOUT) :: A
  719. INTEGER(C_INT) MKL_SPARSE_OPTIMIZE
  720. END FUNCTION
  721. !****************************************************************************************
  722. !****************************** Computational routines **********************************
  723. !****************************************************************************************
  724. ! Perform computations based on created matrix handle
  725. ! Level 2
  726. ! Computes y = alpha * A * x + beta * y
  727. FUNCTION MKL_SPARSE_S_MV(operation,alpha,A,descr,x,beta,y) &
  728. BIND(C, name='MKL_SPARSE_S_MV')
  729. USE, INTRINSIC :: ISO_C_BINDING , ONLY : C_INT, C_FLOAT
  730. IMPORT SPARSE_MATRIX_T
  731. IMPORT MATRIX_DESCR
  732. INTEGER(C_INT) , INTENT(IN) :: operation
  733. REAL(C_FLOAT) , INTENT(IN) :: alpha
  734. TYPE(SPARSE_MATRIX_T), INTENT(IN) :: A
  735. TYPE(MATRIX_DESCR) , INTENT(IN) :: descr ! sparse_matrix_type_t + sparse_fill_mode_t + sparse_diag_type_t
  736. REAL(C_FLOAT) , INTENT(IN), DIMENSION(*) :: x
  737. REAL(C_FLOAT) , INTENT(IN) :: beta
  738. REAL(C_FLOAT) , INTENT(INOUT), DIMENSION(*) :: y
  739. INTEGER(C_INT) MKL_SPARSE_S_MV
  740. END FUNCTION
  741. FUNCTION MKL_SPARSE_D_MV(operation,alpha,A,descr,x,beta,y) &
  742. BIND(C, name='MKL_SPARSE_D_MV')
  743. USE, INTRINSIC :: ISO_C_BINDING , ONLY : C_INT, C_DOUBLE
  744. IMPORT SPARSE_MATRIX_T
  745. IMPORT MATRIX_DESCR
  746. INTEGER(C_INT) , INTENT(IN) :: operation
  747. REAL(C_DOUBLE) , INTENT(IN) :: alpha
  748. TYPE(SPARSE_MATRIX_T), INTENT(IN) :: A
  749. TYPE(MATRIX_DESCR) , INTENT(IN) :: descr ! sparse_matrix_type_t + sparse_fill_mode_t + sparse_diag_type_t
  750. REAL(C_DOUBLE) , INTENT(IN), DIMENSION(*) :: x
  751. REAL(C_DOUBLE) , INTENT(IN) :: beta
  752. REAL(C_DOUBLE) , INTENT(INOUT), DIMENSION(*) :: y
  753. INTEGER(C_INT) MKL_SPARSE_D_MV
  754. END FUNCTION
  755. FUNCTION MKL_SPARSE_C_MV(operation,alpha,A,descr,x,beta,y) &
  756. BIND(C, name='MKL_SPARSE_C_MV')
  757. USE, INTRINSIC :: ISO_C_BINDING , ONLY : C_INT, C_FLOAT, C_FLOAT_COMPLEX
  758. IMPORT SPARSE_MATRIX_T
  759. IMPORT MATRIX_DESCR
  760. INTEGER(C_INT) , INTENT(IN) :: operation
  761. COMPLEX(C_FLOAT_COMPLEX), INTENT(IN) :: alpha
  762. TYPE(SPARSE_MATRIX_T) , INTENT(IN) :: A
  763. TYPE(MATRIX_DESCR) , INTENT(IN) :: descr ! sparse_matrix_type_t + sparse_fill_mode_t + sparse_diag_type_t
  764. COMPLEX(C_FLOAT_COMPLEX), INTENT(IN), DIMENSION(*) :: x
  765. COMPLEX(C_FLOAT_COMPLEX), INTENT(IN) :: beta
  766. COMPLEX(C_FLOAT_COMPLEX), INTENT(INOUT), DIMENSION(*) :: y
  767. INTEGER(C_INT) MKL_SPARSE_C_MV
  768. END FUNCTION
  769. FUNCTION MKL_SPARSE_Z_MV(operation,alpha,A,descr,x,beta,y) &
  770. BIND(C, name='MKL_SPARSE_Z_MV')
  771. USE, INTRINSIC :: ISO_C_BINDING , ONLY : C_INT, C_DOUBLE_COMPLEX
  772. IMPORT SPARSE_MATRIX_T
  773. IMPORT MATRIX_DESCR
  774. INTEGER(C_INT) , INTENT(IN) :: operation
  775. COMPLEX(C_DOUBLE_COMPLEX), INTENT(IN) :: alpha
  776. TYPE(SPARSE_MATRIX_T) , INTENT(IN) :: A
  777. TYPE(MATRIX_DESCR) , INTENT(IN) :: descr ! sparse_matrix_type_t + sparse_fill_mode_t + sparse_diag_type_t
  778. COMPLEX(C_DOUBLE_COMPLEX), INTENT(IN), DIMENSION(*) :: x
  779. COMPLEX(C_DOUBLE_COMPLEX), INTENT(IN) :: beta
  780. COMPLEX(C_DOUBLE_COMPLEX), INTENT(INOUT), DIMENSION(*) :: y
  781. INTEGER(C_INT) MKL_SPARSE_Z_MV
  782. END FUNCTION
  783. ! Solves triangular system y = alpha * A^{-1} * x
  784. FUNCTION MKL_SPARSE_S_TRSV(operation,alpha,A,descr,x,y) &
  785. BIND(C, name='MKL_SPARSE_S_TRSV')
  786. USE, INTRINSIC :: ISO_C_BINDING , ONLY : C_INT, C_FLOAT
  787. IMPORT SPARSE_MATRIX_T
  788. IMPORT MATRIX_DESCR
  789. INTEGER(C_INT) , INTENT(IN) :: operation
  790. REAL(C_FLOAT) , INTENT(IN) :: alpha
  791. TYPE(SPARSE_MATRIX_T), INTENT(IN) :: A
  792. TYPE(MATRIX_DESCR) , INTENT(IN) :: descr ! sparse_matrix_type_t + sparse_fill_mode_t + sparse_diag_type_t
  793. REAL(C_FLOAT) , INTENT(IN), DIMENSION(*) :: x
  794. REAL(C_FLOAT) , INTENT(INOUT), DIMENSION(*) :: y
  795. INTEGER(C_INT) MKL_SPARSE_S_TRSV
  796. END FUNCTION
  797. FUNCTION MKL_SPARSE_D_TRSV(operation,alpha,A,descr,x,y) &
  798. BIND(C, name='MKL_SPARSE_D_TRSV')
  799. USE, INTRINSIC :: ISO_C_BINDING , ONLY : C_INT, C_DOUBLE
  800. IMPORT SPARSE_MATRIX_T
  801. IMPORT MATRIX_DESCR
  802. INTEGER(C_INT) , INTENT(IN) :: operation
  803. REAL(C_DOUBLE) , INTENT(IN) :: alpha
  804. TYPE(SPARSE_MATRIX_T), INTENT(IN) :: A
  805. TYPE(MATRIX_DESCR) , INTENT(IN) :: descr ! sparse_matrix_type_t + sparse_fill_mode_t + sparse_diag_type_t
  806. REAL(C_DOUBLE) , INTENT(IN), DIMENSION(*) :: x
  807. REAL(C_DOUBLE) , INTENT(INOUT), DIMENSION(*) :: y
  808. INTEGER(C_INT) MKL_SPARSE_D_TRSV
  809. END FUNCTION
  810. FUNCTION MKL_SPARSE_C_TRSV(operation,alpha,A,descr,x,y) &
  811. BIND(C, name='MKL_SPARSE_C_TRSV')
  812. USE, INTRINSIC :: ISO_C_BINDING , ONLY : C_INT, C_FLOAT_COMPLEX
  813. IMPORT SPARSE_MATRIX_T
  814. IMPORT MATRIX_DESCR
  815. INTEGER(C_INT) , INTENT(IN) :: operation
  816. COMPLEX(C_FLOAT_COMPLEX), INTENT(IN) :: alpha
  817. TYPE(SPARSE_MATRIX_T) , INTENT(IN) :: A
  818. TYPE(MATRIX_DESCR) , INTENT(IN) :: descr ! sparse_matrix_type_t + sparse_fill_mode_t + sparse_diag_type_t
  819. COMPLEX(C_FLOAT_COMPLEX), INTENT(IN), DIMENSION(*) :: x
  820. COMPLEX(C_FLOAT_COMPLEX), INTENT(INOUT), DIMENSION(*) :: y
  821. INTEGER(C_INT) MKL_SPARSE_C_TRSV
  822. END FUNCTION
  823. FUNCTION MKL_SPARSE_Z_TRSV(operation,alpha,A,descr,x,y) &
  824. BIND(C, name='MKL_SPARSE_Z_TRSV')
  825. USE, INTRINSIC :: ISO_C_BINDING , ONLY : C_INT, C_DOUBLE_COMPLEX
  826. IMPORT SPARSE_MATRIX_T
  827. IMPORT MATRIX_DESCR
  828. INTEGER(C_INT) , INTENT(IN) :: operation
  829. COMPLEX(C_DOUBLE_COMPLEX), INTENT(IN) :: alpha
  830. TYPE(SPARSE_MATRIX_T) , INTENT(IN) :: A
  831. TYPE(MATRIX_DESCR) , INTENT(IN) :: descr ! sparse_matrix_type_t + sparse_fill_mode_t + sparse_diag_type_t
  832. COMPLEX(C_DOUBLE_COMPLEX), INTENT(IN), DIMENSION(*) :: x
  833. COMPLEX(C_DOUBLE_COMPLEX), INTENT(INOUT), DIMENSION(*) :: y
  834. INTEGER(C_INT) MKL_SPARSE_Z_TRSV
  835. END FUNCTION
  836. ! Level 3
  837. ! Computes y = alpha * A * x + beta * y
  838. FUNCTION MKL_SPARSE_S_MM(operation,alpha,A,descr,layout,x,columns,ldx,beta,y,ldy) &
  839. BIND(C, name='MKL_SPARSE_S_MM')
  840. USE, INTRINSIC :: ISO_C_BINDING , ONLY : C_INT, C_FLOAT
  841. IMPORT SPARSE_MATRIX_T
  842. IMPORT MATRIX_DESCR
  843. INTEGER(C_INT) , INTENT(IN) :: operation
  844. REAL(C_FLOAT) , INTENT(IN) :: alpha
  845. TYPE(SPARSE_MATRIX_T), INTENT(IN) :: A
  846. TYPE(MATRIX_DESCR) , INTENT(IN) :: descr ! sparse_matrix_type_t + sparse_fill_mode_t + sparse_diag_type_t
  847. INTEGER(C_INT) , INTENT(IN) :: layout ! storage scheme for the dense matrix: C-style or Fortran-style
  848. REAL(C_FLOAT) , INTENT(IN), DIMENSION(*) :: x
  849. INTEGER , INTENT(IN) :: columns
  850. INTEGER , INTENT(IN) :: ldx
  851. REAL(C_FLOAT) , INTENT(IN) :: beta
  852. REAL(C_FLOAT) , INTENT(INOUT), DIMENSION(*) :: y
  853. INTEGER , INTENT(IN) :: ldy
  854. INTEGER(C_INT) MKL_SPARSE_S_MM
  855. END FUNCTION
  856. FUNCTION MKL_SPARSE_D_MM(operation,alpha,A,descr,layout,x,columns,ldx,beta,y,ldy) &
  857. BIND(C, name='MKL_SPARSE_D_MM')
  858. USE, INTRINSIC :: ISO_C_BINDING , ONLY : C_INT, C_DOUBLE
  859. IMPORT SPARSE_MATRIX_T
  860. IMPORT MATRIX_DESCR
  861. INTEGER(C_INT) , INTENT(IN) :: operation
  862. REAL(C_DOUBLE) , INTENT(IN) :: alpha
  863. TYPE(SPARSE_MATRIX_T), INTENT(IN) :: A
  864. TYPE(MATRIX_DESCR) , INTENT(IN) :: descr ! sparse_matrix_type_t + sparse_fill_mode_t + sparse_diag_type_t
  865. INTEGER(C_INT) , INTENT(IN) :: layout ! storage scheme for the dense matrix: C-style or Fortran-style
  866. REAL(C_DOUBLE) , INTENT(IN), DIMENSION(*) :: x
  867. INTEGER , INTENT(IN) :: columns
  868. INTEGER , INTENT(IN) :: ldx
  869. REAL(C_DOUBLE) , INTENT(IN) :: beta
  870. REAL(C_DOUBLE) , INTENT(INOUT), DIMENSION(*) :: y
  871. INTEGER , INTENT(IN) :: ldy
  872. INTEGER(C_INT) MKL_SPARSE_D_MM
  873. END FUNCTION
  874. FUNCTION MKL_SPARSE_C_MM(operation,alpha,A,descr,layout,x,columns,ldx,beta,y,ldy) &
  875. BIND(C, name='MKL_SPARSE_C_MM')
  876. USE, INTRINSIC :: ISO_C_BINDING , ONLY : C_INT, C_FLOAT_COMPLEX
  877. IMPORT SPARSE_MATRIX_T
  878. IMPORT MATRIX_DESCR
  879. INTEGER(C_INT) , INTENT(IN) :: operation
  880. COMPLEX(C_FLOAT_COMPLEX), INTENT(IN) :: alpha
  881. TYPE(SPARSE_MATRIX_T) , INTENT(IN) :: A
  882. TYPE(MATRIX_DESCR) , INTENT(IN) :: descr ! sparse_matrix_type_t + sparse_fill_mode_t + sparse_diag_type_t
  883. INTEGER(C_INT) , INTENT(IN) :: layout ! storage scheme for the dense matrix: C-style or Fortran-style
  884. COMPLEX(C_FLOAT_COMPLEX), INTENT(IN), DIMENSION(*) :: x
  885. INTEGER , INTENT(IN) :: columns
  886. INTEGER , INTENT(IN) :: ldx
  887. COMPLEX(C_FLOAT_COMPLEX), INTENT(IN) :: beta
  888. COMPLEX(C_FLOAT_COMPLEX), INTENT(INOUT), DIMENSION(*) :: y
  889. INTEGER , INTENT(IN) :: ldy
  890. INTEGER(C_INT) MKL_SPARSE_C_MM
  891. END FUNCTION
  892. FUNCTION MKL_SPARSE_Z_MM(operation,alpha,A,descr,layout,x,columns,ldx,beta,y,ldy) &
  893. BIND(C, name='MKL_SPARSE_Z_MM')
  894. USE, INTRINSIC :: ISO_C_BINDING , ONLY : C_INT, C_DOUBLE_COMPLEX
  895. IMPORT SPARSE_MATRIX_T
  896. IMPORT MATRIX_DESCR
  897. INTEGER(C_INT) , INTENT(IN) :: operation
  898. COMPLEX(C_DOUBLE_COMPLEX), INTENT(IN) :: alpha
  899. TYPE(SPARSE_MATRIX_T) , INTENT(IN) :: A
  900. TYPE(MATRIX_DESCR) , INTENT(IN) :: descr ! sparse_matrix_type_t + sparse_fill_mode_t + sparse_diag_type_t
  901. INTEGER(C_INT) , INTENT(IN) :: layout ! storage scheme for the dense matrix: C-style or Fortran-style
  902. COMPLEX(C_DOUBLE_COMPLEX), INTENT(IN), DIMENSION(*) :: x
  903. INTEGER , INTENT(IN) :: columns
  904. INTEGER , INTENT(IN) :: ldx
  905. COMPLEX(C_DOUBLE_COMPLEX), INTENT(IN) :: beta
  906. COMPLEX(C_DOUBLE_COMPLEX), INTENT(INOUT), DIMENSION(*) :: y
  907. INTEGER , INTENT(IN) :: ldy
  908. INTEGER(C_INT) MKL_SPARSE_Z_MM
  909. END FUNCTION
  910. ! Solves triangular system y = alpha * A^{-1} * x
  911. FUNCTION MKL_SPARSE_S_TRSM(operation,alpha,A,descr,layout,x,columns,ldx,y,ldy) &
  912. BIND(C, name='MKL_SPARSE_S_TRSM')
  913. USE, INTRINSIC :: ISO_C_BINDING , ONLY : C_INT, C_FLOAT
  914. IMPORT SPARSE_MATRIX_T
  915. IMPORT MATRIX_DESCR
  916. INTEGER(C_INT) , INTENT(IN) :: operation
  917. REAL(C_FLOAT) , INTENT(IN) :: alpha
  918. TYPE(SPARSE_MATRIX_T), INTENT(IN) :: A
  919. TYPE(MATRIX_DESCR) , INTENT(IN) :: descr ! sparse_matrix_type_t + sparse_fill_mode_t + sparse_diag_type_t
  920. INTEGER(C_INT) , INTENT(IN) :: layout ! storage scheme for the dense matrix: C-style or Fortran-style
  921. REAL(C_FLOAT) , INTENT(IN), DIMENSION(*) :: x
  922. INTEGER , INTENT(IN) :: columns
  923. INTEGER , INTENT(IN) :: ldx
  924. REAL(C_FLOAT) , INTENT(INOUT), DIMENSION(*) :: y
  925. INTEGER , INTENT(IN) :: ldy
  926. INTEGER(C_INT) MKL_SPARSE_S_TRSM
  927. END FUNCTION
  928. FUNCTION MKL_SPARSE_D_TRSM(operation,alpha,A,descr,layout,x,columns,ldx,y,ldy) &
  929. BIND(C, name='MKL_SPARSE_D_TRSM')
  930. USE, INTRINSIC :: ISO_C_BINDING , ONLY : C_INT, C_DOUBLE
  931. IMPORT SPARSE_MATRIX_T
  932. IMPORT MATRIX_DESCR
  933. INTEGER(C_INT) , INTENT(IN) :: operation
  934. REAL(C_DOUBLE) , INTENT(IN) :: alpha
  935. TYPE(SPARSE_MATRIX_T), INTENT(IN) :: A
  936. TYPE(MATRIX_DESCR) , INTENT(IN) :: descr ! sparse_matrix_type_t + sparse_fill_mode_t + sparse_diag_type_t
  937. INTEGER(C_INT) , INTENT(IN) :: layout ! storage scheme for the dense matrix: C-style or Fortran-style
  938. REAL(C_DOUBLE) , INTENT(IN), DIMENSION(*) :: x
  939. INTEGER , INTENT(IN) :: columns
  940. INTEGER , INTENT(IN) :: ldx
  941. REAL(C_DOUBLE) , INTENT(INOUT), DIMENSION(*) :: y
  942. INTEGER , INTENT(IN) :: ldy
  943. INTEGER(C_INT) MKL_SPARSE_D_TRSM
  944. END FUNCTION
  945. FUNCTION MKL_SPARSE_C_TRSM(operation,alpha,A,descr,layout,x,columns,ldx,y,ldy) &
  946. BIND(C, name='MKL_SPARSE_C_TRSM')
  947. USE, INTRINSIC :: ISO_C_BINDING , ONLY : C_INT, C_FLOAT_COMPLEX
  948. IMPORT SPARSE_MATRIX_T
  949. IMPORT MATRIX_DESCR
  950. INTEGER(C_INT) , INTENT(IN) :: operation
  951. COMPLEX(C_FLOAT_COMPLEX), INTENT(IN) :: alpha
  952. TYPE(SPARSE_MATRIX_T) , INTENT(IN) :: A
  953. TYPE(MATRIX_DESCR) , INTENT(IN) :: descr ! sparse_matrix_type_t + sparse_fill_mode_t + sparse_diag_type_t
  954. INTEGER(C_INT) , INTENT(IN) :: layout ! storage scheme for the dense matrix: C-style or Fortran-style
  955. COMPLEX(C_FLOAT_COMPLEX), INTENT(IN), DIMENSION(*) :: x
  956. INTEGER , INTENT(IN) :: columns
  957. INTEGER , INTENT(IN) :: ldx
  958. COMPLEX(C_FLOAT_COMPLEX), INTENT(INOUT), DIMENSION(*) :: y
  959. INTEGER , INTENT(IN) :: ldy
  960. INTEGER(C_INT) MKL_SPARSE_C_TRSM
  961. END FUNCTION
  962. FUNCTION MKL_SPARSE_Z_TRSM(operation,alpha,A,descr,layout,x,columns,ldx,y,ldy) &
  963. BIND(C, name='MKL_SPARSE_Z_TRSM')
  964. USE, INTRINSIC :: ISO_C_BINDING , ONLY : C_INT, C_DOUBLE_COMPLEX
  965. IMPORT SPARSE_MATRIX_T
  966. IMPORT MATRIX_DESCR
  967. INTEGER(C_INT) , INTENT(IN) :: operation
  968. COMPLEX(C_DOUBLE_COMPLEX), INTENT(IN) :: alpha
  969. TYPE(SPARSE_MATRIX_T) , INTENT(IN) :: A
  970. TYPE(MATRIX_DESCR) , INTENT(IN) :: descr ! sparse_matrix_type_t + sparse_fill_mode_t + sparse_diag_type_t
  971. INTEGER(C_INT) , INTENT(IN) :: layout ! storage scheme for the dense matrix: C-style or Fortran-style
  972. COMPLEX(C_DOUBLE_COMPLEX), INTENT(IN), DIMENSION(*) :: x
  973. INTEGER , INTENT(IN) :: columns
  974. INTEGER , INTENT(IN) :: ldx
  975. COMPLEX(C_DOUBLE_COMPLEX), INTENT(INOUT), DIMENSION(*) :: y
  976. INTEGER , INTENT(IN) :: ldy
  977. INTEGER(C_INT) MKL_SPARSE_Z_TRSM
  978. END FUNCTION
  979. ! Sparse-sparse functionality
  980. ! Computes addition of sparse matrices: C = alpha * op(A) + B, result is sparse
  981. FUNCTION MKL_SPARSE_S_ADD(operation,A,alpha,B,C) &
  982. BIND(C, name='MKL_SPARSE_S_ADD')
  983. USE, INTRINSIC :: ISO_C_BINDING , ONLY : C_INT, C_FLOAT
  984. IMPORT SPARSE_MATRIX_T
  985. INTEGER(C_INT) , INTENT(IN) :: operation
  986. TYPE(SPARSE_MATRIX_T), INTENT(IN) :: A
  987. REAL(C_FLOAT) , INTENT(IN) :: alpha
  988. TYPE(SPARSE_MATRIX_T), INTENT(IN) :: B
  989. TYPE(SPARSE_MATRIX_T), INTENT(INOUT) :: C
  990. INTEGER(C_INT) MKL_SPARSE_S_ADD
  991. END FUNCTION
  992. FUNCTION MKL_SPARSE_D_ADD(operation,A,alpha,B,C) &
  993. BIND(C, name='MKL_SPARSE_D_ADD')
  994. USE, INTRINSIC :: ISO_C_BINDING , ONLY : C_INT, C_DOUBLE
  995. IMPORT SPARSE_MATRIX_T
  996. INTEGER(C_INT) , INTENT(IN) :: operation
  997. TYPE(SPARSE_MATRIX_T), INTENT(IN) :: A
  998. REAL(C_DOUBLE) , INTENT(IN) :: alpha
  999. TYPE(SPARSE_MATRIX_T), INTENT(IN) :: B
  1000. TYPE(SPARSE_MATRIX_T), INTENT(INOUT) :: C
  1001. INTEGER(C_INT) MKL_SPARSE_D_ADD
  1002. END FUNCTION
  1003. FUNCTION MKL_SPARSE_C_ADD(operation,A,alpha,B,C) &
  1004. BIND(C, name='MKL_SPARSE_C_ADD')
  1005. USE, INTRINSIC :: ISO_C_BINDING , ONLY : C_INT, C_FLOAT_COMPLEX
  1006. IMPORT SPARSE_MATRIX_T
  1007. INTEGER(C_INT) , INTENT(IN) :: operation
  1008. TYPE(SPARSE_MATRIX_T) , INTENT(IN) :: A
  1009. COMPLEX(C_FLOAT_COMPLEX), INTENT(IN) :: alpha
  1010. TYPE(SPARSE_MATRIX_T) , INTENT(IN) :: B
  1011. TYPE(SPARSE_MATRIX_T) , INTENT(INOUT) :: C
  1012. INTEGER(C_INT) MKL_SPARSE_C_ADD
  1013. END FUNCTION
  1014. FUNCTION MKL_SPARSE_Z_ADD(operation,A,alpha,B,C) &
  1015. BIND(C, name='MKL_SPARSE_Z_ADD')
  1016. USE, INTRINSIC :: ISO_C_BINDING , ONLY : C_INT, C_DOUBLE_COMPLEX
  1017. IMPORT SPARSE_MATRIX_T
  1018. INTEGER(C_INT) , INTENT(IN) :: operation
  1019. TYPE(SPARSE_MATRIX_T) , INTENT(IN) :: A
  1020. COMPLEX(C_DOUBLE_COMPLEX), INTENT(IN) :: alpha
  1021. TYPE(SPARSE_MATRIX_T) , INTENT(IN) :: B
  1022. TYPE(SPARSE_MATRIX_T) , INTENT(INOUT) :: C
  1023. INTEGER(C_INT) MKL_SPARSE_Z_ADD
  1024. END FUNCTION
  1025. ! Computes multiplication of sparse matrices: C = op(A) * B, result is sparse
  1026. FUNCTION MKL_SPARSE_SPMM(operation,A,B,C) &
  1027. BIND(C, name='MKL_SPARSE_SPMM')
  1028. USE, INTRINSIC :: ISO_C_BINDING , ONLY : C_INT
  1029. IMPORT SPARSE_MATRIX_T
  1030. INTEGER(C_INT) , INTENT(IN) :: operation
  1031. TYPE(SPARSE_MATRIX_T), INTENT(IN) :: A
  1032. TYPE(SPARSE_MATRIX_T), INTENT(IN) :: B
  1033. TYPE(SPARSE_MATRIX_T), INTENT(INOUT) :: C
  1034. INTEGER(C_INT) MKL_SPARSE_SPMM
  1035. END FUNCTION
  1036. FUNCTION MKL_SPARSE_SP2M(opA,descrA,A,opB,descrB,B,req,C) &
  1037. BIND(C, name='MKL_SPARSE_SP2M')
  1038. USE, INTRINSIC :: ISO_C_BINDING , ONLY : C_INT
  1039. IMPORT SPARSE_MATRIX_T
  1040. IMPORT MATRIX_DESCR
  1041. INTEGER(C_INT) , INTENT(IN) :: opA
  1042. TYPE(SPARSE_MATRIX_T), INTENT(IN) :: A
  1043. TYPE(MATRIX_DESCR) , INTENT(IN) :: descrA
  1044. INTEGER(C_INT) , INTENT(IN) :: opB
  1045. TYPE(MATRIX_DESCR) , INTENT(IN) :: descrB
  1046. TYPE(SPARSE_MATRIX_T), INTENT(IN) :: B
  1047. INTEGER(C_INT) , INTENT(IN) :: req
  1048. TYPE(SPARSE_MATRIX_T), INTENT(INOUT) :: C
  1049. INTEGER(C_INT) MKL_SPARSE_SP2M
  1050. END FUNCTION
  1051. FUNCTION MKL_SPARSE_SYRK(operation,A,C) &
  1052. BIND(C, name='MKL_SPARSE_SYRK')
  1053. USE, INTRINSIC :: ISO_C_BINDING , ONLY : C_INT
  1054. IMPORT SPARSE_MATRIX_T
  1055. INTEGER(C_INT) , INTENT(IN) :: operation
  1056. TYPE(SPARSE_MATRIX_T), INTENT(IN) :: A
  1057. TYPE(SPARSE_MATRIX_T), INTENT(INOUT) :: C
  1058. INTEGER(C_INT) MKL_SPARSE_SYRK
  1059. END FUNCTION
  1060. FUNCTION MKL_SPARSE_SYPR(operation,A,B,descrB,C,req) &
  1061. BIND(C, name='MKL_SPARSE_SYPR')
  1062. USE, INTRINSIC :: ISO_C_BINDING , ONLY : C_INT
  1063. IMPORT SPARSE_MATRIX_T
  1064. IMPORT MATRIX_DESCR
  1065. INTEGER(C_INT) , INTENT(IN) :: operation
  1066. TYPE(SPARSE_MATRIX_T), INTENT(IN) :: A
  1067. TYPE(SPARSE_MATRIX_T), INTENT(IN) :: B
  1068. TYPE(MATRIX_DESCR) , INTENT(IN) :: descrB
  1069. TYPE(SPARSE_MATRIX_T), INTENT(INOUT) :: C
  1070. INTEGER(C_INT) , INTENT(IN) :: req
  1071. INTEGER(C_INT) MKL_SPARSE_SYPR
  1072. END FUNCTION
  1073. FUNCTION MKL_SPARSE_S_SYPRD(op,A,B,layoutB,ldb,alpha,beta,C,layoutC,ldc) & !
  1074. BIND(C, name='MKL_SPARSE_S_SYPRD')
  1075. USE, INTRINSIC :: ISO_C_BINDING , ONLY : C_INT, C_FLOAT
  1076. IMPORT SPARSE_MATRIX_T
  1077. INTEGER(C_INT) , INTENT(IN) :: op
  1078. TYPE(SPARSE_MATRIX_T) , INTENT(IN) :: A
  1079. REAL(C_FLOAT) , INTENT(IN) , DIMENSION(*) :: B
  1080. INTEGER(C_INT) , INTENT(IN) :: layoutB
  1081. INTEGER , INTENT(IN) :: ldb
  1082. REAL(C_FLOAT) , INTENT(IN) :: alpha
  1083. REAL(C_FLOAT) , INTENT(IN) :: beta
  1084. REAL(C_FLOAT) , INTENT(INOUT), DIMENSION(*) :: C
  1085. INTEGER(C_INT) , INTENT(IN) :: layoutC
  1086. INTEGER , INTENT(IN) :: ldc
  1087. INTEGER(C_INT) MKL_SPARSE_S_SYPRD
  1088. END FUNCTION
  1089. FUNCTION MKL_SPARSE_D_SYPRD(op,A,B,layoutB,ldb,alpha,beta,C,layoutC,ldc) & !
  1090. BIND(C, name='MKL_SPARSE_D_SYPRD')
  1091. USE, INTRINSIC :: ISO_C_BINDING , ONLY : C_INT, C_DOUBLE
  1092. IMPORT SPARSE_MATRIX_T
  1093. INTEGER(C_INT) , INTENT(IN) :: op
  1094. TYPE(SPARSE_MATRIX_T), INTENT(IN) :: A
  1095. REAL(C_DOUBLE) , INTENT(IN) , DIMENSION(*) :: B
  1096. INTEGER(C_INT) , INTENT(IN) :: layoutB
  1097. INTEGER , INTENT(IN) :: ldb
  1098. REAL(C_DOUBLE) , INTENT(IN) :: alpha
  1099. REAL(C_DOUBLE) , INTENT(IN) :: beta
  1100. REAL(C_DOUBLE) , INTENT(INOUT), DIMENSION(*) :: C
  1101. INTEGER(C_INT) , INTENT(IN) :: layoutC
  1102. INTEGER , INTENT(IN) :: ldc
  1103. INTEGER(C_INT) MKL_SPARSE_D_SYPRD
  1104. END FUNCTION
  1105. FUNCTION MKL_SPARSE_C_SYPRD(op,A,B,layoutB,ldb,alpha,beta,C,layoutC,ldc) & !
  1106. BIND(C, name='MKL_SPARSE_C_SYPRD')
  1107. USE, INTRINSIC :: ISO_C_BINDING , ONLY : C_INT, C_FLOAT_COMPLEX
  1108. IMPORT SPARSE_MATRIX_T
  1109. INTEGER(C_INT) , INTENT(IN) :: op
  1110. TYPE(SPARSE_MATRIX_T) , INTENT(IN) :: A
  1111. COMPLEX(C_FLOAT_COMPLEX), INTENT(IN) , DIMENSION(*) :: B
  1112. INTEGER(C_INT) , INTENT(IN) :: layoutB
  1113. INTEGER , INTENT(IN) :: ldb
  1114. COMPLEX(C_FLOAT_COMPLEX), INTENT(IN) :: alpha
  1115. COMPLEX(C_FLOAT_COMPLEX), INTENT(IN) :: beta
  1116. COMPLEX(C_FLOAT_COMPLEX), INTENT(INOUT), DIMENSION(*) :: C
  1117. INTEGER(C_INT) , INTENT(IN) :: layoutC
  1118. INTEGER , INTENT(IN) :: ldc
  1119. INTEGER(C_INT) MKL_SPARSE_C_SYPRD
  1120. END FUNCTION
  1121. FUNCTION MKL_SPARSE_Z_SYPRD(op,A,B,layoutB,ldb,alpha,beta,C,layoutC,ldc) & !
  1122. BIND(C, name='MKL_SPARSE_Z_SYPRD')
  1123. USE, INTRINSIC :: ISO_C_BINDING , ONLY : C_INT, C_DOUBLE_COMPLEX
  1124. IMPORT SPARSE_MATRIX_T
  1125. INTEGER(C_INT) , INTENT(IN) :: op
  1126. TYPE(SPARSE_MATRIX_T) , INTENT(IN) :: A
  1127. COMPLEX(C_DOUBLE_COMPLEX), INTENT(IN) , DIMENSION(*) :: B
  1128. INTEGER(C_INT) , INTENT(IN) :: layoutB
  1129. INTEGER , INTENT(IN) :: ldb
  1130. COMPLEX(C_DOUBLE_COMPLEX), INTENT(IN) :: alpha
  1131. COMPLEX(C_DOUBLE_COMPLEX), INTENT(IN) :: beta
  1132. COMPLEX(C_DOUBLE_COMPLEX), INTENT(INOUT), DIMENSION(*) :: C
  1133. INTEGER(C_INT) , INTENT(IN) :: layoutC
  1134. INTEGER , INTENT(IN) :: ldc
  1135. INTEGER(C_INT) MKL_SPARSE_Z_SYPRD
  1136. END FUNCTION
  1137. FUNCTION MKL_SPARSE_ORDER(A) &
  1138. BIND(C, name='MKL_SPARSE_ORDER')
  1139. USE, INTRINSIC :: ISO_C_BINDING , ONLY : C_INT
  1140. IMPORT SPARSE_MATRIX_T
  1141. TYPE(SPARSE_MATRIX_T), INTENT(INOUT) :: A
  1142. INTEGER(C_INT) MKL_SPARSE_ORDER
  1143. END FUNCTION
  1144. ! Computes multiplication of sparse matrices: C = op(A) * B, result is dense
  1145. FUNCTION MKL_SPARSE_S_SPMMD(operation,A,B,layout,C,ldc) &
  1146. BIND(C, name='MKL_SPARSE_S_SPMMD')
  1147. USE, INTRINSIC :: ISO_C_BINDING , ONLY : C_INT, C_FLOAT
  1148. IMPORT SPARSE_MATRIX_T
  1149. INTEGER(C_INT) , INTENT(IN) :: operation
  1150. TYPE(SPARSE_MATRIX_T), INTENT(IN) :: A
  1151. TYPE(SPARSE_MATRIX_T), INTENT(IN) :: B
  1152. INTEGER(C_INT) , INTENT(IN) :: layout
  1153. REAL(C_FLOAT) , INTENT(INOUT), DIMENSION(*) :: C
  1154. INTEGER , INTENT(IN) :: ldc
  1155. INTEGER(C_INT) MKL_SPARSE_S_SPMMD
  1156. END FUNCTION
  1157. FUNCTION MKL_SPARSE_D_SPMMD(operation,A,B,layout,C,ldc) &
  1158. BIND(C, name='MKL_SPARSE_D_SPMMD')
  1159. USE, INTRINSIC :: ISO_C_BINDING , ONLY : C_INT, C_DOUBLE
  1160. IMPORT SPARSE_MATRIX_T
  1161. INTEGER(C_INT) , INTENT(IN) :: operation
  1162. TYPE(SPARSE_MATRIX_T), INTENT(IN) :: A
  1163. TYPE(SPARSE_MATRIX_T), INTENT(IN) :: B
  1164. INTEGER(C_INT) , INTENT(IN) :: layout
  1165. REAL(C_DOUBLE) , INTENT(INOUT), DIMENSION(*) :: C
  1166. INTEGER , INTENT(IN) :: ldc
  1167. INTEGER(C_INT) MKL_SPARSE_D_SPMMD
  1168. END FUNCTION
  1169. FUNCTION MKL_SPARSE_C_SPMMD(operation,A,B,layout,C,ldc) &
  1170. BIND(C, name='MKL_SPARSE_C_SPMMD')
  1171. USE, INTRINSIC :: ISO_C_BINDING , ONLY : C_INT, C_FLOAT_COMPLEX
  1172. IMPORT SPARSE_MATRIX_T
  1173. INTEGER(C_INT) , INTENT(IN) :: operation
  1174. TYPE(SPARSE_MATRIX_T) , INTENT(IN) :: A
  1175. TYPE(SPARSE_MATRIX_T) , INTENT(IN) :: B
  1176. INTEGER(C_INT) , INTENT(IN) :: layout
  1177. COMPLEX(C_FLOAT_COMPLEX), INTENT(INOUT), DIMENSION(*) :: C
  1178. INTEGER , INTENT(IN) :: ldc
  1179. INTEGER(C_INT) MKL_SPARSE_C_SPMMD
  1180. END FUNCTION
  1181. FUNCTION MKL_SPARSE_Z_SPMMD(operation,A,B,layout,C,ldc) &
  1182. BIND(C, name='MKL_SPARSE_Z_SPMMD')
  1183. USE, INTRINSIC :: ISO_C_BINDING , ONLY : C_INT, C_DOUBLE_COMPLEX
  1184. IMPORT SPARSE_MATRIX_T
  1185. INTEGER(C_INT) , INTENT(IN) :: operation
  1186. TYPE(SPARSE_MATRIX_T) , INTENT(IN) :: A
  1187. TYPE(SPARSE_MATRIX_T) , INTENT(IN) :: B
  1188. INTEGER(C_INT) , INTENT(IN) :: layout
  1189. COMPLEX(C_DOUBLE_COMPLEX), INTENT(INOUT), DIMENSION(*) :: C
  1190. INTEGER , INTENT(IN) :: ldc
  1191. INTEGER(C_INT) MKL_SPARSE_Z_SPMMD
  1192. END FUNCTION
  1193. FUNCTION MKL_SPARSE_S_SP2MD(opA,descrA,A,opB,descrB,B,alpha,beta,C,layout,ldc) & !
  1194. BIND(C, name='MKL_SPARSE_S_SP2MD')
  1195. USE, INTRINSIC :: ISO_C_BINDING , ONLY : C_INT, C_FLOAT
  1196. IMPORT SPARSE_MATRIX_T
  1197. IMPORT MATRIX_DESCR
  1198. INTEGER(C_INT) , INTENT(IN) :: opA
  1199. TYPE(MATRIX_DESCR) , INTENT(IN) :: descrA
  1200. TYPE(SPARSE_MATRIX_T), INTENT(IN) :: A
  1201. INTEGER(C_INT) , INTENT(IN) :: opB
  1202. TYPE(MATRIX_DESCR) , INTENT(IN) :: descrB
  1203. TYPE(SPARSE_MATRIX_T), INTENT(IN) :: B
  1204. REAL(C_FLOAT) , INTENT(IN) :: alpha
  1205. REAL(C_FLOAT) , INTENT(IN) :: beta
  1206. REAL(C_FLOAT) , INTENT(INOUT), DIMENSION(*) :: C
  1207. INTEGER(C_INT) , INTENT(IN) :: layout
  1208. INTEGER , INTENT(IN) :: ldc
  1209. INTEGER(C_INT) MKL_SPARSE_S_SP2MD
  1210. END FUNCTION
  1211. FUNCTION MKL_SPARSE_D_SP2MD(opA,descrA,A,opB,descrB,B,alpha,beta,C,layout,ldc) & !
  1212. BIND(C, name='MKL_SPARSE_D_SP2MD')
  1213. USE, INTRINSIC :: ISO_C_BINDING , ONLY : C_INT, C_DOUBLE
  1214. IMPORT SPARSE_MATRIX_T
  1215. IMPORT MATRIX_DESCR
  1216. INTEGER(C_INT) , INTENT(IN) :: opA
  1217. TYPE(MATRIX_DESCR) , INTENT(IN) :: descrA
  1218. TYPE(SPARSE_MATRIX_T), INTENT(IN) :: A
  1219. INTEGER(C_INT) , INTENT(IN) :: opB
  1220. TYPE(MATRIX_DESCR) , INTENT(IN) :: descrB
  1221. TYPE(SPARSE_MATRIX_T), INTENT(IN) :: B
  1222. REAL(C_DOUBLE) , INTENT(IN) :: alpha
  1223. REAL(C_DOUBLE) , INTENT(IN) :: beta
  1224. REAL(C_DOUBLE) , INTENT(INOUT), DIMENSION(*) :: C
  1225. INTEGER(C_INT) , INTENT(IN) :: layout
  1226. INTEGER , INTENT(IN) :: ldc
  1227. INTEGER(C_INT) MKL_SPARSE_D_SP2MD
  1228. END FUNCTION
  1229. FUNCTION MKL_SPARSE_C_SP2MD(opA,descrA,A,opB,descrB,B,alpha,beta,C,layout,ldc) & !
  1230. BIND(C, name='MKL_SPARSE_C_SP2MD')
  1231. USE, INTRINSIC :: ISO_C_BINDING , ONLY : C_INT, C_FLOAT_COMPLEX
  1232. IMPORT SPARSE_MATRIX_T
  1233. IMPORT MATRIX_DESCR
  1234. INTEGER(C_INT) , INTENT(IN) :: opA
  1235. TYPE(MATRIX_DESCR) , INTENT(IN) :: descrA
  1236. TYPE(SPARSE_MATRIX_T) , INTENT(IN) :: A
  1237. INTEGER(C_INT) , INTENT(IN) :: opB
  1238. TYPE(MATRIX_DESCR) , INTENT(IN) :: descrB
  1239. TYPE(SPARSE_MATRIX_T) , INTENT(IN) :: B
  1240. COMPLEX(C_FLOAT_COMPLEX), INTENT(IN) :: alpha
  1241. COMPLEX(C_FLOAT_COMPLEX), INTENT(IN) :: beta
  1242. COMPLEX(C_FLOAT_COMPLEX), INTENT(INOUT), DIMENSION(*) :: C
  1243. INTEGER(C_INT) , INTENT(IN) :: layout
  1244. INTEGER , INTENT(IN) :: ldc
  1245. INTEGER(C_INT) MKL_SPARSE_C_SP2MD
  1246. END FUNCTION
  1247. FUNCTION MKL_SPARSE_Z_SP2MD(opA,descrA,A,opB,descrB,B,alpha,beta,C,layout,ldc) & !
  1248. BIND(C, name='MKL_SPARSE_Z_SP2MD')
  1249. USE, INTRINSIC :: ISO_C_BINDING , ONLY : C_INT, C_DOUBLE_COMPLEX
  1250. IMPORT SPARSE_MATRIX_T
  1251. IMPORT MATRIX_DESCR
  1252. INTEGER(C_INT) , INTENT(IN) :: opA
  1253. TYPE(MATRIX_DESCR) , INTENT(IN) :: descrA
  1254. TYPE(SPARSE_MATRIX_T) , INTENT(IN) :: A
  1255. INTEGER(C_INT) , INTENT(IN) :: opB
  1256. TYPE(MATRIX_DESCR) , INTENT(IN) :: descrB
  1257. TYPE(SPARSE_MATRIX_T) , INTENT(IN) :: B
  1258. COMPLEX(C_DOUBLE_COMPLEX), INTENT(IN) :: alpha
  1259. COMPLEX(C_DOUBLE_COMPLEX), INTENT(IN) :: beta
  1260. COMPLEX(C_DOUBLE_COMPLEX), INTENT(INOUT), DIMENSION(*) :: C
  1261. INTEGER(C_INT) , INTENT(IN) :: layout
  1262. INTEGER , INTENT(IN) :: ldc
  1263. INTEGER(C_INT) MKL_SPARSE_Z_SP2MD
  1264. END FUNCTION
  1265. FUNCTION MKL_SPARSE_S_SYRKD(operation,A,alpha,beta,C,layout,ldc) & !
  1266. BIND(C, name='MKL_SPARSE_S_SYRKD')
  1267. USE, INTRINSIC :: ISO_C_BINDING , ONLY : C_INT, C_FLOAT
  1268. IMPORT SPARSE_MATRIX_T
  1269. INTEGER(C_INT) , INTENT(IN) :: operation
  1270. TYPE(SPARSE_MATRIX_T), INTENT(IN) :: A
  1271. REAL(C_FLOAT) , INTENT(IN) :: alpha
  1272. REAL(C_FLOAT) , INTENT(IN) :: beta
  1273. REAL(C_FLOAT) , INTENT(INOUT), DIMENSION(*) :: C
  1274. INTEGER(C_INT) , INTENT(IN) :: layout
  1275. INTEGER , INTENT(IN) :: ldc
  1276. INTEGER(C_INT) MKL_SPARSE_S_SYRKD
  1277. END FUNCTION
  1278. FUNCTION MKL_SPARSE_D_SYRKD(operation,A,alpha,beta,C,layout,ldc) &
  1279. BIND(C, name='MKL_SPARSE_D_SYRKD')
  1280. USE, INTRINSIC :: ISO_C_BINDING , ONLY : C_INT, C_DOUBLE
  1281. IMPORT SPARSE_MATRIX_T
  1282. INTEGER(C_INT) , INTENT(IN) :: operation
  1283. TYPE(SPARSE_MATRIX_T), INTENT(IN) :: A
  1284. REAL(C_DOUBLE) , INTENT(IN) :: alpha
  1285. REAL(C_DOUBLE) , INTENT(IN) :: beta
  1286. REAL(C_DOUBLE) , INTENT(INOUT), DIMENSION(*) :: C
  1287. INTEGER(C_INT) , INTENT(IN) :: layout
  1288. INTEGER , INTENT(IN) :: ldc
  1289. INTEGER(C_INT) MKL_SPARSE_D_SYRKD
  1290. END FUNCTION
  1291. FUNCTION MKL_SPARSE_C_SYRKD(operation,A,alpha,beta,C,layout,ldc) &
  1292. BIND(C, name='MKL_SPARSE_C_SYRKD')
  1293. USE, INTRINSIC :: ISO_C_BINDING , ONLY : C_INT, C_FLOAT_COMPLEX
  1294. IMPORT SPARSE_MATRIX_T
  1295. INTEGER(C_INT) , INTENT(IN) :: operation
  1296. TYPE(SPARSE_MATRIX_T) , INTENT(IN) :: A
  1297. COMPLEX(C_FLOAT_COMPLEX), INTENT(IN) :: alpha
  1298. COMPLEX(C_FLOAT_COMPLEX), INTENT(IN) :: beta
  1299. COMPLEX(C_FLOAT_COMPLEX), INTENT(INOUT), DIMENSION(*) :: C
  1300. INTEGER(C_INT) , INTENT(IN) :: layout
  1301. INTEGER , INTENT(IN) :: ldc
  1302. INTEGER(C_INT) MKL_SPARSE_C_SYRKD
  1303. END FUNCTION
  1304. FUNCTION MKL_SPARSE_Z_SYRKD(operation,A,alpha,beta,C,layout,ldc) &
  1305. BIND(C, name='MKL_SPARSE_Z_SYRKD')
  1306. USE, INTRINSIC :: ISO_C_BINDING , ONLY : C_INT, C_DOUBLE_COMPLEX
  1307. IMPORT SPARSE_MATRIX_T
  1308. INTEGER(C_INT) , INTENT(IN) :: operation
  1309. TYPE(SPARSE_MATRIX_T) , INTENT(IN) :: A
  1310. COMPLEX(C_DOUBLE_COMPLEX), INTENT(IN) :: alpha
  1311. COMPLEX(C_DOUBLE_COMPLEX), INTENT(IN) :: beta
  1312. COMPLEX(C_DOUBLE_COMPLEX), INTENT(INOUT), DIMENSION(*) :: C
  1313. INTEGER(C_INT) , INTENT(IN) :: layout
  1314. INTEGER , INTENT(IN) :: ldc
  1315. INTEGER(C_INT) MKL_SPARSE_Z_SYRKD
  1316. END FUNCTION
  1317. FUNCTION MKL_SPARSE_S_SYMGS_MV(operation,A,descr,alpha,b,x,y) &
  1318. BIND(C, name='MKL_SPARSE_S_SYMGS_MV')
  1319. USE, INTRINSIC :: ISO_C_BINDING , ONLY : C_INT, C_FLOAT
  1320. IMPORT SPARSE_MATRIX_T
  1321. IMPORT MATRIX_DESCR
  1322. INTEGER(C_INT) , INTENT(IN) :: operation
  1323. TYPE(SPARSE_MATRIX_T), INTENT(IN) :: A
  1324. TYPE(MATRIX_DESCR) , INTENT(IN) :: descr ! sparse_matrix_type_t + sparse_fill_mode_t + sparse_diag_type_t
  1325. REAL(C_FLOAT) , INTENT(IN) :: alpha
  1326. REAL(C_FLOAT) , INTENT(IN), DIMENSION(*) :: b
  1327. REAL(C_FLOAT) , INTENT(INOUT), DIMENSION(*) :: x
  1328. REAL(C_FLOAT) , INTENT(INOUT), DIMENSION(*) :: y
  1329. INTEGER(C_INT) MKL_SPARSE_S_SYMGS_MV
  1330. END FUNCTION
  1331. FUNCTION MKL_SPARSE_D_SYMGS_MV(operation,A,descr,alpha,b,x,y) &
  1332. BIND(C, name='MKL_SPARSE_D_SYMGS_MV')
  1333. USE, INTRINSIC :: ISO_C_BINDING , ONLY : C_INT, C_DOUBLE
  1334. IMPORT SPARSE_MATRIX_T
  1335. IMPORT MATRIX_DESCR
  1336. INTEGER(C_INT) , INTENT(IN) :: operation
  1337. TYPE(SPARSE_MATRIX_T), INTENT(IN) :: A
  1338. TYPE(MATRIX_DESCR) , INTENT(IN) :: descr ! sparse_matrix_type_t + sparse_fill_mode_t + sparse_diag_type_t
  1339. REAL(C_DOUBLE) , INTENT(IN) :: alpha
  1340. REAL(C_DOUBLE) , INTENT(IN), DIMENSION(*) :: b
  1341. REAL(C_DOUBLE) , INTENT(INOUT), DIMENSION(*) :: x
  1342. REAL(C_DOUBLE) , INTENT(INOUT), DIMENSION(*) :: y
  1343. INTEGER(C_INT) MKL_SPARSE_D_SYMGS_MV
  1344. END FUNCTION
  1345. FUNCTION MKL_SPARSE_C_SYMGS_MV(operation,A,descr,alpha,b,x,y) &
  1346. BIND(C, name='MKL_SPARSE_C_SYMGS_MV')
  1347. USE, INTRINSIC :: ISO_C_BINDING , ONLY : C_INT, C_FLOAT_COMPLEX
  1348. IMPORT SPARSE_MATRIX_T
  1349. IMPORT MATRIX_DESCR
  1350. INTEGER(C_INT) , INTENT(IN) :: operation
  1351. TYPE(SPARSE_MATRIX_T) , INTENT(IN) :: A
  1352. TYPE(MATRIX_DESCR) , INTENT(IN) :: descr ! sparse_matrix_type_t + sparse_fill_mode_t + sparse_diag_type_t
  1353. COMPLEX(C_FLOAT_COMPLEX), INTENT(IN) :: alpha
  1354. COMPLEX(C_FLOAT_COMPLEX), INTENT(IN), DIMENSION(*) :: b
  1355. COMPLEX(C_FLOAT_COMPLEX), INTENT(INOUT), DIMENSION(*) :: x
  1356. COMPLEX(C_FLOAT_COMPLEX), INTENT(INOUT), DIMENSION(*) :: y
  1357. INTEGER(C_INT) MKL_SPARSE_C_SYMGS_MV
  1358. END FUNCTION
  1359. FUNCTION MKL_SPARSE_Z_SYMGS_MV(operation,A,descr,alpha,b,x,y) &
  1360. BIND(C, name='MKL_SPARSE_Z_SYMGS_MV')
  1361. USE, INTRINSIC :: ISO_C_BINDING , ONLY : C_INT, C_DOUBLE_COMPLEX
  1362. IMPORT SPARSE_MATRIX_T
  1363. IMPORT MATRIX_DESCR
  1364. INTEGER(C_INT) , INTENT(IN) :: operation
  1365. TYPE(SPARSE_MATRIX_T) , INTENT(IN) :: A
  1366. TYPE(MATRIX_DESCR) , INTENT(IN) :: descr ! sparse_matrix_type_t + sparse_fill_mode_t + sparse_diag_type_t
  1367. COMPLEX(C_DOUBLE_COMPLEX), INTENT(IN) :: alpha
  1368. COMPLEX(C_DOUBLE_COMPLEX), INTENT(IN), DIMENSION(*) :: b
  1369. COMPLEX(C_DOUBLE_COMPLEX), INTENT(INOUT), DIMENSION(*) :: x
  1370. COMPLEX(C_DOUBLE_COMPLEX), INTENT(INOUT), DIMENSION(*) :: y
  1371. INTEGER(C_INT) MKL_SPARSE_Z_SYMGS_MV
  1372. END FUNCTION
  1373. FUNCTION MKL_SPARSE_S_SYMGS(operation,A,descr,alpha,b,x) &
  1374. BIND(C, name='MKL_SPARSE_S_SYMGS')
  1375. USE, INTRINSIC :: ISO_C_BINDING , ONLY : C_INT, C_FLOAT
  1376. IMPORT SPARSE_MATRIX_T
  1377. IMPORT MATRIX_DESCR
  1378. INTEGER(C_INT) , INTENT(IN) :: operation
  1379. TYPE(SPARSE_MATRIX_T), INTENT(IN) :: A
  1380. TYPE(MATRIX_DESCR) , INTENT(IN) :: descr ! sparse_matrix_type_t + sparse_fill_mode_t + sparse_diag_type_t
  1381. REAL(C_FLOAT) , INTENT(IN) :: alpha
  1382. REAL(C_FLOAT) , INTENT(IN), DIMENSION(*) :: b
  1383. REAL(C_FLOAT) , INTENT(INOUT), DIMENSION(*) :: x
  1384. INTEGER(C_INT) MKL_SPARSE_S_SYMGS
  1385. END FUNCTION
  1386. FUNCTION MKL_SPARSE_D_SYMGS(operation,A,descr,alpha,b,x) &
  1387. BIND(C, name='MKL_SPARSE_D_SYMGS')
  1388. USE, INTRINSIC :: ISO_C_BINDING , ONLY : C_INT, C_DOUBLE
  1389. IMPORT SPARSE_MATRIX_T
  1390. IMPORT MATRIX_DESCR
  1391. INTEGER(C_INT) , INTENT(IN) :: operation
  1392. TYPE(SPARSE_MATRIX_T), INTENT(IN) :: A
  1393. TYPE(MATRIX_DESCR) , INTENT(IN) :: descr ! sparse_matrix_type_t + sparse_fill_mode_t + sparse_diag_type_t
  1394. REAL(C_DOUBLE) , INTENT(IN) :: alpha
  1395. REAL(C_DOUBLE) , INTENT(IN), DIMENSION(*) :: b
  1396. REAL(C_DOUBLE) , INTENT(INOUT), DIMENSION(*) :: x
  1397. INTEGER(C_INT) MKL_SPARSE_D_SYMGS
  1398. END FUNCTION
  1399. FUNCTION MKL_SPARSE_C_SYMGS(operation,A,descr,alpha,b,x) &
  1400. BIND(C, name='MKL_SPARSE_C_SYMGS')
  1401. USE, INTRINSIC :: ISO_C_BINDING , ONLY : C_INT, C_FLOAT_COMPLEX
  1402. IMPORT SPARSE_MATRIX_T
  1403. IMPORT MATRIX_DESCR
  1404. INTEGER(C_INT) , INTENT(IN) :: operation
  1405. TYPE(SPARSE_MATRIX_T) , INTENT(IN) :: A
  1406. TYPE(MATRIX_DESCR) , INTENT(IN) :: descr ! sparse_matrix_type_t + sparse_fill_mode_t + sparse_diag_type_t
  1407. COMPLEX(C_FLOAT_COMPLEX), INTENT(IN) :: alpha
  1408. COMPLEX(C_FLOAT_COMPLEX), INTENT(IN), DIMENSION(*) :: b
  1409. COMPLEX(C_FLOAT_COMPLEX), INTENT(INOUT), DIMENSION(*) :: x
  1410. INTEGER(C_INT) MKL_SPARSE_C_SYMGS
  1411. END FUNCTION
  1412. FUNCTION MKL_SPARSE_Z_SYMGS(operation,A,descr,alpha,b,x) &
  1413. BIND(C, name='MKL_SPARSE_Z_SYMGS')
  1414. USE, INTRINSIC :: ISO_C_BINDING , ONLY : C_INT, C_DOUBLE_COMPLEX
  1415. IMPORT SPARSE_MATRIX_T
  1416. IMPORT MATRIX_DESCR
  1417. INTEGER(C_INT) , INTENT(IN) :: operation
  1418. TYPE(SPARSE_MATRIX_T) , INTENT(IN) :: A
  1419. TYPE(MATRIX_DESCR) , INTENT(IN) :: descr ! sparse_matrix_type_t + sparse_fill_mode_t + sparse_diag_type_t
  1420. COMPLEX(C_DOUBLE_COMPLEX), INTENT(IN) :: alpha
  1421. COMPLEX(C_DOUBLE_COMPLEX), INTENT(IN), DIMENSION(*) :: b
  1422. COMPLEX(C_DOUBLE_COMPLEX), INTENT(INOUT), DIMENSION(*) :: x
  1423. INTEGER(C_INT) MKL_SPARSE_Z_SYMGS
  1424. END FUNCTION
  1425. FUNCTION MKL_SPARSE_S_DOTMV(operation,alpha,A,descr,x,beta,y,d) &
  1426. BIND(C, name='MKL_SPARSE_S_DOTMV')
  1427. USE, INTRINSIC :: ISO_C_BINDING , ONLY : C_INT, C_FLOAT
  1428. IMPORT SPARSE_MATRIX_T
  1429. IMPORT MATRIX_DESCR
  1430. INTEGER(C_INT) , INTENT(IN) :: operation
  1431. REAL(C_FLOAT) , INTENT(IN) :: alpha
  1432. TYPE(SPARSE_MATRIX_T), INTENT(IN) :: A
  1433. TYPE(MATRIX_DESCR) , INTENT(IN) :: descr ! sparse_matrix_type_t + sparse_fill_mode_t + sparse_diag_type_t
  1434. REAL(C_FLOAT) , INTENT(INOUT), DIMENSION(*) :: x
  1435. REAL(C_FLOAT) , INTENT(IN) :: beta
  1436. REAL(C_FLOAT) , INTENT(INOUT), DIMENSION(*) :: y
  1437. REAL(C_FLOAT) , INTENT(INOUT), DIMENSION(*) :: d
  1438. INTEGER(C_INT) MKL_SPARSE_S_DOTMV
  1439. END FUNCTION
  1440. FUNCTION MKL_SPARSE_D_DOTMV(operation,alpha,A,descr,x,beta,y,d) &
  1441. BIND(C, name='MKL_SPARSE_D_DOTMV')
  1442. USE, INTRINSIC :: ISO_C_BINDING , ONLY : C_INT, C_DOUBLE
  1443. IMPORT SPARSE_MATRIX_T
  1444. IMPORT MATRIX_DESCR
  1445. INTEGER(C_INT) , INTENT(IN) :: operation
  1446. REAL(C_DOUBLE) , INTENT(IN) :: alpha
  1447. TYPE(SPARSE_MATRIX_T), INTENT(IN) :: A
  1448. TYPE(MATRIX_DESCR) , INTENT(IN) :: descr ! sparse_matrix_type_t + sparse_fill_mode_t + sparse_diag_type_t
  1449. REAL(C_DOUBLE) , INTENT(INOUT), DIMENSION(*) :: x
  1450. REAL(C_DOUBLE) , INTENT(IN) :: beta
  1451. REAL(C_DOUBLE) , INTENT(INOUT), DIMENSION(*) :: y
  1452. REAL(C_DOUBLE) , INTENT(INOUT), DIMENSION(*) :: d
  1453. INTEGER(C_INT) MKL_SPARSE_D_DOTMV
  1454. END FUNCTION
  1455. FUNCTION MKL_SPARSE_C_DOTMV(operation,alpha,A,descr,x,beta,y,d) &
  1456. BIND(C, name='MKL_SPARSE_C_DOTMV')
  1457. USE, INTRINSIC :: ISO_C_BINDING , ONLY : C_INT, C_FLOAT_COMPLEX, C_FLOAT
  1458. IMPORT SPARSE_MATRIX_T
  1459. IMPORT MATRIX_DESCR
  1460. INTEGER(C_INT) , INTENT(IN) :: operation
  1461. COMPLEX(C_FLOAT_COMPLEX), INTENT(IN) :: alpha
  1462. TYPE(SPARSE_MATRIX_T) , INTENT(IN) :: A
  1463. TYPE(MATRIX_DESCR) , INTENT(IN) :: descr ! sparse_matrix_type_t + sparse_fill_mode_t + sparse_diag_type_t
  1464. COMPLEX(C_FLOAT_COMPLEX), INTENT(INOUT), DIMENSION(*) :: x
  1465. COMPLEX(C_FLOAT_COMPLEX), INTENT(IN) :: beta
  1466. COMPLEX(C_FLOAT_COMPLEX), INTENT(INOUT), DIMENSION(*) :: y
  1467. COMPLEX(C_FLOAT_COMPLEX), INTENT(INOUT), DIMENSION(*) :: d
  1468. INTEGER(C_INT) MKL_SPARSE_C_DOTMV
  1469. END FUNCTION
  1470. FUNCTION MKL_SPARSE_Z_DOTMV(operation,alpha,A,descr,x,beta,y,d) &
  1471. BIND(C, name='MKL_SPARSE_Z_DOTMV')
  1472. USE, INTRINSIC :: ISO_C_BINDING , ONLY : C_INT, C_DOUBLE_COMPLEX, C_DOUBLE
  1473. IMPORT SPARSE_MATRIX_T
  1474. IMPORT MATRIX_DESCR
  1475. INTEGER(C_INT) , INTENT(IN) :: operation
  1476. COMPLEX(C_DOUBLE_COMPLEX), INTENT(IN) :: alpha
  1477. TYPE(SPARSE_MATRIX_T) , INTENT(IN) :: A
  1478. TYPE(MATRIX_DESCR) , INTENT(IN) :: descr ! sparse_matrix_type_t + sparse_fill_mode_t + sparse_diag_type_t
  1479. COMPLEX(C_DOUBLE_COMPLEX), INTENT(INOUT), DIMENSION(*) :: x
  1480. COMPLEX(C_DOUBLE_COMPLEX), INTENT(IN) :: beta
  1481. COMPLEX(C_DOUBLE_COMPLEX), INTENT(IN), DIMENSION(*) :: y
  1482. COMPLEX(C_DOUBLE_COMPLEX), INTENT(INOUT), DIMENSION(*) :: d
  1483. INTEGER(C_INT) MKL_SPARSE_Z_DOTMV
  1484. END FUNCTION
  1485. FUNCTION MKL_SPARSE_SET_DOTMV_HINT(A,operation,descr,expected_calls) &
  1486. BIND(C, name='MKL_SPARSE_SET_DOTMV_HINT')
  1487. USE, INTRINSIC :: ISO_C_BINDING , ONLY : C_INT
  1488. IMPORT SPARSE_MATRIX_T
  1489. IMPORT MATRIX_DESCR
  1490. TYPE(SPARSE_MATRIX_T), INTENT(INOUT) :: A
  1491. INTEGER(C_INT) , INTENT(IN) :: operation ! SPARSE_OPERATION_NON_TRANSPOSE is default value for
  1492. ! infinite amount of calls
  1493. TYPE(MATRIX_DESCR) , INTENT(IN) :: descr ! sparse_matrix_type_t + sparse_fill_mode_t + sparse_diag_type_t
  1494. INTEGER , INTENT(IN) :: expected_calls
  1495. INTEGER(C_INT) MKL_SPARSE_SET_DOTMV_HINT
  1496. END FUNCTION
  1497. FUNCTION MKL_SPARSE_SET_SYMGS_HINT(A,operation,descr,expected_calls) &
  1498. BIND(C, name='MKL_SPARSE_SET_SYMGS_HINT')
  1499. USE, INTRINSIC :: ISO_C_BINDING , ONLY : C_INT
  1500. IMPORT SPARSE_MATRIX_T
  1501. IMPORT MATRIX_DESCR
  1502. TYPE(SPARSE_MATRIX_T), INTENT(INOUT) :: A
  1503. INTEGER(C_INT) , INTENT(IN) :: operation ! SPARSE_OPERATION_NON_TRANSPOSE is default value for
  1504. ! infinite amount of calls
  1505. TYPE(MATRIX_DESCR) , INTENT(IN) :: descr ! sparse_matrix_type_t + sparse_fill_mode_t + sparse_diag_type_t
  1506. INTEGER , INTENT(IN) :: expected_calls
  1507. INTEGER(C_INT) MKL_SPARSE_SET_SYMGS_HINT
  1508. END FUNCTION
  1509. FUNCTION MKL_SPARSE_SET_LU_SMOOTHER_HINT(A,operation,descr,expected_calls) &
  1510. BIND(C, name='MKL_SPARSE_SET_LU_SMOOTHER_HINT')
  1511. USE, INTRINSIC :: ISO_C_BINDING , ONLY : C_INT
  1512. IMPORT SPARSE_MATRIX_T
  1513. IMPORT MATRIX_DESCR
  1514. TYPE(SPARSE_MATRIX_T), INTENT(INOUT) :: A
  1515. INTEGER(C_INT) , INTENT(IN) :: operation
  1516. TYPE(MATRIX_DESCR) , INTENT(IN) :: descr ! sparse_matrix_type_t + sparse_fill_mode_t + sparse_diag_type_t
  1517. INTEGER , INTENT(IN) :: expected_calls
  1518. INTEGER(C_INT) MKL_SPARSE_SET_LU_SMOOTHER_HINT
  1519. END FUNCTION
  1520. FUNCTION MKL_SPARSE_SET_SORV_HINT(type,A,descr,expected_calls) &
  1521. BIND(C, name='MKL_SPARSE_SET_SORV_HINT')
  1522. USE, INTRINSIC :: ISO_C_BINDING , ONLY : C_INT
  1523. IMPORT SPARSE_MATRIX_T
  1524. IMPORT MATRIX_DESCR
  1525. INTEGER(C_INT) , INTENT(IN) :: type ! choice of forward, backward sweep or SSOR operation
  1526. TYPE(SPARSE_MATRIX_T), INTENT(INOUT) :: A
  1527. TYPE(MATRIX_DESCR) , INTENT(IN) :: descr ! sparse_matrix_type_t + sparse_fill_mode_t + sparse_diag_type_t
  1528. INTEGER , INTENT(IN) :: expected_calls
  1529. INTEGER(C_INT) MKL_SPARSE_SET_SORV_HINT
  1530. END FUNCTION
  1531. FUNCTION MKL_SPARSE_S_LU_SMOOTHER(operation,A,descr,diag,approx_diag_inverse,x,rhs) &
  1532. BIND(C, name='MKL_SPARSE_S_LU_SMOOTHER')
  1533. USE, INTRINSIC :: ISO_C_BINDING , ONLY : C_INT, C_FLOAT
  1534. IMPORT SPARSE_MATRIX_T
  1535. IMPORT MATRIX_DESCR
  1536. INTEGER(C_INT) , INTENT(IN) :: operation
  1537. TYPE(SPARSE_MATRIX_T), INTENT(IN) :: A
  1538. TYPE(MATRIX_DESCR) , INTENT(IN) :: descr ! sparse_matrix_type_t + sparse_fill_mode_t + sparse_diag_type_t
  1539. REAL(C_FLOAT) , INTENT(IN) , DIMENSION(*) :: diag
  1540. REAL(C_FLOAT) , INTENT(IN) , DIMENSION(*) :: approx_diag_inverse
  1541. REAL(C_FLOAT) , INTENT(INOUT), DIMENSION(*) :: x
  1542. REAL(C_FLOAT) , INTENT(IN) , DIMENSION(*) :: rhs
  1543. INTEGER(C_INT) MKL_SPARSE_S_LU_SMOOTHER
  1544. END FUNCTION
  1545. FUNCTION MKL_SPARSE_D_LU_SMOOTHER(operation,A,descr,diag,approx_diag_inverse,x,rhs) &
  1546. BIND(C, name='MKL_SPARSE_D_LU_SMOOTHER')
  1547. USE, INTRINSIC :: ISO_C_BINDING , ONLY : C_INT, C_DOUBLE
  1548. IMPORT SPARSE_MATRIX_T
  1549. IMPORT MATRIX_DESCR
  1550. INTEGER(C_INT) , INTENT(IN) :: operation
  1551. TYPE(SPARSE_MATRIX_T), INTENT(IN) :: A
  1552. TYPE(MATRIX_DESCR) , INTENT(IN) :: descr ! sparse_matrix_type_t + sparse_fill_mode_t + sparse_diag_type_t
  1553. REAL(C_DOUBLE) , INTENT(IN) , DIMENSION(*) :: diag
  1554. REAL(C_DOUBLE) , INTENT(IN) , DIMENSION(*) :: approx_diag_inverse
  1555. REAL(C_DOUBLE) , INTENT(INOUT), DIMENSION(*) :: x
  1556. REAL(C_DOUBLE) , INTENT(IN) , DIMENSION(*) :: rhs
  1557. INTEGER(C_INT) MKL_SPARSE_D_LU_SMOOTHER
  1558. END FUNCTION
  1559. FUNCTION MKL_SPARSE_C_LU_SMOOTHER(operation,A,descr,diag,approx_diag_inverse,x,rhs) &
  1560. BIND(C, name='MKL_SPARSE_C_LU_SMOOTHER')
  1561. USE, INTRINSIC :: ISO_C_BINDING , ONLY : C_INT, C_FLOAT_COMPLEX
  1562. IMPORT SPARSE_MATRIX_T
  1563. IMPORT MATRIX_DESCR
  1564. INTEGER(C_INT) , INTENT(IN) :: operation
  1565. TYPE(SPARSE_MATRIX_T) , INTENT(IN) :: A
  1566. TYPE(MATRIX_DESCR) , INTENT(IN) :: descr ! sparse_matrix_type_t + sparse_fill_mode_t + sparse_diag_type_t
  1567. COMPLEX(C_FLOAT_COMPLEX), INTENT(IN) , DIMENSION(*) :: diag
  1568. COMPLEX(C_FLOAT_COMPLEX), INTENT(IN) , DIMENSION(*) :: approx_diag_inverse
  1569. COMPLEX(C_FLOAT_COMPLEX), INTENT(INOUT), DIMENSION(*) :: x
  1570. COMPLEX(C_FLOAT_COMPLEX), INTENT(IN) , DIMENSION(*) :: rhs
  1571. INTEGER(C_INT) MKL_SPARSE_C_LU_SMOOTHER
  1572. END FUNCTION
  1573. FUNCTION MKL_SPARSE_Z_LU_SMOOTHER(operation,A,descr,diag,approx_diag_inverse,x,rhs) &
  1574. BIND(C, name='MKL_SPARSE_Z_LU_SMOOTHER')
  1575. USE, INTRINSIC :: ISO_C_BINDING , ONLY : C_INT, C_DOUBLE_COMPLEX
  1576. IMPORT SPARSE_MATRIX_T
  1577. IMPORT MATRIX_DESCR
  1578. INTEGER(C_INT) , INTENT(IN) :: operation
  1579. TYPE(SPARSE_MATRIX_T) , INTENT(IN) :: A
  1580. TYPE(MATRIX_DESCR) , INTENT(IN) :: descr ! sparse_matrix_type_t + sparse_fill_mode_t + sparse_diag_type_t
  1581. COMPLEX(C_DOUBLE_COMPLEX), INTENT(IN) , DIMENSION(*) :: diag
  1582. COMPLEX(C_DOUBLE_COMPLEX), INTENT(IN) , DIMENSION(*) :: approx_diag_inverse
  1583. COMPLEX(C_DOUBLE_COMPLEX), INTENT(INOUT), DIMENSION(*) :: x
  1584. COMPLEX(C_DOUBLE_COMPLEX), INTENT(IN) , DIMENSION(*) :: rhs
  1585. INTEGER(C_INT) MKL_SPARSE_Z_LU_SMOOTHER
  1586. END FUNCTION
  1587. FUNCTION MKL_SPARSE_S_UPDATE_VALUES(A,nvalues,indx,indy,values) &
  1588. BIND(C, name='MKL_SPARSE_S_UPDATE_VALUES')
  1589. USE, INTRINSIC :: ISO_C_BINDING , ONLY : C_INT, C_FLOAT
  1590. IMPORT SPARSE_MATRIX_T
  1591. TYPE(SPARSE_MATRIX_T), INTENT(INOUT) :: A
  1592. INTEGER , INTENT(IN) :: nvalues
  1593. INTEGER , INTENT(IN), DIMENSION(*) :: indx
  1594. INTEGER , INTENT(IN), DIMENSION(*) :: indy
  1595. REAL(C_FLOAT) , INTENT(IN), DIMENSION(*) :: values
  1596. INTEGER(C_INT) MKL_SPARSE_S_UPDATE_VALUES
  1597. END FUNCTION
  1598. FUNCTION MKL_SPARSE_D_UPDATE_VALUES(A,nvalues,indx,indy,values) &
  1599. BIND(C, name='MKL_SPARSE_D_UPDATE_VALUES')
  1600. USE, INTRINSIC :: ISO_C_BINDING , ONLY : C_INT, C_DOUBLE
  1601. IMPORT SPARSE_MATRIX_T
  1602. TYPE(SPARSE_MATRIX_T), INTENT(INOUT) :: A
  1603. INTEGER , INTENT(IN) :: nvalues
  1604. INTEGER , INTENT(IN), DIMENSION(*) :: indx
  1605. INTEGER , INTENT(IN), DIMENSION(*) :: indy
  1606. REAL(C_DOUBLE) , INTENT(IN), DIMENSION(*) :: values
  1607. INTEGER(C_INT) MKL_SPARSE_D_UPDATE_VALUES
  1608. END FUNCTION
  1609. FUNCTION MKL_SPARSE_C_UPDATE_VALUES(A,nvalues,indx,indy,values) &
  1610. BIND(C, name='MKL_SPARSE_C_UPDATE_VALUES')
  1611. USE, INTRINSIC :: ISO_C_BINDING , ONLY : C_INT, C_FLOAT_COMPLEX
  1612. IMPORT SPARSE_MATRIX_T
  1613. TYPE(SPARSE_MATRIX_T) , INTENT(INOUT) :: A
  1614. INTEGER , INTENT(IN) :: nvalues
  1615. INTEGER , INTENT(IN), DIMENSION(*) :: indx
  1616. INTEGER , INTENT(IN), DIMENSION(*) :: indy
  1617. COMPLEX(C_FLOAT_COMPLEX), INTENT(IN), DIMENSION(*) :: values
  1618. INTEGER(C_INT) MKL_SPARSE_C_UPDATE_VALUES
  1619. END FUNCTION
  1620. FUNCTION MKL_SPARSE_Z_UPDATE_VALUES(A,nvalues,indx,indy,values) &
  1621. BIND(C, name='MKL_SPARSE_Z_UPDATE_VALUES')
  1622. USE, INTRINSIC :: ISO_C_BINDING , ONLY : C_INT, C_DOUBLE_COMPLEX
  1623. IMPORT SPARSE_MATRIX_T
  1624. TYPE(SPARSE_MATRIX_T) , INTENT(INOUT) :: A
  1625. INTEGER , INTENT(IN) :: nvalues
  1626. INTEGER , INTENT(IN), DIMENSION(*) :: indx
  1627. INTEGER , INTENT(IN), DIMENSION(*) :: indy
  1628. COMPLEX(C_DOUBLE_COMPLEX), INTENT(IN), DIMENSION(*) :: values
  1629. INTEGER(C_INT) MKL_SPARSE_Z_UPDATE_VALUES
  1630. END FUNCTION
  1631. FUNCTION MKL_SPARSE_S_SORV(type,descr,A,omega,alpha,x,b) &
  1632. BIND(C, name='MKL_SPARSE_S_SORV')
  1633. USE, INTRINSIC :: ISO_C_BINDING , ONLY : C_INT, C_FLOAT
  1634. IMPORT SPARSE_MATRIX_T
  1635. IMPORT MATRIX_DESCR
  1636. INTEGER(C_INT) , INTENT(IN) :: type ! choice of forward, backward sweep or SSOR operation
  1637. TYPE(MATRIX_DESCR) , INTENT(IN) :: descr
  1638. TYPE(SPARSE_MATRIX_T), INTENT(IN) :: A
  1639. REAL(C_FLOAT) , INTENT(IN) :: omega
  1640. REAL(C_FLOAT) , INTENT(IN) :: alpha ! alpha equals to 0 mean zero initial guess
  1641. REAL(C_FLOAT) , INTENT(INOUT), DIMENSION(*) :: x ! solution vector and alpha * x is initial guess
  1642. REAL(C_FLOAT) , INTENT(IN) , DIMENSION(*) :: b ! right-hand side
  1643. INTEGER(C_INT) MKL_SPARSE_S_SORV
  1644. END FUNCTION
  1645. FUNCTION MKL_SPARSE_D_SORV(type,descr,A,omega,alpha,x,b) &
  1646. BIND(C, name='MKL_SPARSE_D_SORV')
  1647. USE, INTRINSIC :: ISO_C_BINDING , ONLY : C_INT, C_DOUBLE
  1648. IMPORT SPARSE_MATRIX_T
  1649. IMPORT MATRIX_DESCR
  1650. INTEGER(C_INT) , INTENT(IN) :: type ! choice of forward, backward sweep or SSOR operation
  1651. TYPE(MATRIX_DESCR) , INTENT(IN) :: descr
  1652. TYPE(SPARSE_MATRIX_T), INTENT(IN) :: A
  1653. REAL(C_DOUBLE) , INTENT(IN) :: omega
  1654. REAL(C_DOUBLE) , INTENT(IN) :: alpha ! alpha equals to 0 mean zero initial guess
  1655. REAL(C_DOUBLE) , INTENT(INOUT), DIMENSION(*) :: x ! solution vector and alpha * x is initial guess
  1656. REAL(C_DOUBLE) , INTENT(IN) , DIMENSION(*) :: b ! right-hand side
  1657. INTEGER(C_INT) MKL_SPARSE_D_SORV
  1658. END FUNCTION
  1659. END INTERFACE
  1660. END MODULE MKL_SPBLAS