Ejemplo n.º 1
0
double* generate_random_constraints(char* seed, int N, int n, double* R) 
{
    // struct mt19937p state;
    // sgenrand(seed, &state);

    int i, j;

    initialize();
    int seed1, seed2;
    phrtsd(seed, &seed1, &seed2);
    set_initial_seed(seed1, seed2);
    // for (int i = 0; i < 10; i++)
    //     printf("Random N(0,1): %g\n", gennor(0, 1));

    float meanv[n];
    float varv[n];
    for (i = 0; i < n; i++) {
        float EY = 1.06 + 0.1*(pow(i, 1.1) / (n-1));
        float VarY = pow(0.05 + 0.45*(pow(i, 1.15) / (n-1)), 2);

        varv[i] = log(1 + (VarY / pow(EY,2)));
        meanv[i] = log(EY) - (varv[i] / 2);

        // meanv[i] = 0.057157648387530194;
        // varv[i] = 0.0022225194728912752;
    }

    // float varv[n];
    // for (int i = 0; i < n; i++) {
    //     varv[i] = 1;
    // }
    // float* covm = setcov(n, varv, 0);
    float covm[n*n];
    for (i = 0; i < n; i++)
    {
        for (j = 0; j < n; j++)
        {
            if (i == j) {
                covm[i+j*n] = varv[i];
            }
            else{
                covm[i+j*n] = 0;
            }
        }
    }

    float parm[n*(n+3)/2+1];
    setgmn(meanv, covm, n, parm);

    // Row major layout
    float* mvn;
    for (i = 0; i < N; i++) {
        float* mvn = genmn(parm);
        for (j = 0; j < n; j++) {
            R[i*n + j] = exp(mvn[j]);
            // R[i*n + j] = 1.0 + 0.1*genrand(&state) + 0.01; // [1.01, 1.11]
        }
        free(mvn);
    }

    return R;
}
Ejemplo n.º 2
0
/************************ end self doc ***********************************/ 
void main (int argc, char **argv)   
{
   /* declaration of variables */
   FILE *fp;                  /* file pointer */
   char *covarFile = " ";     /* covariance file */
   char *MAPFile = " ";       /* MAP model file */
   int i, j, k;               /* counters */
   int nL;                    /* number of layers */
   int cl;                    /* correlation length */ 
   int pWave;                 /* P-wave flag */
   int sWave;                 /* S-wave flag */
   int density;               /* density flag */
   int nVar;                  /* dimension of the problem */
   int seed;                  /* input seed */ 
   int lim[2];                /* integer limits for target zone */
   int exponential;           /* exponential flag */
   int impedance;             /* impedance flag */
   int verbose;               /* dialogue flag */
   int nPar;                  /* number of active parameters */
   int shift, shift1;         /* used in simulation of more than one */
                              /* parameter */
   long seed1, seed2;         /* seed for random generator */
   float limZ[2];             /* depth limits of target zone */
   float *thick, *alpha, *beta, *rho;
                              /* medium parameters */
   float *buffer;             /* working buffer */
   float aux1, aux2;          /* auxiliar variables */
   float *parm;     	      /* paramter vector */
   float *mean;     	      /* mean vector */
   float *work;               /* working area */
   float **covar;             /* correlation matrix */
   float **covarExp;          /* exponential correlation matrix */
   float *deviate;            /* random gaussian realization */
   float dz;                  /* depth discretization level */
   float depth;               /* current depth */
   
   /* input parameters */
   initargs(argc, argv);
   requestdoc(0);
   
   /* dimension of the problem */
   if (!getparstring("covariance", &covarFile)) covarFile = "covar";
   if (!getparstring("mean", &MAPFile)) MAPFile = "mean";
   if (!getparint("exponential", &exponential)) exponential = 0;
   if (!getparint("impedance", &impedance)) impedance = 0;
   if (!getparint("p", &pWave)) pWave = 1;
   if (!getparint("s", &sWave)) sWave = 1;
   if (!getparint("r", &density)) density = 1;
   if (!getparfloat("dz", &dz)) dz = .5;
   nPar = pWave + sWave + density;
   if (!getparfloat("targetbeg", &limZ[0])) limZ[0] = 0.5; 
   if (!getparfloat("targetend", &limZ[1])) limZ[1] = 1.0;
   if (!getparint("verbose", &verbose)) verbose = 0;

   
   /* random generator seeding */
   seed = getpid();

   fp = fopen(MAPFile, "r");
   if (fp == NULL) err("No model file!\n");
   nL = 0;
   while (fscanf(fp, "%f %f %f %f %f %f\n", 
		 &aux1, &aux1, &aux1, &aux1, &aux1, &aux1) != EOF)
      nL++;
   nL--;
   rewind(fp);

   /* memory allocation */
   alpha = alloc1float(nL + 1);
   beta = alloc1float(nL + 1);
   rho = alloc1float(nL + 1);
   thick = alloc1float(nL + 1);

   if (verbose)
      fprintf(stderr,"  Thickness     rho     vP     qP    vS     qS\n");
   
   for (k = 0; k < nL + 1; k++)
   {
      fscanf(fp, "%f %f %f %f %f %f\n", &thick[k], &rho[k], &alpha[k], 
	     &aux1, &beta[k], &aux2);
      if (verbose)
	 fprintf(stderr,"   %7.4f      %4.3f   %3.2f  %5.1f  %3.2f  %5.1f\n",
		 thick[k], rho[k], alpha[k], aux1, beta[k], aux2);

      if (impedance)
      {
         alpha[k] *= rho[k];
	 beta[k] *= rho[k];
      }
   }
   fclose(fp);

   /* setting lim[0] and lim[1] */
   for (depth = thick[0], i = 1; i <= nL; depth += thick[i], i++)
   {
      if (NINT(depth / dz) <= NINT(limZ[0] / dz)) lim[0] = i;
      if (NINT(depth / dz) < NINT(limZ[1] / dz)) lim[1] = i;
   }

   /* total dimension */
   nVar = nPar * (lim[1] - lim[0] + 1);
   if (verbose)
      fprintf(stderr, "Total dimension of the problem: %d\n", nVar);
   
   /* more memory allocation */
   covar = alloc2float(nVar, nVar);
   covarExp = alloc2float(nVar, nVar);
   parm = alloc1float(nVar * (nVar + 3) / 2 + 1);
   work = alloc1float(nVar);
   mean = alloc1float(nVar);
   deviate = alloc1float(nVar);
   buffer = alloc1float(nPar * (nL + 1));
   
   fp = fopen(covarFile, "r");
   if (fp == NULL) err("No covariance file!\n");
   fread(&covar[0][0], sizeof(float), nVar * nVar, fp);
   fclose(fp);
   
   /* building the mean */
   shift = 0;
   if (pWave)
   {
      for (k = 0, i = lim[0]; i <= lim[1]; i++, k++)
	 mean[k] = alpha[i];
      shift = nVar / nPar;
   }
   if (sWave)
   {
      for (k = 0, i = lim[0]; i <= lim[1]; i++, k++)
	 mean[k + shift] = beta[i];
      shift += nVar / nPar;
   }
   if (density)
   {
      for (k = 0, i = lim[0]; i <= lim[1]; i++, k++)
	 mean[k + shift] = beta[i];
   }

   /* fitting an exponential model */
   if (exponential)
   {
      for (i = 0; i < nVar; i++) 
	 for (j = 0; j < nVar; j++) 
	    covarExp[i][j] = 0;

      for (i = 0; i < nVar; i++)
      {
	 for (cl = 0, j = i; j < nVar; j++, cl++)
	 {
	    if (covar[i][j] / covar[i][i] < 1. / EULER)  break;
	 }
	 
	 for (j = 0; j < nVar; j++) 
	 {
	    covarExp[i][j] += .5 * covar[i][i] * 
	       exp(-(float) ABS(i - j) / (float) cl);
	 }
	 for (j = 0; j < nVar; j++) 
	 {
	    covarExp[j][i] += .5 * covar[i][i] * 
	       exp(-(float) ABS(i - j) / (float) cl);
	 }
      }
      
      for (i = 0; i < nVar; i++)
	 for (j = 0; j < nVar; j++)
	    covar[i][j] = covarExp[i][j];
   }
     
   /* reseting */
   for (i = 0; i < nVar * (nVar + 3) / 2 + 1; i++)
   {
      parm[i] = 0;
      if (i < nVar)
      {
         work[i] = 0;
         deviate[i] = 0;
      }
   }
  
   /* input data for generating realization of the multivariate */
   /* gaussian */
   setgmn(mean, covar[0], nVar, parm); 
   seed1 = (long) seed; seed2 = (long) seed * seed;
   setall(seed1, seed2);  
   
   /* generating the realization */
   genmn(parm, deviate, work);

   /* copying to buffer */
   shift = 0;
   shift1 = 0;

   if (pWave)
   {
      for (j = 0; j < lim[0]; j++)
	 buffer[j] = alpha[j];
      for (k = 0, j = lim[0]; j <= lim[1]; j++, k++)
	 buffer[j] = deviate[k];
      for (j = lim[1]; j < nL + 1; j++)
	 buffer[j] = alpha[j];
      shift = nL;
      shift1 = nVar / nPar;
   }
   
   if (sWave)
   {
      for (j = 0; j < lim[0]; j++)
	 buffer[j + shift] = beta[j];
      for (k = 0, j = lim[0]; j <= lim[1]; j++, k++)
	 buffer[j + shift] = deviate[k + shift1];
      for (j = lim[1]; j < nL + 1; j++)
	 buffer[j + shift] = beta[j];
      shift += nL;
      shift1 += nVar / nPar;
   }
   if (density)
   {
      for (j = 0; j < lim[0]; j++)
	 buffer[j + shift] = rho[j];
      for (k = 0, j = lim[0]; j <= lim[1]; j++, k++)
	 buffer[j + shift] = deviate[k + shift1];
      for (j = lim[1]; j < nL + 1; j++)
	 buffer[j + shift] = rho[j];
   }
   /* outputting */
   fwrite(buffer, sizeof(float), nPar * (nL + 1), stdout);
}