10 pthread_t *thread = (pthread_t *) malloc(
RUN_BATCH *
sizeof(pthread_t));
13 pthread_attr_init(&attr);
14 pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE);
21 maxarea = findMaxArea();
22 maxdist = findMaxDist();
27 for (
int t = 0; t <
Times; t++)
28 for (
int s = 0; s <
Spaces; s++) {
29 PSurv[t][s] = pSurvival(
Area[t][s] / maxarea);
30 for (
int s2 = 0; s2 <
Spaces; s2++)
31 PDisp[t][s][s2] = pDispersal(
Dist[t][s][s2] / maxdist);
37 printf(
"\n# SHIBA (Simulated Historical Island Biogeography Analysis)\n\n");
41 for (batch = 0; batch < (
long int)(
Cfg.maxRuns/
RUN_BATCH);batch++) {
44 pthread_create(&thread[i], &attr, biogeo, NULL);
48 pthread_join(thread[i], &status);
51 fprintf(stderr,
"\r> runs: %9ld; to present: %8ld; successes: %5ld",
52 batch * RUN_BATCH , topresent , success);
56 if (success >=
Cfg.stopAfterSuccess)
break;
60 fprintf(stderr,
"\n\n"); fflush(NULL);
61 printf(
"## Successes : %ld (in %ld runs)\n\n", success, batch * RUN_BATCH );
67 free(thread); free(status);
68 pthread_attr_destroy(&attr);
69 pthread_mutex_destroy(&mymutex);
83 double tot, max = 0.0;
84 for (
int t = 0; t <
Times; t++) {
86 for (
int a = 0; a <
Spaces; a++) tot +=
Area[t][a];
87 if (tot > max) max = tot;
95 for (
int t = 0; t <
Times; t++)
96 for (
int a = 0; a <
Spaces; a++)
97 for (
int b = 0; b <
Spaces; b++)
98 if (
Dist[t][a][b] > max) max =
Dist[t][a][b];
117 while (ss <
Cfg.nStartSpaces) {
118 int rnd = (int)((
double) Spaces * (double) random() /
119 (double)(RAND_MAX+1.0));
128 if ((!locn[0][0][rnd]) &&
129 (
Area[0][rnd] > 0.0) &&
140 for (
int t = 0; t < Times-1; t++) {
145 printf(
"t%d l%d : ", t, i);
146 for (
int x = 0; x <
Spaces; x++) printf(
"%d", locn[i][t][x]);
152 for (
int l = 0; l <
Lineages; l++) {
162 for (
int s = 0; s <
Spaces; s++) {
180 for (
int i = 0; i <
Spaces ; i++) {
181 if ( ( ((
double) random() / (
double)(RAND_MAX+1.0))
182 <
PDisp[t][s][i] ) && (i != s) && (
Area[t][i] > 0.0)) {
185 if (
Cfg.verbose==1) printf(
" l%d disperses from s%d to s%d\n",l,s,i);
196 if (((
double) random() / (
double)(RAND_MAX+1.0)) <
PSurv[t][s]) {
200 else if (
Cfg.verbose==1) printf(
201 " l%d goes locally extinct in s%d\n", l , s);
211 if (
Cfg.verbose==1) printf(
" l%d has died out\n",l);
212 if (
Cfg.verbose==1) printf(
"----------\n");
213 free3d_i(locn, Lineages, Times);
234 for (
int s = 0; s <
Spaces; s++)
235 if (locn[l][t+1][s]) {
236 placemapping[places] = s;
240 for (
int h = 0; h < places; h++) placeck[h] = 0;
258 int rnd = (int) ( (
double) places * (double) random() /
259 (double) (RAND_MAX+1.0));
261 if (fullplaces >= places) {
264 if (
Cfg.verbose==1) printf(
265 " l%d ends; l%d begins in s%d\n", l,
273 if (
Cfg.verbose==1) printf(
274 " l%d ends; l%d begins in s%d\n",
297 printf(
"t%d l%d : ", Times-1, i);
298 for (
int x = 0; x <
Spaces; x++) printf(
"%d", locn[i][Times-1][x]);
311 for (
int l = 0; l <
Lineages; l++) {
313 for (
int s = 0; s <
Spaces; s++) {
314 if (locn[l][Times-1][s] !=
LineageExtant[l][Times-1][s]) diffs++;
324 pthread_mutex_lock(&mymutex);
329 for (
int l = 0; l <
Lineages; l++) {
330 for (
int t = 0; t <
Times; t++) {
332 for (
int s = 0; s <
Spaces; s++)
333 record[l][s] += locn[l][t][s];
339 pthread_mutex_unlock(&mymutex);
341 if (
Cfg.verbose==1) printf(
"-----------\n");
343 free3d_i(locn, Lineages, Times);
348 void printSuccessAll(
phylo p)
350 printf(
"## Number of runs in which the base of each lineage was in each space:\n (*= extant distrib)\n\n");
353 for (
int k = 0; k <
Spaces; k++) printf(
" %3d ", k);
355 printf(
" ------------+--");
356 for (
int k = 0; k <
Spaces; k++) printf(
"-----");
359 for (
int i = 0; i <
Lineages; i++) {
360 printf(
" Lineage %3d | ", i);
361 for (
int k = 0; k <
Spaces; k++) {
363 printf(
" %3d*", record[i][k]);
364 else printf(
" %3d ", record[i][k]);
368 for(
int l = 0; l < LineageDaughtersN[i]; l++)
375 double pDispersal(
double x) {
376 return Cfg.probDispA * powf( 10.0, -1.0 *
Cfg.probDispB * x ) ;
379 double pSurvival(
double x) {
380 return Cfg.probSurvA * (log10f(( x * ( powf(10,
Cfg.probSurvB) -1.0 )) +1.0 )