mkl_vsl_subroutine.fi 37 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031
  1. ! file: mkl_vsl_subroutine.fi
  2. !===============================================================================
  3. ! Copyright 2006-2022 Intel Corporation.
  4. !
  5. ! This software and the related documents are Intel copyrighted materials, and
  6. ! your use of them is governed by the express license under which they were
  7. ! provided to you (License). Unless the License provides otherwise, you may not
  8. ! use, modify, copy, publish, distribute, disclose or transmit this software or
  9. ! the related documents without Intel's prior written permission.
  10. !
  11. ! This software and the related documents are provided as is, with no express
  12. ! or implied warranties, other than those that are expressly stated in the
  13. ! License.
  14. !===============================================================================
  15. !++
  16. ! Fortran 90 old VSL interface.
  17. !--
  18. MODULE MKL_VSL_TYPE
  19. !++
  20. ! Definitions for VSL functions return values (errors, warnings)
  21. !--
  22. ! "No error" status
  23. INTEGER(KIND=4) VSL_STATUS_OK
  24. INTEGER(KIND=4) VSL_ERROR_OK
  25. PARAMETER (VSL_STATUS_OK = 0)
  26. PARAMETER (VSL_ERROR_OK = 0)
  27. ! Common errors (-1..-999)
  28. INTEGER(KIND=4) VSL_ERROR_FEATURE_NOT_IMPLEMENTED
  29. INTEGER(KIND=4) VSL_ERROR_UNKNOWN
  30. INTEGER(KIND=4) VSL_ERROR_BADARGS
  31. INTEGER(KIND=4) VSL_ERROR_MEM_FAILURE
  32. INTEGER(KIND=4) VSL_ERROR_NULL_PTR
  33. PARAMETER (VSL_ERROR_FEATURE_NOT_IMPLEMENTED = -1)
  34. PARAMETER (VSL_ERROR_UNKNOWN = -2)
  35. PARAMETER (VSL_ERROR_BADARGS = -3)
  36. PARAMETER (VSL_ERROR_MEM_FAILURE = -4)
  37. PARAMETER (VSL_ERROR_NULL_PTR = -5)
  38. ! RNG errors (-1000..-1999)
  39. ! brng errors
  40. INTEGER(KIND=4) VSL_RNG_ERROR_INVALID_BRNG_INDEX
  41. INTEGER(KIND=4) VSL_RNG_ERROR_LEAPFROG_UNSUPPORTED
  42. INTEGER(KIND=4) VSL_RNG_ERROR_SKIPAHEAD_UNSUPPORTED
  43. INTEGER(KIND=4) VSL_RNG_ERROR_SKIPAHEADEX_UNSUPPORTED
  44. INTEGER(KIND=4) VSL_RNG_ERROR_BRNGS_INCOMPATIBLE
  45. INTEGER(KIND=4) VSL_RNG_ERROR_BAD_STREAM
  46. INTEGER(KIND=4) VSL_RNG_ERROR_BRNG_TABLE_FULL
  47. INTEGER(KIND=4) VSL_RNG_ERROR_BAD_STREAM_STATE_SIZE
  48. INTEGER(KIND=4) VSL_RNG_ERROR_BAD_WORD_SIZE
  49. INTEGER(KIND=4) VSL_RNG_ERROR_BAD_NSEEDS
  50. INTEGER(KIND=4) VSL_RNG_ERROR_BAD_NBITS
  51. INTEGER(KIND=4) VSL_RNG_QRNG_PERIOD_ELAPSED
  52. INTEGER(KIND=4) VSL_RNG_ERROR_LEAPFROG_NSTREAMS_TOO_BIG
  53. PARAMETER (VSL_RNG_ERROR_INVALID_BRNG_INDEX = -1000)
  54. PARAMETER (VSL_RNG_ERROR_LEAPFROG_UNSUPPORTED = -1002)
  55. PARAMETER (VSL_RNG_ERROR_SKIPAHEAD_UNSUPPORTED = -1003)
  56. PARAMETER (VSL_RNG_ERROR_SKIPAHEADEX_UNSUPPORTED = -1004)
  57. PARAMETER (VSL_RNG_ERROR_BRNGS_INCOMPATIBLE = -1005)
  58. PARAMETER (VSL_RNG_ERROR_BAD_STREAM = -1006)
  59. PARAMETER (VSL_RNG_ERROR_BRNG_TABLE_FULL = -1007)
  60. PARAMETER (VSL_RNG_ERROR_BAD_STREAM_STATE_SIZE = -1008)
  61. PARAMETER (VSL_RNG_ERROR_BAD_WORD_SIZE = -1009)
  62. PARAMETER (VSL_RNG_ERROR_BAD_NSEEDS = -1010)
  63. PARAMETER (VSL_RNG_ERROR_BAD_NBITS = -1011)
  64. PARAMETER (VSL_RNG_QRNG_PERIOD_ELAPSED = -1012)
  65. PARAMETER (VSL_RNG_ERROR_LEAPFROG_NSTREAMS_TOO_BIG = -1013)
  66. !++
  67. ! BASIC RANDOM NUMBER GENERATOR (BRNG) RELATED MACRO DEFINITIONS
  68. !--
  69. ! MAX NUMBER OF BRNGS CAN BE REGISTERED IN VSL
  70. ! No more than VSL_MAX_REG_BRNGS basic generators can be registered in VSL
  71. ! (including predefined basic generators).
  72. !
  73. ! Change this number to increase/decrease number of BRNGs can be registered.
  74. INTEGER(KIND=4) VSL_MAX_REG_BRNGS
  75. PARAMETER (VSL_MAX_REG_BRNGS = 512)
  76. ! PREDEFINED BRNG NAMES
  77. INTEGER(KIND=4) VSL_BRNG_SHIFT
  78. INTEGER(KIND=4) VSL_BRNG_INC
  79. INTEGER(KIND=4) VSL_BRNG_MCG31
  80. INTEGER(KIND=4) VSL_BRNG_R250
  81. INTEGER(KIND=4) VSL_BRNG_MRG32K3A
  82. INTEGER(KIND=4) VSL_BRNG_MCG59
  83. INTEGER(KIND=4) VSL_BRNG_WH
  84. INTEGER(KIND=4) VSL_BRNG_SOBOL
  85. INTEGER(KIND=4) VSL_BRNG_NIEDERR
  86. INTEGER(KIND=4) VSL_BRNG_MT19937
  87. INTEGER(KIND=4) VSL_BRNG_MT2203
  88. INTEGER(KIND=4) VSL_BRNG_IABSTRACT
  89. INTEGER(KIND=4) VSL_BRNG_DABSTRACT
  90. INTEGER(KIND=4) VSL_BRNG_SABSTRACT
  91. PARAMETER (VSL_BRNG_SHIFT=20)
  92. PARAMETER (VSL_BRNG_INC=ISHFT(1, VSL_BRNG_SHIFT))
  93. PARAMETER (VSL_BRNG_MCG31 =VSL_BRNG_INC)
  94. PARAMETER (VSL_BRNG_R250 =VSL_BRNG_MCG31 +VSL_BRNG_INC)
  95. PARAMETER (VSL_BRNG_MRG32K3A =VSL_BRNG_R250 +VSL_BRNG_INC)
  96. PARAMETER (VSL_BRNG_MCG59 =VSL_BRNG_MRG32K3A +VSL_BRNG_INC)
  97. PARAMETER (VSL_BRNG_WH =VSL_BRNG_MCG59 +VSL_BRNG_INC)
  98. PARAMETER (VSL_BRNG_SOBOL =VSL_BRNG_WH +VSL_BRNG_INC)
  99. PARAMETER (VSL_BRNG_NIEDERR =VSL_BRNG_SOBOL +VSL_BRNG_INC)
  100. PARAMETER (VSL_BRNG_MT19937 =VSL_BRNG_NIEDERR +VSL_BRNG_INC)
  101. PARAMETER (VSL_BRNG_MT2203 =VSL_BRNG_MT19937 +VSL_BRNG_INC)
  102. PARAMETER (VSL_BRNG_IABSTRACT=VSL_BRNG_MT2203 +VSL_BRNG_INC)
  103. PARAMETER (VSL_BRNG_DABSTRACT=VSL_BRNG_IABSTRACT+VSL_BRNG_INC)
  104. PARAMETER (VSL_BRNG_SABSTRACT=VSL_BRNG_DABSTRACT+VSL_BRNG_INC)
  105. ! LEAPFROG METHOD FOR GRAY-CODE BASED QUASI-RANDOM NUMBER BASIC GENERATORS
  106. ! VSL_BRNG_SOBOL and VSL_BRNG_NIEDERR are Gray-code based quasi-random number
  107. ! basic generators. In contrast to pseudorandom number basic generators,
  108. ! quasi-random ones take the dimension as initialization parameter.
  109. !
  110. ! Suppose that quasi-random number generator (QRNG) dimension is S. QRNG
  111. ! sequence is a sequence of S-dimensional vectors:
  112. !
  113. ! x0=(x0[0],x0[1],...,x0[S-1]),x1=(x1[0],x1[1],...,x1[S-1]),...
  114. !
  115. ! VSL treats the output of any basic generator as 1-dimensional, however:
  116. !
  117. ! x0[0],x0[1],...,x0[S-1],x1[0],x1[1],...,x1[S-1],...
  118. !
  119. ! Because of nature of VSL_BRNG_SOBOL and VSL_BRNG_NIEDERR QRNGs,
  120. ! the only S-stride Leapfrog method is supported for them. In other words,
  121. ! user can generate subsequences, which consist of fixed elements of
  122. ! vectors x0,x1,... For example, if 0 element is fixed, the following
  123. ! subsequence is generated:
  124. !
  125. ! x0[1],x1[1],x2[1],...
  126. !
  127. ! To use the s-stride Leapfrog method with given QRNG, user should call
  128. ! vslLeapfrogStream function with parameter k equal to element to be fixed
  129. ! (0<=k<S) and parameter nstreams equal to VSL_QRNG_LEAPFROG_COMPONENTS.
  130. INTEGER VSL_QRNG_LEAPFROG_COMPONENTS
  131. PARAMETER (VSL_QRNG_LEAPFROG_COMPONENTS = INT(Z"7FFFFFFF"))
  132. ! INITIALIZATION METHODS FOR USER-DESIGNED BASIC RANDOM NUMBER GENERATORS.
  133. ! Each BRNG must support at least VSL_INIT_METHOD_STANDARD initialization
  134. ! method. In addition, VSL_INIT_METHOD_LEAPFROG, VSL_INIT_METHOD_SKIPAHEAD and
  135. ! VSL_INIT_METHOD_SKIPAHEADEX initialization methods can be supported.
  136. !
  137. ! If VSL_INIT_METHOD_LEAPFROG is not supported then initialization routine
  138. ! must return VSL_RNG_ERROR_LEAPFROG_UNSUPPORTED error code.
  139. !
  140. ! If VSL_INIT_METHOD_SKIPAHEAD is not supported then initialization routine
  141. ! must return VSL_RNG_ERROR_SKIPAHEAD_UNSUPPORTED error code.
  142. !
  143. ! If VSL_INIT_METHOD_SKIPAHEADEX is not supported then initialization routine
  144. ! must return VSL_RNG_ERROR_SKIPAHEADEX_UNSUPPORTED error code.
  145. !
  146. ! If there is no error during initialization, the initialization routine must
  147. ! return VSL_ERROR_OK code.
  148. INTEGER(KIND=4) VSL_INIT_METHOD_STANDARD
  149. INTEGER(KIND=4) VSL_INIT_METHOD_LEAPFROG
  150. INTEGER(KIND=4) VSL_INIT_METHOD_SKIPAHEAD
  151. INTEGER(KIND=4) VSL_INIT_METHOD_SKIPAHEADEX
  152. PARAMETER (VSL_INIT_METHOD_STANDARD = 0)
  153. PARAMETER (VSL_INIT_METHOD_LEAPFROG = 1)
  154. PARAMETER (VSL_INIT_METHOD_SKIPAHEAD = 2)
  155. PARAMETER (VSL_INIT_METHOD_SKIPAHEADEX = 3)
  156. !++
  157. ! TRANSFORMATION METHOD NAMES FOR DISTRIBUTION RANDOM NUMBER GENERATORS
  158. ! VSL interface allows more than one generation method in a distribution
  159. ! transformation subroutine. Following macro definitions are used to
  160. ! specify generation method for given distribution generator.
  161. !
  162. ! Method name macro is constructed as
  163. !
  164. ! VSL_METHOD_<Precision><Distribution>_<Method>
  165. !
  166. ! where
  167. !
  168. ! <Precision> - S (single precision) or D (double precision)
  169. ! <Distribution> - probability distribution
  170. ! <Method> - method name
  171. !
  172. ! VSL_METHOD_<Precision><Distribution>_<Method> should be used with
  173. ! vsl<precision>Rng<Distribution> function only, where
  174. !
  175. ! <precision> - s (single) or d (double)
  176. ! <Distribution> - probability distribution
  177. !--
  178. ! Uniform
  179. !
  180. ! <Method> <Short Description>
  181. ! STD standard method. Currently there is only one method for this
  182. ! distribution generator
  183. INTEGER VSL_RNG_METHOD_SUNIFORM_STD
  184. INTEGER VSL_RNG_METHOD_DUNIFORM_STD
  185. INTEGER VSL_RNG_METHOD_IUNIFORM_STD
  186. PARAMETER (VSL_RNG_METHOD_SUNIFORM_STD = 0)
  187. PARAMETER (VSL_RNG_METHOD_DUNIFORM_STD = 0)
  188. PARAMETER (VSL_RNG_METHOD_IUNIFORM_STD = 0)
  189. ! Uniform Bits
  190. !
  191. ! <Method> <Short Description>
  192. ! STD standard method. Currently there is only one method for this
  193. ! distribution generator
  194. INTEGER VSL_RNG_METHOD_IUNIFORMBITS_STD
  195. PARAMETER (VSL_RNG_METHOD_IUNIFORMBITS_STD = 0)
  196. ! Gaussian
  197. !
  198. ! <Method> <Short Description>
  199. ! BOXMULLER generates normally distributed random number x thru the pair of
  200. ! uniformly distributed numbers u1 and u2 according to the formula:
  201. !
  202. ! x=sqrt(-ln(u1))*sin(2*Pi*u2)
  203. !
  204. ! BOXMULLER2 generates pair of normally distributed random numbers x1 and x2
  205. ! thru the pair of uniformly dustributed numbers u1 and u2
  206. ! according to the formula
  207. !
  208. ! x1=sqrt(-ln(u1))*sin(2*Pi*u2)
  209. ! x2=sqrt(-ln(u1))*cos(2*Pi*u2)
  210. !
  211. ! NOTE: implementation correctly works with odd vector lengths
  212. !
  213. ! ICDF inverse cumulative distribution function method
  214. INTEGER VSL_RNG_METHOD_SGAUSSIAN_BOXMULLER
  215. INTEGER VSL_RNG_METHOD_SGAUSSIAN_BOXMULLER2
  216. INTEGER VSL_RNG_METHOD_SGAUSSIAN_ICDF
  217. INTEGER VSL_RNG_METHOD_DGAUSSIAN_BOXMULLER
  218. INTEGER VSL_RNG_METHOD_DGAUSSIAN_BOXMULLER2
  219. INTEGER VSL_RNG_METHOD_DGAUSSIAN_ICDF
  220. PARAMETER (VSL_RNG_METHOD_SGAUSSIAN_BOXMULLER = 0)
  221. PARAMETER (VSL_RNG_METHOD_SGAUSSIAN_BOXMULLER2 = 1)
  222. PARAMETER (VSL_RNG_METHOD_SGAUSSIAN_ICDF = 2)
  223. PARAMETER (VSL_RNG_METHOD_DGAUSSIAN_BOXMULLER = 0)
  224. PARAMETER (VSL_RNG_METHOD_DGAUSSIAN_BOXMULLER2 = 1)
  225. PARAMETER (VSL_RNG_METHOD_DGAUSSIAN_ICDF = 2)
  226. ! GaussianMV - multivariate (correlated) normal
  227. ! Multivariate (correlated) normal random number generator is based on
  228. ! uncorrelated Gaussian random number generator (see vslsRngGaussian and
  229. ! vsldRngGaussian functions):
  230. !
  231. ! <Method> <Short Description>
  232. ! BOXMULLER generates normally distributed random number x thru the pair of
  233. ! uniformly distributed numbers u1 and u2 according to the formula:
  234. !
  235. ! x=sqrt(-ln(u1))*sin(2*Pi*u2)
  236. !
  237. ! BOXMULLER2 generates pair of normally distributed random numbers x1 and x2
  238. ! thru the pair of uniformly dustributed numbers u1 and u2
  239. ! according to the formula
  240. !
  241. ! x1=sqrt(-ln(u1))*sin(2*Pi*u2)
  242. ! x2=sqrt(-ln(u1))*cos(2*Pi*u2)
  243. !
  244. ! NOTE: implementation correctly works with odd vector lengths
  245. !
  246. ! ICDF inverse cumulative distribution function method
  247. INTEGER VSL_RNG_METHOD_SGAUSSIANMV_BOXMULLER
  248. INTEGER VSL_RNG_METHOD_SGAUSSIANMV_BOXMULLER2
  249. INTEGER VSL_RNG_METHOD_SGAUSSIANMV_ICDF
  250. INTEGER VSL_RNG_METHOD_DGAUSSIANMV_BOXMULLER
  251. INTEGER VSL_RNG_METHOD_DGAUSSIANMV_BOXMULLER2
  252. INTEGER VSL_RNG_METHOD_DGAUSSIANMV_ICDF
  253. PARAMETER (VSL_RNG_METHOD_SGAUSSIANMV_BOXMULLER = 0)
  254. PARAMETER (VSL_RNG_METHOD_SGAUSSIANMV_BOXMULLER2 = 1)
  255. PARAMETER (VSL_RNG_METHOD_SGAUSSIANMV_ICDF = 2)
  256. PARAMETER (VSL_RNG_METHOD_DGAUSSIANMV_BOXMULLER = 0)
  257. PARAMETER (VSL_RNG_METHOD_DGAUSSIANMV_BOXMULLER2 = 1)
  258. PARAMETER (VSL_RNG_METHOD_DGAUSSIANMV_ICDF = 2)
  259. ! Exponential
  260. !
  261. ! <Method> <Short Description>
  262. ! ICDF inverse cumulative distribution function method
  263. INTEGER VSL_RNG_METHOD_SEXPONENTIAL_ICDF
  264. INTEGER VSL_RNG_METHOD_DEXPONENTIAL_ICDF
  265. PARAMETER (VSL_RNG_METHOD_SEXPONENTIAL_ICDF = 0)
  266. PARAMETER (VSL_RNG_METHOD_DEXPONENTIAL_ICDF = 0)
  267. ! Laplace
  268. !
  269. ! <Method> <Short Description>
  270. ! ICDF inverse cumulative distribution function method
  271. !
  272. ! ICDF - inverse cumulative distribution function method:
  273. !
  274. ! x=+/-ln(u) with probability 1/2,
  275. !
  276. ! where
  277. !
  278. ! x - random number with Laplace distribution,
  279. ! u - uniformly distributed random number
  280. INTEGER VSL_RNG_METHOD_SLAPLACE_ICDF
  281. INTEGER VSL_RNG_METHOD_DLAPLACE_ICDF
  282. PARAMETER (VSL_RNG_METHOD_SLAPLACE_ICDF = 0)
  283. PARAMETER (VSL_RNG_METHOD_DLAPLACE_ICDF = 0)
  284. ! Weibull
  285. !
  286. ! <Method> <Short Description>
  287. ! ICDF inverse cumulative distribution function method
  288. INTEGER VSL_RNG_METHOD_SWEIBULL_ICDF
  289. INTEGER VSL_RNG_METHOD_DWEIBULL_ICDF
  290. PARAMETER (VSL_RNG_METHOD_SWEIBULL_ICDF = 0)
  291. PARAMETER (VSL_RNG_METHOD_DWEIBULL_ICDF = 0)
  292. ! Cauchy
  293. !
  294. ! <Method> <Short Description>
  295. ! ICDF inverse cumulative distribution function method
  296. INTEGER VSL_RNG_METHOD_SCAUCHY_ICDF
  297. INTEGER VSL_RNG_METHOD_DCAUCHY_ICDF
  298. PARAMETER (VSL_RNG_METHOD_SCAUCHY_ICDF = 0)
  299. PARAMETER (VSL_RNG_METHOD_DCAUCHY_ICDF = 0)
  300. ! Rayleigh
  301. !
  302. ! <Method> <Short Description>
  303. ! ICDF inverse cumulative distribution function method
  304. INTEGER VSL_RNG_METHOD_SRAYLEIGH_ICDF
  305. INTEGER VSL_RNG_METHOD_DRAYLEIGH_ICDF
  306. PARAMETER (VSL_RNG_METHOD_SRAYLEIGH_ICDF = 0)
  307. PARAMETER (VSL_RNG_METHOD_DRAYLEIGH_ICDF = 0)
  308. ! Lognormal
  309. !
  310. ! <Method> <Short Description>
  311. ! ICDF inverse cumulative distribution function method
  312. INTEGER VSL_RNG_METHOD_SLOGNORMAL_ICDF
  313. INTEGER VSL_RNG_METHOD_DLOGNORMAL_ICDF
  314. PARAMETER (VSL_RNG_METHOD_SLOGNORMAL_ICDF = 0)
  315. PARAMETER (VSL_RNG_METHOD_DLOGNORMAL_ICDF = 0)
  316. ! Gumbel
  317. !
  318. ! <Method> <Short Description>
  319. ! ICDF inverse cumulative distribution function method
  320. INTEGER VSL_RNG_METHOD_SGUMBEL_ICDF
  321. INTEGER VSL_RNG_METHOD_DGUMBEL_ICDF
  322. PARAMETER (VSL_RNG_METHOD_SGUMBEL_ICDF = 0)
  323. PARAMETER (VSL_RNG_METHOD_DGUMBEL_ICDF = 0)
  324. ! Bernoulli
  325. !
  326. ! <Method> <Short Description>
  327. ! ICDF inverse cumulative distribution function method
  328. INTEGER VSL_RNG_METHOD_IBERNOULLI_ICDF
  329. PARAMETER (VSL_RNG_METHOD_IBERNOULLI_ICDF = 0)
  330. ! Geometric
  331. !
  332. ! <Method> <Short Description>
  333. ! ICDF inverse cumulative distribution function method
  334. INTEGER VSL_RNG_METHOD_IGEOMETRIC_ICDF
  335. PARAMETER (VSL_RNG_METHOD_IGEOMETRIC_ICDF = 0)
  336. ! Binomial
  337. !
  338. ! <Method> <Short Description>
  339. ! BTPE for ntrial*min(p,1-p)>30 acceptance/rejection method with
  340. ! decomposition onto 4 regions:
  341. !
  342. ! * 2 parallelograms;
  343. ! * triangle;
  344. ! * left exponential tail;
  345. ! * right exponential tail.
  346. !
  347. ! othewise table lookup method is used
  348. INTEGER VSL_RNG_METHOD_IBINOMIAL_BTPE
  349. PARAMETER (VSL_RNG_METHOD_IBINOMIAL_BTPE = 0)
  350. ! Multinomial
  351. !
  352. ! <Method> <Short Description>
  353. ! MULTPOISSON Poisson Approximation of Multinomial Distribution method
  354. INTEGER VSL_RNG_METHOD_MULTINOMIAL_MULTPOISSON
  355. PARAMETER (VSL_RNG_METHOD_MULTINOMIAL_MULTPOISSON = 0)
  356. ! Hypergeometric
  357. !
  358. ! <Method> <Short Description>
  359. ! H2PE if mode of distribution is large, acceptance/rejection method is
  360. ! used with decomposition onto 3 regions:
  361. !
  362. ! * rectangular;
  363. ! * left exponential tail;
  364. ! * right exponential tail.
  365. !
  366. ! othewise table lookup method is used
  367. INTEGER VSL_RNG_METHOD_IHYPERGEOMETRIC_H2PE
  368. PARAMETER (VSL_RNG_METHOD_IHYPERGEOMETRIC_H2PE = 0)
  369. ! Poisson
  370. !
  371. ! <Method> <Short Description>
  372. ! PTPE if lambda>=27, acceptance/rejection method is used with
  373. ! decomposition onto 4 regions:
  374. !
  375. ! * 2 parallelograms;
  376. ! * triangle;
  377. ! * left exponential tail;
  378. ! * right exponential tail.
  379. !
  380. ! othewise table lookup method is used
  381. !
  382. ! POISNORM for lambda>=1 method is based on Poisson inverse CDF
  383. ! approximation by Gaussian inverse CDF; for lambda<1
  384. ! table lookup method is used.
  385. INTEGER VSL_RNG_METHOD_IPOISSON_PTPE
  386. INTEGER VSL_RNG_METHOD_IPOISSON_POISNORM
  387. PARAMETER (VSL_RNG_METHOD_IPOISSON_PTPE = 0)
  388. PARAMETER (VSL_RNG_METHOD_IPOISSON_POISNORM = 1)
  389. ! Poisson
  390. !
  391. ! <Method> <Short Description>
  392. ! POISNORM for lambda>=1 method is based on Poisson inverse CDF
  393. ! approximation by Gaussian inverse CDF; for lambda<1
  394. ! ICDF method is used.
  395. INTEGER VSL_RNG_METHOD_IPOISSONV_POISNORM
  396. PARAMETER (VSL_RNG_METHOD_IPOISSONV_POISNORM = 0)
  397. ! Negbinomial
  398. !
  399. ! <Method> <Short Description>
  400. ! NBAR if (a-1)*(1-p)/p>=100, acceptance/rejection method is used with
  401. ! decomposition onto 5 regions:
  402. !
  403. ! * rectangular;
  404. ! * 2 trapezoid;
  405. ! * left exponential tail;
  406. ! * right exponential tail.
  407. !
  408. ! othewise table lookup method is used.
  409. INTEGER VSL_RNG_METHOD_INEGBINOMIAL_NBAR
  410. PARAMETER (VSL_RNG_METHOD_INEGBINOMIAL_NBAR = 0)
  411. !++
  412. ! MATRIX STORAGE SCHEMES
  413. !--
  414. ! Some multivariate random number generators, e.g. GaussianMV, operate
  415. ! with matrix parameters. To optimize matrix parameters usage VSL offers
  416. ! following matrix storage schemes. (See VSL documentation for more details).
  417. !
  418. ! FULL - whole matrix is stored
  419. ! PACKED - lower/higher triangular matrix is packed in 1-dimensional array
  420. ! DIAGONAL - diagonal elements are packed in 1-dimensional array
  421. INTEGER(KIND=4) VSL_MATRIX_STORAGE_FULL
  422. INTEGER(KIND=4) VSL_MATRIX_STORAGE_PACKED
  423. INTEGER(KIND=4) VSL_MATRIX_STORAGE_DIAGONAL
  424. PARAMETER (VSL_MATRIX_STORAGE_FULL = 0)
  425. PARAMETER (VSL_MATRIX_STORAGE_PACKED = 1)
  426. PARAMETER (VSL_MATRIX_STORAGE_DIAGONAL = 2)
  427. !++
  428. ! TYPEDEFS
  429. !--
  430. ! VSL STREAM STATE POINTER
  431. ! This structure is to store VSL stream state address allocated by
  432. ! VSLNEWSTREAM subroutine.
  433. TYPE VSL_STREAM_STATE
  434. INTEGER(KIND=4) descriptor1
  435. INTEGER(KIND=4) descriptor2
  436. END TYPE VSL_STREAM_STATE
  437. ! BASIC RANDOM NUMBER GENERATOR PROPERTIES STRUCTURE
  438. ! The structure describes the properties of given basic generator, e.g. size
  439. ! of the stream state structure, pointers to function implementations, etc.
  440. !
  441. ! BRNG properties structure fields:
  442. ! StreamStateSize - size of the stream state structure (in bytes)
  443. ! WordSize - size of base word (in bytes). Typically this is 4 bytes.
  444. ! NSeeds - number of words necessary to describe generator's state
  445. ! NBits - number of bits actually used in base word. For example,
  446. ! only 31 least significant bits are actually used in
  447. ! basic random number generator MCG31m1 with 4-byte base
  448. ! word. NBits field is useful while interpreting random
  449. ! words as a sequence of random bits.
  450. ! IncludesZero - FALSE if 0 cannot be generated in integer-valued
  451. ! implementation; TRUE if 0 can be potentially generated in
  452. ! integer-valued implementation.
  453. ! InitStream - pointer to stream state initialization function
  454. ! sBRng - pointer to single precision implementation
  455. ! dBRng - pointer to double precision implementation
  456. ! iBRng - pointer to integer-value implementation
  457. TYPE VSL_BRNG_PROPERTIES
  458. INTEGER(KIND=4) streamstatesize
  459. INTEGER(KIND=4) nseeds
  460. INTEGER(KIND=4) includeszero
  461. INTEGER(KIND=4) wordsize
  462. INTEGER(KIND=4) nbits
  463. INTEGER(KIND=4) initstream
  464. INTEGER(KIND=4) sbrng
  465. INTEGER(KIND=4) dbrng
  466. INTEGER(KIND=4) ibrng
  467. END TYPE VSL_BRNG_PROPERTIES
  468. END MODULE MKL_VSL_TYPE
  469. MODULE MKL_VSL
  470. USE MKL_VSL_TYPE
  471. !++
  472. ! VSL CONTINUOUS DISTRIBUTION GENERATOR FUNCTION INTERFACES.
  473. !--
  474. ! Uniform distribution
  475. INTERFACE
  476. SUBROUTINE vsrnguniform( method, stream, n, r, a, b )
  477. USE MKL_VSL_TYPE
  478. INTEGER,INTENT(IN) :: method
  479. TYPE(VSL_STREAM_STATE) :: stream
  480. INTEGER,INTENT(IN) :: n
  481. REAL(KIND=4),INTENT(OUT) :: r(n)
  482. REAL(KIND=4),INTENT(IN) :: a
  483. REAL(KIND=4),INTENT(IN) :: b
  484. END SUBROUTINE
  485. END INTERFACE
  486. INTERFACE
  487. SUBROUTINE vdrnguniform( method, stream, n, r, a, b )
  488. USE MKL_VSL_TYPE
  489. INTEGER,INTENT(IN) :: method
  490. TYPE(VSL_STREAM_STATE) :: stream
  491. INTEGER,INTENT(IN) :: n
  492. REAL(KIND=8),INTENT(OUT) :: r(n)
  493. REAL(KIND=8),INTENT(IN) :: a
  494. REAL(KIND=8),INTENT(IN) :: b
  495. END SUBROUTINE
  496. END INTERFACE
  497. ! Gaussian distribution
  498. INTERFACE
  499. SUBROUTINE vsrnggaussian( method, stream, n, r, a, sigma )
  500. USE MKL_VSL_TYPE
  501. INTEGER,INTENT(IN) :: method
  502. TYPE(VSL_STREAM_STATE) :: stream
  503. INTEGER,INTENT(IN) :: n
  504. REAL(KIND=4),INTENT(OUT) :: r(n)
  505. REAL(KIND=4),INTENT(IN) :: a
  506. REAL(KIND=4),INTENT(IN) :: sigma
  507. END SUBROUTINE
  508. END INTERFACE
  509. INTERFACE
  510. SUBROUTINE vdrnggaussian( method, stream, n, r, a, sigma )
  511. USE MKL_VSL_TYPE
  512. INTEGER,INTENT(IN) :: method
  513. TYPE(VSL_STREAM_STATE) :: stream
  514. INTEGER,INTENT(IN) :: n
  515. REAL(KIND=8),INTENT(OUT) :: r(n)
  516. REAL(KIND=8),INTENT(IN) :: a
  517. REAL(KIND=8),INTENT(IN) :: sigma
  518. END SUBROUTINE
  519. END INTERFACE
  520. ! GaussianMV distribution
  521. INTERFACE
  522. SUBROUTINE vsrnggaussianmv( method, stream, n, r, dimen, &
  523. & mstorage, a, t )
  524. USE MKL_VSL_TYPE
  525. INTEGER,INTENT(IN) :: method
  526. TYPE(VSL_STREAM_STATE) :: stream
  527. INTEGER,INTENT(IN) :: n
  528. INTEGER(KIND=4),INTENT(IN) :: dimen
  529. REAL(KIND=4),INTENT(OUT) :: r(dimen,n)
  530. INTEGER(KIND=4),INTENT(IN) :: mstorage
  531. REAL(KIND=4),INTENT(IN) :: a(dimen)
  532. REAL(KIND=4),INTENT(IN) :: t(dimen,dimen)
  533. END SUBROUTINE
  534. END INTERFACE
  535. INTERFACE
  536. SUBROUTINE vdrnggaussianmv( method, stream, n, r, dimen, &
  537. & mstorage, a, t )
  538. USE MKL_VSL_TYPE
  539. INTEGER,INTENT(IN) :: method
  540. TYPE(VSL_STREAM_STATE) :: stream
  541. INTEGER,INTENT(IN) :: n
  542. REAL(KIND=8),INTENT(OUT) :: r(n)
  543. INTEGER(KIND=4),INTENT(IN) :: dimen
  544. INTEGER(KIND=4),INTENT(IN) :: mstorage
  545. REAL(KIND=8),INTENT(IN) :: a(dimen)
  546. REAL(KIND=8),INTENT(IN) :: t(dimen,dimen)
  547. END SUBROUTINE
  548. END INTERFACE
  549. ! Exponential distribution
  550. INTERFACE
  551. SUBROUTINE vsrngexponential( method, stream, n, r, a, &
  552. & beta )
  553. USE MKL_VSL_TYPE
  554. INTEGER,INTENT(IN) :: method
  555. TYPE(VSL_STREAM_STATE) :: stream
  556. INTEGER,INTENT(IN) :: n
  557. REAL(KIND=4),INTENT(OUT) :: r(n)
  558. REAL(KIND=4),INTENT(IN) :: a
  559. REAL(KIND=4),INTENT(IN) :: beta
  560. END SUBROUTINE
  561. END INTERFACE
  562. INTERFACE
  563. SUBROUTINE vdrngexponential( method, stream, n, r, a, &
  564. & beta )
  565. USE MKL_VSL_TYPE
  566. INTEGER,INTENT(IN) :: method
  567. TYPE(VSL_STREAM_STATE) :: stream
  568. INTEGER,INTENT(IN) :: n
  569. REAL(KIND=8),INTENT(OUT) :: r(n)
  570. REAL(KIND=8),INTENT(IN) :: a
  571. REAL(KIND=8),INTENT(IN) :: beta
  572. END SUBROUTINE
  573. END INTERFACE
  574. ! Laplace distribution
  575. INTERFACE
  576. SUBROUTINE vsrnglaplace( method, stream, n, r, a, beta )
  577. USE MKL_VSL_TYPE
  578. INTEGER,INTENT(IN) :: method
  579. TYPE(VSL_STREAM_STATE) :: stream
  580. INTEGER,INTENT(IN) :: n
  581. REAL(KIND=4),INTENT(OUT) :: r(n)
  582. REAL(KIND=4),INTENT(IN) :: a
  583. REAL(KIND=4),INTENT(IN) :: beta
  584. END SUBROUTINE
  585. END INTERFACE
  586. INTERFACE
  587. SUBROUTINE vdrnglaplace( method, stream, n, r, a, beta )
  588. USE MKL_VSL_TYPE
  589. INTEGER,INTENT(IN) :: method
  590. TYPE(VSL_STREAM_STATE) :: stream
  591. INTEGER,INTENT(IN) :: n
  592. REAL(KIND=8),INTENT(OUT) :: r(n)
  593. REAL(KIND=8),INTENT(IN) :: a
  594. REAL(KIND=8),INTENT(IN) :: beta
  595. END SUBROUTINE
  596. END INTERFACE
  597. ! Weibull distribution
  598. INTERFACE
  599. SUBROUTINE vsrngweibull( method, stream, n, r, alpha, a, &
  600. & beta )
  601. USE MKL_VSL_TYPE
  602. INTEGER,INTENT(IN) :: method
  603. TYPE(VSL_STREAM_STATE) :: stream
  604. INTEGER,INTENT(IN) :: n
  605. REAL(KIND=4),INTENT(OUT) :: r(n)
  606. REAL(KIND=4),INTENT(IN) :: alpha
  607. REAL(KIND=4),INTENT(IN) :: a
  608. REAL(KIND=4),INTENT(IN) :: beta
  609. END SUBROUTINE
  610. END INTERFACE
  611. INTERFACE
  612. SUBROUTINE vdrngweibull( method, stream, n, r, alpha, a, &
  613. & beta )
  614. USE MKL_VSL_TYPE
  615. INTEGER,INTENT(IN) :: method
  616. TYPE(VSL_STREAM_STATE) :: stream
  617. INTEGER,INTENT(IN) :: n
  618. REAL(KIND=8),INTENT(OUT) :: r(n)
  619. REAL(KIND=8),INTENT(IN) :: alpha
  620. REAL(KIND=8),INTENT(IN) :: a
  621. REAL(KIND=8),INTENT(IN) :: beta
  622. END SUBROUTINE
  623. END INTERFACE
  624. ! Cauchy distribution
  625. INTERFACE
  626. SUBROUTINE vsrngcauchy( method, stream, n, r, a, beta )
  627. USE MKL_VSL_TYPE
  628. INTEGER,INTENT(IN) :: method
  629. TYPE(VSL_STREAM_STATE) :: stream
  630. INTEGER,INTENT(IN) :: n
  631. REAL(KIND=4),INTENT(OUT) :: r(n)
  632. REAL(KIND=4),INTENT(IN) :: a
  633. REAL(KIND=4),INTENT(IN) :: beta
  634. END SUBROUTINE
  635. END INTERFACE
  636. INTERFACE
  637. SUBROUTINE vdrngcauchy( method, stream, n, r, a, beta )
  638. USE MKL_VSL_TYPE
  639. INTEGER,INTENT(IN) :: method
  640. TYPE(VSL_STREAM_STATE) :: stream
  641. INTEGER,INTENT(IN) :: n
  642. REAL(KIND=8),INTENT(OUT) :: r(n)
  643. REAL(KIND=8),INTENT(IN) :: a
  644. REAL(KIND=8),INTENT(IN) :: beta
  645. END SUBROUTINE
  646. END INTERFACE
  647. ! Rayleigh distribution
  648. INTERFACE
  649. SUBROUTINE vsrngrayleigh( method, stream, n, r, a, beta )
  650. USE MKL_VSL_TYPE
  651. INTEGER,INTENT(IN) :: method
  652. TYPE(VSL_STREAM_STATE) :: stream
  653. INTEGER,INTENT(IN) :: n
  654. REAL(KIND=4),INTENT(OUT) :: r(n)
  655. REAL(KIND=4),INTENT(IN) :: a
  656. REAL(KIND=4),INTENT(IN) :: beta
  657. END SUBROUTINE
  658. END INTERFACE
  659. INTERFACE
  660. SUBROUTINE vdrngrayleigh( method, stream, n, r, a, beta )
  661. USE MKL_VSL_TYPE
  662. INTEGER,INTENT(IN) :: method
  663. TYPE(VSL_STREAM_STATE) :: stream
  664. INTEGER,INTENT(IN) :: n
  665. REAL(KIND=8),INTENT(OUT) :: r(n)
  666. REAL(KIND=8),INTENT(IN) :: a
  667. REAL(KIND=8),INTENT(IN) :: beta
  668. END SUBROUTINE
  669. END INTERFACE
  670. ! Lognormal distribution
  671. INTERFACE
  672. SUBROUTINE vsrnglognormal( method, stream, n, r, a, sigma, &
  673. & b, beta )
  674. USE MKL_VSL_TYPE
  675. INTEGER,INTENT(IN) :: method
  676. TYPE(VSL_STREAM_STATE) :: stream
  677. INTEGER,INTENT(IN) :: n
  678. REAL(KIND=4),INTENT(OUT) :: r(n)
  679. REAL(KIND=4),INTENT(IN) :: a
  680. REAL(KIND=4),INTENT(IN) :: sigma
  681. REAL(KIND=4),INTENT(IN) :: b
  682. REAL(KIND=4),INTENT(IN) :: beta
  683. END SUBROUTINE
  684. END INTERFACE
  685. INTERFACE
  686. SUBROUTINE vdrnglognormal( method, stream, n, r, a, sigma, &
  687. & b, beta )
  688. USE MKL_VSL_TYPE
  689. INTEGER,INTENT(IN) :: method
  690. TYPE(VSL_STREAM_STATE) :: stream
  691. INTEGER,INTENT(IN) :: n
  692. REAL(KIND=8),INTENT(OUT) :: r(n)
  693. REAL(KIND=8),INTENT(IN) :: a
  694. REAL(KIND=8),INTENT(IN) :: sigma
  695. REAL(KIND=8),INTENT(IN) :: b
  696. REAL(KIND=8),INTENT(IN) :: beta
  697. END SUBROUTINE
  698. END INTERFACE
  699. ! Gumbel distribution
  700. INTERFACE
  701. SUBROUTINE vsrnggumbel( method, stream, n, r, a, beta )
  702. USE MKL_VSL_TYPE
  703. INTEGER,INTENT(IN) :: method
  704. TYPE(VSL_STREAM_STATE) :: stream
  705. INTEGER,INTENT(IN) :: n
  706. REAL(KIND=4),INTENT(OUT) :: r(n)
  707. REAL(KIND=4),INTENT(IN) :: a
  708. REAL(KIND=4),INTENT(IN) :: beta
  709. END SUBROUTINE
  710. END INTERFACE
  711. INTERFACE
  712. SUBROUTINE vdrnggumbel( method, stream, n, r, a, beta )
  713. USE MKL_VSL_TYPE
  714. INTEGER,INTENT(IN) :: method
  715. TYPE(VSL_STREAM_STATE) :: stream
  716. INTEGER,INTENT(IN) :: n
  717. REAL(KIND=8),INTENT(OUT) :: r(n)
  718. REAL(KIND=8),INTENT(IN) :: a
  719. REAL(KIND=8),INTENT(IN) :: beta
  720. END SUBROUTINE
  721. END INTERFACE
  722. !++
  723. ! VSL DISCRETE DISTRIBUTION GENERATOR FUNCTION INTERFACES.
  724. !--
  725. ! Uniform distribution
  726. INTERFACE
  727. SUBROUTINE virnguniform( method, stream, n, r, a, b )
  728. USE MKL_VSL_TYPE
  729. INTEGER,INTENT(IN) :: method
  730. TYPE(VSL_STREAM_STATE) :: stream
  731. INTEGER,INTENT(IN) :: n
  732. INTEGER(KIND=4),INTENT(OUT) :: r(n)
  733. INTEGER(KIND=4),INTENT(IN) :: a
  734. INTEGER(KIND=4),INTENT(IN) :: b
  735. END SUBROUTINE
  736. END INTERFACE
  737. ! UniformBits distribution
  738. INTERFACE
  739. SUBROUTINE virnguniformbits( method, stream, n, r )
  740. USE MKL_VSL_TYPE
  741. INTEGER,INTENT(IN) :: method
  742. TYPE(VSL_STREAM_STATE) :: stream
  743. INTEGER,INTENT(IN) :: n
  744. INTEGER(KIND=4),INTENT(OUT) :: r(n)
  745. END SUBROUTINE
  746. END INTERFACE
  747. ! Bernoulli distribution
  748. INTERFACE
  749. SUBROUTINE virngbernoulli( method, stream, n, r, p )
  750. USE MKL_VSL_TYPE
  751. INTEGER,INTENT(IN) :: method
  752. TYPE(VSL_STREAM_STATE) :: stream
  753. INTEGER,INTENT(IN) :: n
  754. INTEGER(KIND=4),INTENT(OUT) :: r(n)
  755. REAL(KIND=8),INTENT(IN) :: p
  756. END SUBROUTINE
  757. END INTERFACE
  758. ! Geometric distribution
  759. INTERFACE
  760. SUBROUTINE virnggeometric( method, stream, n, r, p )
  761. USE MKL_VSL_TYPE
  762. INTEGER,INTENT(IN) :: method
  763. TYPE(VSL_STREAM_STATE) :: stream
  764. INTEGER,INTENT(IN) :: n
  765. INTEGER(KIND=4),INTENT(OUT) :: r(n)
  766. REAL(KIND=8),INTENT(IN) :: p
  767. END SUBROUTINE
  768. END INTERFACE
  769. ! Binomial distribution
  770. INTERFACE
  771. SUBROUTINE virngbinomial(method, stream, n, r, ntrial, p)
  772. USE MKL_VSL_TYPE
  773. INTEGER,INTENT(IN) :: method
  774. TYPE(VSL_STREAM_STATE) :: stream
  775. INTEGER,INTENT(IN) :: n
  776. INTEGER(KIND=4),INTENT(OUT) :: r(n)
  777. INTEGER(KIND=4),INTENT(IN) :: ntrial
  778. REAL(KIND=8),INTENT(IN) :: p
  779. END SUBROUTINE
  780. END INTERFACE
  781. ! Multinomial distribution
  782. INTERFACE
  783. INTEGER FUNCTION virngmultinomial(method, stream, n, r, ntrial, &
  784. & k, p)
  785. USE MKL_VSL_TYPE
  786. INTEGER,INTENT(IN) :: method
  787. TYPE(VSL_STREAM_STATE) :: stream
  788. INTEGER,INTENT(IN) :: n
  789. INTEGER(KIND=4),INTENT(OUT) :: r(n)
  790. INTEGER(KIND=4),INTENT(IN) :: ntrial
  791. INTEGER(KIND=4),INTENT(IN) :: k
  792. REAL(KIND=8),INTENT(IN) :: p(k)
  793. END FUNCTION
  794. END INTERFACE
  795. ! Hypergeometric distribution
  796. INTERFACE
  797. SUBROUTINE virnghypergeometric( method, stream, n, r, l, &
  798. & s, m )
  799. USE MKL_VSL_TYPE
  800. INTEGER,INTENT(IN) :: method
  801. TYPE(VSL_STREAM_STATE) :: stream
  802. INTEGER,INTENT(IN) :: n
  803. INTEGER(KIND=4),INTENT(OUT) :: r(n)
  804. INTEGER(KIND=4),INTENT(IN) :: l
  805. INTEGER(KIND=4),INTENT(IN) :: s
  806. INTEGER(KIND=4),INTENT(IN) :: m
  807. END SUBROUTINE
  808. END INTERFACE
  809. ! Poisson distribution
  810. INTERFACE
  811. SUBROUTINE virngpoisson( method, stream, n, r, lambda )
  812. USE MKL_VSL_TYPE
  813. INTEGER,INTENT(IN) :: method
  814. TYPE(VSL_STREAM_STATE) :: stream
  815. INTEGER,INTENT(IN) :: n
  816. INTEGER(KIND=4),INTENT(OUT) :: r(n)
  817. REAL(KIND=8),INTENT(IN) :: lambda
  818. END SUBROUTINE
  819. END INTERFACE
  820. ! PoissonV distribution
  821. INTERFACE
  822. SUBROUTINE virngpoissonv( method, stream, n, r, lambda )
  823. USE MKL_VSL_TYPE
  824. INTEGER,INTENT(IN) :: method
  825. TYPE(VSL_STREAM_STATE) :: stream
  826. INTEGER,INTENT(IN) :: n
  827. INTEGER(KIND=4),INTENT(OUT) :: r(n)
  828. REAL(KIND=8),INTENT(IN) :: lambda(n)
  829. END SUBROUTINE
  830. END INTERFACE
  831. ! Negbinomial distribution
  832. INTERFACE
  833. SUBROUTINE virngnegbinomial( method, stream, n, r, a, p )
  834. USE MKL_VSL_TYPE
  835. INTEGER,INTENT(IN) :: method
  836. TYPE(VSL_STREAM_STATE) :: stream
  837. INTEGER,INTENT(IN) :: n
  838. INTEGER(KIND=4),INTENT(OUT) :: r(n)
  839. REAL(KIND=8),INTENT(IN) :: a
  840. REAL(KIND=8),INTENT(IN) :: p
  841. END SUBROUTINE
  842. END INTERFACE
  843. !++
  844. ! VSL SERVICE FUNCTION INTERFACES.
  845. !--
  846. ! NewStream - stream creation/initialization
  847. INTERFACE
  848. SUBROUTINE vslnewstream( stream, brng, seed )
  849. USE MKL_VSL_TYPE
  850. TYPE(VSL_STREAM_STATE) :: stream
  851. INTEGER(KIND=4),INTENT(IN) :: brng
  852. INTEGER(KIND=4),INTENT(IN) :: seed
  853. END SUBROUTINE
  854. END INTERFACE
  855. ! NewStreamEx - advanced stream creation/initialization
  856. INTERFACE
  857. SUBROUTINE vslnewstreamex( stream, brng, n, params )
  858. USE MKL_VSL_TYPE
  859. TYPE(VSL_STREAM_STATE) :: stream
  860. INTEGER(KIND=4),INTENT(IN) :: brng
  861. INTEGER(KIND=4),INTENT(IN) :: n
  862. INTEGER(KIND=4),INTENT(IN) :: params(n)
  863. END SUBROUTINE
  864. END INTERFACE
  865. ! DeleteStream - delete stream
  866. INTERFACE
  867. SUBROUTINE vsldeletestream( stream )
  868. USE MKL_VSL_TYPE
  869. TYPE(VSL_STREAM_STATE) :: stream
  870. END SUBROUTINE
  871. END INTERFACE
  872. ! CopyStream - copy all stream information
  873. INTERFACE
  874. SUBROUTINE vslcopystream( newstream, srcstream )
  875. USE MKL_VSL_TYPE
  876. TYPE(VSL_STREAM_STATE) :: newstream
  877. TYPE(VSL_STREAM_STATE) :: srcstream
  878. END SUBROUTINE
  879. END INTERFACE
  880. ! CopyStreamState - copy stream state only
  881. INTERFACE
  882. SUBROUTINE vslcopystreamstate( deststream, srcstream )
  883. USE MKL_VSL_TYPE
  884. TYPE(VSL_STREAM_STATE) :: deststream
  885. TYPE(VSL_STREAM_STATE) :: srcstream
  886. END SUBROUTINE
  887. END INTERFACE
  888. ! LeapfrogStream - leapfrog method
  889. INTERFACE
  890. SUBROUTINE vslleapfrogstream( stream, k, nstreams )
  891. USE MKL_VSL_TYPE
  892. TYPE(VSL_STREAM_STATE) :: stream
  893. INTEGER(KIND=4),INTENT(IN) :: k
  894. INTEGER(KIND=4),INTENT(IN) :: nstreams
  895. END SUBROUTINE
  896. END INTERFACE
  897. ! SkipAheadStream - skip-ahead method
  898. INTERFACE
  899. SUBROUTINE vslskipaheadstream( stream, nskip )
  900. USE MKL_VSL_TYPE
  901. TYPE(VSL_STREAM_STATE) :: stream
  902. INTEGER(KIND=8),INTENT(IN) :: nskip
  903. END SUBROUTINE
  904. END INTERFACE
  905. ! SkipAheadStreamEx - skip-ahead extended method
  906. INTERFACE
  907. INTEGER FUNCTION vslskipaheadstreamex( stream, n, params )
  908. IMPORT VSL_STREAM_STATE
  909. TYPE(VSL_STREAM_STATE) :: stream
  910. INTEGER,INTENT(IN) :: n
  911. INTEGER(KIND=8),INTENT(IN) :: params(n)
  912. END FUNCTION
  913. END INTERFACE
  914. ! GetBrngProperties - get BRNG properties
  915. INTERFACE
  916. SUBROUTINE vslgetbrngproperties( brng, properties )
  917. USE MKL_VSL_TYPE
  918. INTEGER(KIND=4),INTENT(IN) :: brng
  919. TYPE(VSL_BRNG_PROPERTIES),INTENT(OUT) :: properties
  920. END SUBROUTINE
  921. END INTERFACE
  922. ! GetNumRegBrngs - get number of registered BRNGs
  923. INTERFACE
  924. INTEGER FUNCTION vslgetnumregbrngs( )
  925. END FUNCTION
  926. END INTERFACE
  927. ! GetStreamStateBrng - get BRNG associated with given stream
  928. INTERFACE
  929. INTEGER FUNCTION vslgetstreamstatebrng( stream )
  930. USE MKL_VSL_TYPE
  931. TYPE(VSL_STREAM_STATE) :: stream
  932. END FUNCTION
  933. END INTERFACE
  934. ! RegisterBrng - register new BRNG
  935. INTERFACE
  936. INTEGER FUNCTION vslregisterbrng( properties )
  937. USE MKL_VSL_TYPE
  938. TYPE(VSL_BRNG_PROPERTIES) :: properties
  939. END FUNCTION
  940. END INTERFACE
  941. END MODULE MKL_VSL