source: issm/trunk-jpl/src/c/shared/Random/random.cpp@ 26482

Last change on this file since 26482 was 26482, checked in by vverjans, 3 years ago

CHG: compliance with ISSM coding guidelines, random noise computation uniform accross CPUs in Smbautoregression, remove duplicate code in OceanExchangeDatax

  • Property svn:executable set to *
File size: 2.5 KB
RevLine 
[26477]1/*!\file: random
2 * \brief random number generating functions
3 */
4
5/*Headers*/
6/*{{{*/
7#include <stdio.h>
8#include <sys/types.h>
9#include <math.h>
10#include <float.h> /* DBL_EPSILON */
11#include <chrono>
12#include <cstdarg>
13#include <iostream>
14#include <random>
15
16#include "../Matrix/matrix.h"
17#include "../Exceptions/exceptions.h"
18#include "../MemOps/MemOps.h"
19#include "../io/io.h"
20/*}}}*/
21
[26479]22void univariateNormal(IssmPDouble* prand, IssmPDouble mean, IssmPDouble sdev) { /*{{{*/
[26482]23
24 /*Random seed using time_since_epoch*/
25 unsigned seed = std::chrono::steady_clock::now().time_since_epoch().count();
26 std::default_random_engine generator(seed);
27 /*Normal Probability Distribution*/
28 std::normal_distribution<IssmPDouble> normdistri(mean,sdev);
[26477]29 *prand = normdistri(generator);
30} /*}}}*/
31void multivariateNormal(IssmDouble** prand, int dim, IssmDouble mean, IssmDouble* covariancematrix) { /*{{{*/
[26482]32
33 IssmPDouble* sampleStandardNormal = xNew<IssmPDouble>(dim);
[26477]34 IssmDouble* sampleMultivariateNormal = xNew<IssmDouble>(dim);
35 IssmDouble* Lchol = xNewZeroInit<IssmDouble>(dim*dim);
[26479]36
[26482]37 for(int i=0;i<dim;i++) univariateNormal(&(sampleStandardNormal[i]),0.0,1.0);
[26477]38 CholeskyRealPositiveDefinite(Lchol,covariancematrix,dim);
[26482]39
40 /*Matrix by vector multiplication*/
41 for(int i=0;i<dim;i++){
42 /*Entry-by-entry multiplication along matrix row*/
[26479]43 IssmDouble sum=0.;
[26482]44 for(int j=0;j<dim;j++) sum += sampleStandardNormal[j]*Lchol[i*dim+j];
45 sampleMultivariateNormal[i] = mean+sum;
[26477]46 }
[26479]47
48 /*Assign output pointer and cleanup*/
[26477]49 *prand = sampleMultivariateNormal;
[26479]50 xDelete<IssmPDouble>(sampleStandardNormal);
[26477]51 xDelete<IssmDouble>(Lchol);
52} /*}}}*/
53void multivariateNormal(IssmDouble** prand, int dim, IssmDouble* mean, IssmDouble* covariancematrix) { /*{{{*/
[26482]54
55 IssmPDouble* sampleStandardNormal = xNew<IssmPDouble>(dim);
[26477]56 IssmDouble* sampleMultivariateNormal = xNew<IssmDouble>(dim);
57 IssmDouble* Lchol = xNewZeroInit<IssmDouble>(dim*dim);
[26482]58 for(int i=0;i<dim;i++) univariateNormal(&(sampleStandardNormal[i]),0.0,1.0);
[26479]59
[26477]60 CholeskyRealPositiveDefinite(Lchol,covariancematrix,dim);
[26479]61
[26482]62 /*Matrix by vector multiplication*/
63 for(int i=0;i<dim;i++){
[26479]64 IssmDouble sum = 0.;
[26482]65 for(int j=0;j<dim;j++) sum += sampleStandardNormal[j]*Lchol[i*dim+j];
66 sampleMultivariateNormal[i] = mean[i]+sum;
[26477]67 }
[26482]68
69 /*Assign output pointer and cleanup*/
[26477]70 *prand = sampleMultivariateNormal;
[26479]71 xDelete<IssmPDouble>(sampleStandardNormal);
[26477]72 xDelete<IssmDouble>(Lchol);
73} /*}}}*/
74
75
76
Note: See TracBrowser for help on using the repository browser.