209 |
return -1; |
return -1; |
210 |
} |
} |
211 |
|
|
212 |
omp_set_dynamic(0); |
// omp_set_dynamic(0); |
213 |
omp_set_nested(1); //permit the nested parallelization |
// omp_set_nested(1); //permit the nested parallelization |
214 |
while ( i < nvars) { |
while ( i < nvars) { |
215 |
if ((i + paral_tokens -1) >= nvars) |
if ((i + paral_tokens -1) >= nvars) |
216 |
paral_tokens = nvars - i; |
paral_tokens = nvars - i; |
217 |
#pragma omp parallel for num_threads(paral_tokens) private(k) //parallelize the parameters (numThr/2) |
#pragma omp parallel for num_threads(paral_tokens*2) private(k) //parallelize the parameters (numThr) |
218 |
for (j = 0; j < paral_tokens; ++j) { |
for (j = 0; j < (paral_tokens*2); ++j) { |
219 |
storage[j].z = z; |
storage[j].z = z; |
220 |
storage[j].delta = delta; |
storage[j].delta = delta; |
221 |
DoubleVector v1(z); |
DoubleVector v(z); |
|
DoubleVector v2(z); |
|
|
k = param[i+j]; |
|
|
v1[k] += delta[k]; |
|
|
v2[k] -= delta[k]; |
|
222 |
|
|
223 |
#pragma omp parallel sections num_threads(2) //parrallelize the +/- delta simulation for each parameter |
if (j<paral_tokens) { |
224 |
{ |
k = param[i+j]; |
225 |
#pragma omp section |
v[k] += delta[k]; |
|
{ |
|
|
storage[j].ftmp = EcoSystems[j]->SimulateAndUpdate(v1); |
|
|
} |
|
|
#pragma omp section |
|
|
{ |
|
|
storage[j+paral_tokens].ftmp = EcoSystems[j+paral_tokens]->SimulateAndUpdate(v2); |
|
226 |
} |
} |
227 |
|
else { |
228 |
|
k = param[i+j-paral_tokens]; |
229 |
|
v[k] -= delta[k]; |
230 |
} |
} |
231 |
|
|
232 |
|
storage[j].ftmp = EcoSystems[j]->SimulateAndUpdate(v); |
233 |
|
storage[j].z[k] = v[k]; |
234 |
|
} |
235 |
|
for (j = 0; j < paral_tokens; ++j) { |
236 |
|
k = param[i+j]; |
237 |
if (storage[j].ftmp < minf) { |
if (storage[j].ftmp < minf) { |
238 |
storage[j].iters = 1; |
storage[j].iters = 1; |
239 |
storage[j].z[k] = v1[k]; |
// storage[j].z[k] = v1[k]; |
240 |
} else { |
} else { |
241 |
storage[j].iters = 2; |
storage[j].iters = 2; |
242 |
storage[j].delta[k] = 0.0 - delta[k]; |
storage[j].delta[k] = 0.0 - delta[k]; |
243 |
if (storage[j+paral_tokens].ftmp < minf) { |
if (storage[j+paral_tokens].ftmp < minf) { |
244 |
storage[j].ftmp = storage[j+paral_tokens].ftmp; |
storage[j].ftmp = storage[j+paral_tokens].ftmp; |
245 |
storage[j].z[k] = v2[k]; |
storage[j].z[k] = storage[j+paral_tokens].z[k];; |
246 |
} |
} |
247 |
} |
} |
248 |
} |
} |
547 |
return -1; |
return -1; |
548 |
} |
} |
549 |
|
|
550 |
omp_set_dynamic(0); |
// omp_set_dynamic(0); |
551 |
omp_set_nested(1); //permit the nested parallelization |
// omp_set_nested(1); //permit the nested parallelization |
552 |
for (ii=0; ii< paral_tokens; ii++) { |
for (ii=0; ii< paral_tokens; ii++) { |
553 |
i = 0; |
i = 0; |
554 |
while ( i < nvars) { |
while ( i < nvars) { |
555 |
if ((i + paral_tokens -1) >= nvars) |
if ((i + paral_tokens -1) >= nvars) |
556 |
paral_tokens = nvars - i; |
paral_tokens = nvars - i; |
557 |
#pragma omp parallel for num_threads(paral_tokens) private(k) |
#pragma omp parallel for num_threads(paral_tokens*2) private(k) |
558 |
for (j = 0; j < paral_tokens; ++j) { |
for (j = 0; j < (paral_tokens*2); ++j) { |
559 |
storage[j].z = z; |
storage[j].z = z; |
560 |
storage[j].delta = delta; |
storage[j].delta = delta; |
561 |
DoubleVector v1(z); |
DoubleVector v(z); |
|
DoubleVector v2(z); |
|
|
k = param[i+j]; |
|
|
v1[k] += delta[k]; |
|
|
v2[k] -= delta[k]; |
|
562 |
|
|
563 |
#pragma omp parallel sections num_threads(2) |
if (j<paral_tokens) { |
564 |
{ |
k = param[i+j]; |
565 |
#pragma omp section |
v[k] += delta[k]; |
566 |
{ |
} |
567 |
storage[j].ftmp = EcoSystems[j]->SimulateAndUpdate(v1); |
else { |
568 |
} |
k = param[i+j-paral_tokens]; |
569 |
#pragma omp section |
v[k] -= delta[k]; |
|
{ |
|
|
storage[j+paral_tokens].ftmp = EcoSystems[j+paral_tokens]->SimulateAndUpdate(v2); |
|
570 |
} |
} |
571 |
|
|
572 |
|
storage[j].ftmp = EcoSystems[j]->SimulateAndUpdate(v); |
573 |
|
storage[j].z[k] = v[k]; |
574 |
} |
} |
575 |
|
|
576 |
|
for (j = 0; j < paral_tokens; ++j) { |
577 |
|
k = param[i+j]; |
578 |
if (storage[j].ftmp < minf) { |
if (storage[j].ftmp < minf) { |
579 |
storage[j].iters = 1; |
storage[j].iters = 1; |
580 |
storage[j].z[k] = v1[k]; |
// storage[j].z[k] = v1[k]; |
581 |
} else { |
} else { |
582 |
storage[j].iters = 2; |
storage[j].iters = 2; |
583 |
storage[j].delta[k] = 0.0 - delta[k]; |
storage[j].delta[k] = 0.0 - delta[k]; |
584 |
if (storage[j+paral_tokens].ftmp < minf) { |
if (storage[j+paral_tokens].ftmp < minf) { |
585 |
storage[j].ftmp = storage[j+paral_tokens].ftmp; |
storage[j].ftmp = storage[j+paral_tokens].ftmp; |
586 |
storage[j].z[k] = v2[k]; |
storage[j].z[k] = storage[j+paral_tokens].z[k]; |
587 |
} |
} |
588 |
else iters += 2; |
else iters += 2; |
589 |
} |
} |
603 |
|
|
604 |
i += paral_tokens; |
i += paral_tokens; |
605 |
} |
} |
606 |
|
paral_tokens = numThr / 2; |
607 |
} |
} |
608 |
|
|
609 |
delete[] storage; |
delete[] storage; |