diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/lossdistrib.c | 18 |
1 files changed, 14 insertions, 4 deletions
diff --git a/src/lossdistrib.c b/src/lossdistrib.c index e09c9bf..7028e7f 100644 --- a/src/lossdistrib.c +++ b/src/lossdistrib.c @@ -518,12 +518,19 @@ void BCloss_recov_dist(const double *defaultprob, const int *dim1, const int *di for(int t = 0; t < (*dim2); t++) { memset(Lw, 0, (*N) * (*n) * sizeof(double)); memset(Rw, 0, (*N) * (*n) * sizeof(double)); + static double* gshocked; + static double* Sshocked; + static double* Rshocked; + #pragma omp threadprivate(gshocked, Sshocked, Rshocked) + #pragma omp parallel + { + gshocked = malloc((*dim1) * sizeof(double)); + Sshocked = malloc((*dim1) * sizeof(double)); + Rshocked = malloc((*dim1) * sizeof(double)); + } #pragma omp parallel for for(int i = 0; i < *n; i++) { - double* gshocked = malloc((*dim1) * sizeof(double)); - double* Sshocked = malloc((*dim1) * sizeof(double)); - double* Rshocked = malloc((*dim1) * sizeof(double)); - for(int j=0; j < (*dim1); j++) { + for(int j = 0; j < (*dim1); j++) { double g = defaultprob[j + (*dim1) * t]; gshocked[j] = shockprob(g, rho[j], Z[i], 0); Sshocked[j] = shockseverity(1-recov[j], Z[i], rho[j], g); @@ -533,6 +540,9 @@ void BCloss_recov_dist(const double *defaultprob, const int *dim1, const int *di Lw + i * (*N)); lossdistrib(gshocked, dim1, issuerweights, Rshocked , N, N, defaultflag, Rw + i * (*N)); + } + #pragma omp parallel + { free(gshocked); free(Sshocked); free(Rshocked); |
