Exemple #1
0
  inline void recup(const double x[],double& vp,double& rp) const
  {
    vp=(1.0-smooth2((x[10]-alpha)/10))*(1-x[19])/T0v-
      smooth2((x[10]-alphaP)/10)*x[19]/Tfv;

    rp=(1.0-smooth2(x[19]-v0))*(1-x[20])/T0r-smooth2(x[19]-v0P)*x[20]/Tfr;
  }
Exemple #2
0
// Smooths a curve sampled at regular intervals. 
cmsBool  CMSEXPORT cmsSmoothToneCurve(cmsToneCurve* Tab, cmsFloat64Number lambda)
{
    cmsFloat32Number w[MAX_NODES_IN_CURVE], y[MAX_NODES_IN_CURVE], z[MAX_NODES_IN_CURVE];
    int i, nItems, Zeros, Poles;

    if (Tab == NULL) return FALSE;

    if (cmsIsToneCurveLinear(Tab)) return FALSE; // Nothing to do

    nItems = Tab -> nEntries;

    if (nItems >= MAX_NODES_IN_CURVE) {
        cmsSignalError(Tab ->InterpParams->ContextID, cmsERROR_RANGE, "cmsSmoothToneCurve: too many points.");
        return FALSE;
    }

    memset(w, 0, nItems * sizeof(cmsFloat32Number));
    memset(y, 0, nItems * sizeof(cmsFloat32Number));
    memset(z, 0, nItems * sizeof(cmsFloat32Number));

    for (i=0; i < nItems; i++)
    {
        y[i+1] = (cmsFloat32Number) Tab -> Table16[i];
        w[i+1] = 1.0;
    }

    if (!smooth2(Tab ->InterpParams->ContextID, w, y, z, (cmsFloat32Number) lambda, nItems)) return FALSE;

    // Do some reality - checking...
    Zeros = Poles = 0;
    for (i=nItems; i > 1; --i) {

        if (z[i] == 0.) Zeros++;
        if (z[i] >= 65535.) Poles++;
        if (z[i] < z[i-1]) return FALSE; // Non-Monotonic
    }

    if (Zeros > (nItems / 3)) return FALSE;  // Degenerated, mostly zeros
    if (Poles > (nItems / 3)) return FALSE;  // Degenerated, mostly poles

    // Seems ok
    for (i=0; i < nItems; i++) {

        // Clamp to cmsUInt16Number
        Tab -> Table16[i] = _cmsQuickSaturateWord(z[i+1]);
    }

    return TRUE;
}
Exemple #3
0
__attribute__((noinline)) static void smooth3(float* v) {
#if 0
  for(int64_t k=0; (size_t)k < dims[2]; ++k) {
    for(int64_t j=0; (size_t)j < dims[1]; ++j) {
      for(int64_t i=0; (size_t)i < dims[0]; ++i) {
#else
  for(uint64_t k=0; k < dims[2]; ++k) {
    for(uint64_t j=0; j < dims[1]; ++j) {
      for(uint64_t i=0; i < dims[0]; ++i) {
#endif
        const size_t idx = (size_t)k*dims[0]*dims[1] + (size_t)j*dims[0] + i;
        /* technically 1D, but whatever... */
        v[idx] = (IDX3(i-1,j,k) + IDX3(i,j,k) + IDX3(i+1,j,k)) / 3.0f;
      }
    }
  }
}

int main(int argc, char* argv[]) {
  if(argc < 2) {
    fprintf(stderr, "need arg: which computation to run.\n");
    return EXIT_FAILURE;
  }
  if(argc == 42) { dims[0] = 12398; }
  for(size_t i=1; i < (size_t)argc; ++i) {
    if(atoi(argv[i]) == 0) {
      scalarvar();
    } else if(atoi(argv[i]) == 1) {
      varr = calloc(dims[0], sizeof(float));
      smooth1();
      free(varr);
    } else if(atoi(argv[i]) == 2) {
      v2darr = calloc(dims[0]*dims[1], sizeof(float));
      smooth2(v2darr);
      free(v2darr);
    } else if(atoi(argv[i]) == 3) {
      v3darr = calloc(dims[0]*dims[1]*dims[2], sizeof(float));
      smooth3(v3darr);
      free(v3darr);
    } else {
      fprintf(stderr, "unknown computational id '%s'\n", argv[i]);
      return EXIT_FAILURE;
    }
  }
  printf("%s finished.\n", argv[0]);

  return 0;
}
Exemple #4
0
void smooth_grad(float ** waveconv){

	extern int SPATFILTER;
		
	/* Smooth gradients */
	/* ---------------- */

	/* apply wavenumber damping */
	if(SPATFILTER==1){
	  wavenumber(waveconv);
	}

	if(SPATFILTER==2){
	  smooth2(waveconv);
	}

	if(SPATFILTER==3){
	  gauss_filt(waveconv);
	}

}
//gauss smooth
void EtGcSegmentRgb::preprocess(float sigma){
	smooth2(r, sigma, tmpImage);
	smooth2(g, sigma, tmpImage);
	smooth2(b, sigma, tmpImage);
}
void EtGcSegmentGray::preprocess(float sigma){
	smooth2(img, sigma, tmpImage);
}
Exemple #7
0
void PCG(float ** waveconv, float ** taper_coeff, int nsrc, float ** srcpos, int ** recpos, int ntr_glob, int iter, float C_vp, float ** gradp, int nfstart_jac,
	     float ** waveconv_u, float C_vs, float ** gradp_u, float ** waveconv_rho, float C_rho, float ** gradp_rho){

	extern int NX, NY, IDX, IDY, SPATFILTER, GRAD_FILTER;
	extern int SWS_TAPER_GRAD_VERT, SWS_TAPER_GRAD_HOR, SWS_TAPER_GRAD_SOURCES, SWS_TAPER_FILE;
	extern int POS[3], MYID, GRAD_METHOD;
	extern char JACOBIAN[STRING_SIZE];
	
	char jac[225], jac2[225];
	int i, j;
	float betaz, betan, gradplastiter, gradclastiter, betar, beta;
	extern FILE *FP;
	FILE *FP3, *FP4, *FP6, *FP5;
	
/* =================================================================================================================================================== */
/* ===================================================================================================================================================== */
/* ===================================================== GRADIENT ZP ================================================================================== */
/* ===================================================================================================================================================== */
	
/* Preconditioning of the gradient */
/* ------------------------------- */

/* apply taper on the gradient */
/* --------------------------- */

if (SWS_TAPER_GRAD_VERT){   /*vertical gradient taper is applied*/
   taper_grad(waveconv,taper_coeff,srcpos,nsrc,recpos,ntr_glob,1);}

if (SWS_TAPER_GRAD_HOR){   /*horizontal gradient taper is applied*/
   taper_grad(waveconv,taper_coeff,srcpos,nsrc,recpos,ntr_glob,2);}

if (SWS_TAPER_GRAD_SOURCES){   /*cylindrical taper around sources is applied*/
   taper_grad(waveconv,taper_coeff,srcpos,nsrc,recpos,ntr_glob,3);}

if (SWS_TAPER_FILE){   /* read taper from BIN-File*/
   taper_grad(waveconv,taper_coeff,srcpos,nsrc,recpos,ntr_glob,4);}   

/* apply median filter at source positions */
/*median_src(waveconv,taper_coeff,srcpos,nsrc,recpos,ntr_glob,iter,0);*/

/* apply wavenumber damping */
if(SPATFILTER==1){
  wavenumber(waveconv);
}

if(SPATFILTER==2){
  smooth2(waveconv);
}
  
/* save gradient */
/*sprintf(jac,"%s_g.old.%i%i",JACOBIAN,POS[1],POS[2]);
FP3=fopen(jac,"wb");

        for (i=1;i<=NX;i=i+IDX){
           for (j=1;j<=NY;j=j+IDY){
                 fwrite(&waveconv[j][i],sizeof(float),1,FP3);
           }
        }
	
fclose(FP3);

MPI_Barrier(MPI_COMM_WORLD);*/
          
/* merge gradient file */ 
/*sprintf(jac,"%s_g.old",JACOBIAN);
if (MYID==0) mergemod(jac,3);*/
 
/* Normalize gradient to maximum value */
/*norm(waveconv,iter,1);*/

/* apply spatial wavelength filter */
/*if(SPATFILTER==1){
	if (MYID==0){
   	fprintf(FP,"\n Spatial filter is applied to gradient (written by PE %d)\n",MYID);}
        spat_filt(waveconv,iter,1);}*/

/* apply 2D-Gaussian filter*/
if(GRAD_FILTER==1){smooth_grad(waveconv,1);}

/* output of the preconditioned gradient */
for (i=1;i<=NX;i=i+IDX){
   for (j=1;j<=NY;j=j+IDY){
      waveconv[j][i] = C_vp * waveconv[j][i];
	 gradp[j][i] = waveconv[j][i];
   }
}


/* save gradient for output as inversion result */
if(iter==nfstart_jac){
	sprintf(jac,"%s_p_it%d.old.%i%i",JACOBIAN,iter,POS[1],POS[2]);
	FP3=fopen(jac,"wb");

        	for (i=1;i<=NX;i=i+IDX){
           	for (j=1;j<=NY;j=j+IDY){
                	fwrite(&waveconv[j][i],sizeof(float),1,FP3);
           	}
        	}
	
	fclose(FP3);

	MPI_Barrier(MPI_COMM_WORLD);
          
	/* merge gradient file */ 
	sprintf(jac,"%s_p_it%d.old",JACOBIAN,iter);
	if (MYID==0) mergemod(jac,3);
	MPI_Barrier(MPI_COMM_WORLD);
	sprintf(jac,"%s_p_it%d.old.%i%i",JACOBIAN,iter,POS[1],POS[2]);
	remove(jac);
}



/* calculate conjugate gradient direction, if iter > 1 (after Mora 1987) */
/* --------------------------------------------------------------------- */
if(GRAD_METHOD!=3){

if(iter>1){
   
   sprintf(jac,"%s_p.old.%i%i",JACOBIAN,POS[1],POS[2]);
   FP6=fopen(jac,"rb");

   if(iter>2){
      sprintf(jac2,"%s_c.old.%i%i",JACOBIAN,POS[1],POS[2]);
      FP5=fopen(jac2,"rb");
   }
   
        /* apply scalar product to obtain the coefficient beta */
     betaz = 0.0;
     betan = 0.0;
     for (i=1;i<=NX;i=i+IDX){
       for (j=1;j<=NY;j=j+IDY){
   	  
          fread(&gradplastiter,sizeof(float),1,FP6);
	  
	  /*if(gradglastiter==gradg[j][i]) err("TEST1");*/
	  /*if (MYID==10)  printf("TEST beta (MYID=%d) bei (j,i)=(%i,%i): gradg(k-1) = %e, gradg(k) = %e\n",MYID,j,i,gradglastiter,gradg[j][i]);*/
	  
	  /*
	  betaz += (1e5*gradp[j][i]) * ( (1e5*gradg[j][i]) - (1e5*gradglastiter) );
	  betan += (1e5*gradplastiter) * (1e5*gradglastiter);
	  */
	  
	  /* Polak and Ribiere */
	  /*betaz += (gradp[j][i]) * ( (gradg[j][i]) - (gradglastiter) );
	  betan += (gradplastiter) * (gradglastiter);*/
	  
	  /* Polak and Ribiere */
	  betaz += (gradp[j][i]) * ( (gradp[j][i]) - (gradplastiter) );
	  betan += (gradplastiter) * (gradplastiter);
	  
	  /* Fletcher and Reeves */
	  /*betaz += (gradp[j][i]) * (gradg[j][i]);
	  betan += (gradplastiter) * (gradglastiter);*/
	  
	  
       }
     }
     
     /*printf("TEST: vor exchange (MYID=%d): beta = betaz/betan = %e/%e = %e\n",MYID,betaz,betan,betaz/betan);*/

     /*betaz = exchange_L2(betaz,1,1);
     betan = exchange_L2(betan,1,1);*/
     
     betar = 0.0;
     MPI_Allreduce(&betaz,&betar,1,MPI_FLOAT,MPI_SUM,MPI_COMM_WORLD);
     betaz = betar;
     
     betar = 0.0;
     MPI_Allreduce(&betan,&betar,1,MPI_FLOAT,MPI_SUM,MPI_COMM_WORLD);
     betan = betar;
     
     beta = 0.0f;
     if(betan !=0.0f) beta = betaz/betan;
     
     /* direction reset */
     if(beta<0.0){beta = 0.0;}

     /*betaVp = beta;*/
     
     printf("\n\nTEST: nach exchange (MYID=%d): beta = %e / %e = %e\n",MYID,betaz,betan,beta);
     
     fseek(FP6,0,SEEK_SET);
     
     for (i=1;i<=NX;i=i+IDX){
       for (j=1;j<=NY;j=j+IDY){
   	
	  if(iter==2){
             fread(&gradplastiter,sizeof(float),1,FP6);
             waveconv[j][i] = gradp[j][i] + gradplastiter * beta;
          }
   
          if(iter>2){
	     fread(&gradclastiter,sizeof(float),1,FP5);
             waveconv[j][i] = gradp[j][i] + gradclastiter * beta;
          }
	  
       }
     }
     
   fclose(FP6);
   
   if(iter>2){fclose(FP5);}

}

/* output of the conjugate gradient */
if(iter>1){
  sprintf(jac2,"%s_c.old.%i%i",JACOBIAN,POS[1],POS[2]);
  FP5=fopen(jac2,"wb");


  for (i=1;i<=NX;i=i+IDX){
     for (j=1;j<=NY;j=j+IDY){
         fwrite(&waveconv[j][i],sizeof(float),1,FP5);
     }
  }

  fclose(FP5);
  
MPI_Barrier(MPI_COMM_WORLD);

/* merge gradient file */ 
sprintf(jac2,"%s_c.old",JACOBIAN);
if (MYID==0) mergemod(jac2,3);  

}

} /* end of if GRAD_METHOD!=3*/

/* output of preconditioned gradient */
sprintf(jac,"%s_p.old.%i%i",JACOBIAN,POS[1],POS[2]);
FP4=fopen(jac,"wb");

/* output of the preconditioned gradient */
for (i=1;i<=NX;i=i+IDX){
   for (j=1;j<=NY;j=j+IDY){
        /*fwrite(&waveconv[j][i],sizeof(float),1,FP4);*/
	fwrite(&gradp[j][i],sizeof(float),1,FP4);
   }
}

fclose(FP4);

MPI_Barrier(MPI_COMM_WORLD);

/* merge gradient file */ 
sprintf(jac,"%s_p.old",JACOBIAN);
if (MYID==0) mergemod(jac,3);


/* =================================================================================================================================================== */
/* ===================================================================================================================================================== */
/* ===================================================== GRADIENT Zs ================================================================================== */
/* ===================================================================================================================================================== */
	
/* Preconditioning of the gradient */
/* ------------------------------- */

/* apply taper on the gradient */
/* --------------------------- */
if (SWS_TAPER_GRAD_VERT){   /*vertical gradient taper is applied*/
   taper_grad(waveconv_u,taper_coeff,srcpos,nsrc,recpos,ntr_glob,1);}

if (SWS_TAPER_GRAD_HOR){   /*horizontal gradient taper is applied*/
   taper_grad(waveconv_u,taper_coeff,srcpos,nsrc,recpos,ntr_glob,2);}

if (SWS_TAPER_GRAD_SOURCES){   /*cylindrical taper around sources is applied*/
   taper_grad(waveconv_u,taper_coeff,srcpos,nsrc,recpos,ntr_glob,3);}

if (SWS_TAPER_FILE){   /* read taper from BIN-File*/                          
   taper_grad(waveconv_u,taper_coeff,srcpos,nsrc,recpos,ntr_glob,5);}

/* apply median filter at source positions */
/*median_src(waveconv_u,taper_coeff,srcpos,nsrc,recpos,ntr_glob,iter,0);*/

/* apply wavenumber damping */
if(SPATFILTER==1){
  wavenumber(waveconv_u);
}

if(SPATFILTER==2){
  smooth2(waveconv_u);
}
  
/* save gradient */
/*sprintf(jac,"%s_g_u.old.%i%i",JACOBIAN,POS[1],POS[2]);
FP3=fopen(jac,"wb");

        for (i=1;i<=NX;i=i+IDX){
           for (j=1;j<=NY;j=j+IDY){
                 fwrite(&waveconv_u[j][i],sizeof(float),1,FP3);
           }
        }
	
fclose(FP3);

MPI_Barrier(MPI_COMM_WORLD);*/
          
/* merge gradient file */ 
/*sprintf(jac,"%s_g_u.old",JACOBIAN);
if (MYID==0) mergemod(jac,3);*/
 

/* Normalize gradient to maximum value */
/*norm(waveconv_u,iter,2);*/

/* apply spatial wavelength filter */
/*if(SPATFILTER==1){
	if (MYID==0){
   	fprintf(FP,"\n Spatial filter is applied to gradient (written by PE %d)\n",MYID);}
spat_filt(waveconv_u,iter,2);}*/

/* apply 2D-Gaussian filter*/
if(GRAD_FILTER==1){smooth_grad(waveconv_u,2);}

/* output of the preconditioned gradient */
for (i=1;i<=NX;i=i+IDX){
   for (j=1;j<=NY;j=j+IDY){
      waveconv_u[j][i] = C_vs * waveconv_u[j][i];
      gradp_u[j][i]=waveconv_u[j][i];
   }
}


/* save gradient for output as inversion result */
if(iter==nfstart_jac){
	sprintf(jac,"%s_p_u_it%d.old.%i%i",JACOBIAN,iter,POS[1],POS[2]);
	FP3=fopen(jac,"wb");

        	for (i=1;i<=NX;i=i+IDX){
           	for (j=1;j<=NY;j=j+IDY){
                	fwrite(&waveconv_u[j][i],sizeof(float),1,FP3);
           	}
        	}
	
	fclose(FP3);

	MPI_Barrier(MPI_COMM_WORLD);
          
	/* merge gradient file */ 
	sprintf(jac,"%s_p_u_it%d.old",JACOBIAN,iter);
	if (MYID==0) mergemod(jac,3);
	MPI_Barrier(MPI_COMM_WORLD);
	sprintf(jac,"%s_p_u_it%d.old.%i%i",JACOBIAN,iter,POS[1],POS[2]);
	remove(jac);
}


/* calculate conjugate gradient direction, if iter > 1 (after Mora 1987) */
/* --------------------------------------------------------------------- */
if(GRAD_METHOD!=3){

if(iter>1){

   
   sprintf(jac,"%s_p_u.old.%i%i",JACOBIAN,POS[1],POS[2]);
   FP6=fopen(jac,"rb");

   if(iter>2){
      sprintf(jac2,"%s_c_u.old.%i%i",JACOBIAN,POS[1],POS[2]);
      FP5=fopen(jac2,"rb");
   }
   
        /* apply scalar product to obtain the coefficient beta */
     betaz = 0.0;
     betan = 0.0;
     for (i=1;i<=NX;i=i+IDX){
       for (j=1;j<=NY;j=j+IDY){
   	  
          fread(&gradplastiter,sizeof(float),1,FP6);
	  
	  /*if(gradglastiter==gradg[j][i]) err("TEST1");*/
	  /*if (MYID==10)  printf("TEST beta (MYID=%d) bei (j,i)=(%i,%i): gradg(k-1) = %e, gradg(k) = %e\n",MYID,j,i,gradglastiter,gradg[j][i]);*/
	  
	  /*
	  betaz += (1e5*gradp[j][i]) * ( (1e5*gradg[j][i]) - (1e5*gradglastiter) );
	  betan += (1e5*gradplastiter) * (1e5*gradglastiter);
	  */
	  
	  /* Polak and Ribiere */
	  /*betaz += (gradp_u[j][i]) * ( (gradg_u[j][i]) - (gradglastiter) );
	  betan += (gradplastiter) * (gradglastiter);*/
	  
	  /* Polak and Ribiere */
	  betaz += (gradp_u[j][i]) * ( (gradp_u[j][i]) - (gradplastiter) );
	  betan += (gradplastiter) * (gradplastiter);
	  
	  /* Fletcher and Reeves */
	  /*betaz += (gradp[j][i]) * (gradg[j][i]);
	  betan += (gradplastiter) * (gradglastiter);*/
	  
	  
       }
     }
     
     /*printf("TEST: vor exchange (MYID=%d): beta = betaz/betan = %e/%e = %e\n",MYID,betaz,betan,betaz/betan);*/

     /*betaz = exchange_L2(betaz,1,1);
     betan = exchange_L2(betan,1,1);*/
     
     betar = 0.0;
     MPI_Allreduce(&betaz,&betar,1,MPI_FLOAT,MPI_SUM,MPI_COMM_WORLD);
     betaz = betar;
     
     betar = 0.0;
     MPI_Allreduce(&betan,&betar,1,MPI_FLOAT,MPI_SUM,MPI_COMM_WORLD);
     betan = betar;
     
     beta = 0.0f;
     if(betan !=0.0f) beta = betaz/betan;
     
     /* direction reset */
     if(beta<0.0){beta = 0.0;}

     /*betaVs = beta;*/
     printf("\n\nTEST: nach exchange (MYID=%d): beta = %e / %e = %e\n",MYID,betaz,betan,beta);
     
     fseek(FP6,0,SEEK_SET);
     
     for (i=1;i<=NX;i=i+IDX){
       for (j=1;j<=NY;j=j+IDY){
   	
	  if(iter==2){
             fread(&gradplastiter,sizeof(float),1,FP6);
             waveconv_u[j][i] = gradp_u[j][i] + gradplastiter * beta;
          }
   
          if(iter>2){
	     fread(&gradclastiter,sizeof(float),1,FP5);
             waveconv_u[j][i] = gradp_u[j][i] + gradclastiter * beta;
          }

       }
     }
     
   fclose(FP6);
   
   if(iter>2){fclose(FP5);}

}

/* output of the conjugate gradient */
if(iter>1){
  sprintf(jac2,"%s_c_u.old.%i%i",JACOBIAN,POS[1],POS[2]);
  FP5=fopen(jac2,"wb");


  for (i=1;i<=NX;i=i+IDX){
     for (j=1;j<=NY;j=j+IDY){
         fwrite(&waveconv_u[j][i],sizeof(float),1,FP5);
     }
  }

  fclose(FP5);
  
MPI_Barrier(MPI_COMM_WORLD);

/* merge gradient file */ 
sprintf(jac2,"%s_c_u.old",JACOBIAN);
if (MYID==0) mergemod(jac2,3);  

}

} /* end of GRAD_METHOD!=3*/

sprintf(jac,"%s_p_u.old.%i%i",JACOBIAN,POS[1],POS[2]);
FP4=fopen(jac,"wb");

/* output of the preconditioned gradient */
for (i=1;i<=NX;i=i+IDX){
   for (j=1;j<=NY;j=j+IDY){
        /*fwrite(&waveconv_u[j][i],sizeof(float),1,FP4);*/
	fwrite(&gradp_u[j][i],sizeof(float),1,FP4);
   }
}

fclose(FP4);

MPI_Barrier(MPI_COMM_WORLD);

/* merge gradient file */ 
sprintf(jac,"%s_p_u.old",JACOBIAN);
if (MYID==0) mergemod(jac,3);

/* =================================================================================================================================================== */

/* ===================================================================================================================================================== */
/* ===================================================== GRADIENT rho ================================================================================== */
/* ===================================================================================================================================================== */
	
/* Preconditioning of the gradient */
/* ------------------------------- */
if (SWS_TAPER_GRAD_VERT){   /*vertical gradient taper is applied*/
   taper_grad(waveconv_rho,taper_coeff,srcpos,nsrc,recpos,ntr_glob,1);}

if (SWS_TAPER_GRAD_HOR){   /*horizontal gradient taper is applied*/
   taper_grad(waveconv_rho,taper_coeff,srcpos,nsrc,recpos,ntr_glob,2);}

if (SWS_TAPER_GRAD_SOURCES){   /*cylindrical taper around sources is applied*/
   taper_grad(waveconv_rho,taper_coeff,srcpos,nsrc,recpos,ntr_glob,3);}

if (SWS_TAPER_FILE){   /* read taper from BIN-File*/                          
   taper_grad(waveconv_rho,taper_coeff,srcpos,nsrc,recpos,ntr_glob,6);}

/* apply median filter at source positions */
/*median_src(waveconv_rho,taper_coeff,srcpos,nsrc,recpos,ntr_glob,iter,0);*/

/* apply wavenumber damping */
if(SPATFILTER==1){
  wavenumber(waveconv_rho);
}

if(SPATFILTER==2){
  smooth2(waveconv_rho);
} 

/* save gradient */
/*sprintf(jac,"%s_g_rho.old.%i%i",JACOBIAN,POS[1],POS[2]);
FP3=fopen(jac,"wb");

        for (i=1;i<=NX;i=i+IDX){
           for (j=1;j<=NY;j=j+IDY){
                 fwrite(&waveconv_rho[j][i],sizeof(float),1,FP3);
           }
        }
	
fclose(FP3);

MPI_Barrier(MPI_COMM_WORLD);*/
          
/* merge gradient file */ 
/*sprintf(jac,"%s_g_rho.old",JACOBIAN);
if (MYID==0) mergemod(jac,3);*/
 

/* Normalize gradient to maximum value */
/*norm(waveconv_rho,iter,3);*/


/* apply spatial wavelength filter */
/*if(SPATFILTER==1){
	if (MYID==0){
   	fprintf(FP,"\n Spatial filter is applied to gradient (written by PE %d)\n",MYID);}
spat_filt(waveconv_rho,iter,3);}*/

/* apply 2D-Gaussian filter*/
if(GRAD_FILTER==1){smooth_grad(waveconv_rho,3);}

/* output of the preconditioned gradient */
for (i=1;i<=NX;i=i+IDX){
   for (j=1;j<=NY;j=j+IDY){
      waveconv_rho[j][i] = C_rho * waveconv_rho[j][i];
	gradp_rho[j][i]=waveconv_rho[j][i];
   }
}



/* save gradient for output as inversion result */
if(iter==nfstart_jac){
	sprintf(jac,"%s_p_rho_it%d.old.%i%i",JACOBIAN,iter,POS[1],POS[2]);
	FP3=fopen(jac,"wb");

        	for (i=1;i<=NX;i=i+IDX){
           	for (j=1;j<=NY;j=j+IDY){
                	fwrite(&waveconv_rho[j][i],sizeof(float),1,FP3);
           	}
        	}
	
	fclose(FP3);

	MPI_Barrier(MPI_COMM_WORLD);
          
	/* merge gradient file */ 
	sprintf(jac,"%s_p_rho_it%d.old",JACOBIAN,iter);
	if (MYID==0) mergemod(jac,3);
	MPI_Barrier(MPI_COMM_WORLD);
	sprintf(jac,"%s_p_rho_it%d.old.%i%i",JACOBIAN,iter,POS[1],POS[2]);
	remove(jac);
}



/* calculate conjugate gradient direction, if iter > 1 (after Mora 1987) */
/* --------------------------------------------------------------------- */

if(GRAD_METHOD!=3){

if(iter>1){

   
   sprintf(jac,"%s_p_rho.old.%i%i",JACOBIAN,POS[1],POS[2]);
   FP6=fopen(jac,"rb");

   if(iter>2){
      sprintf(jac2,"%s_c_rho.old.%i%i",JACOBIAN,POS[1],POS[2]);
      FP5=fopen(jac2,"rb");
   }
   
        /* apply scalar product to obtain the coefficient beta */
     betaz = 0.0;
     betan = 0.0;
     for (i=1;i<=NX;i=i+IDX){
       for (j=1;j<=NY;j=j+IDY){
   	  
          fread(&gradplastiter,sizeof(float),1,FP6);
	  
	  /*if(gradglastiter==gradg[j][i]) err("TEST1");*/
	  /*if (MYID==10)  printf("TEST beta (MYID=%d) bei (j,i)=(%i,%i): gradg(k-1) = %e, gradg(k) = %e\n",MYID,j,i,gradglastiter,gradg[j][i]);*/
	  
	  /*
	  betaz += (1e5*gradp[j][i]) * ( (1e5*gradg[j][i]) - (1e5*gradglastiter) );
	  betan += (1e5*gradplastiter) * (1e5*gradglastiter);
	  */
	  
	  /* Polak and Ribiere */
	  /*betaz += (gradp_rho[j][i]) * ( (gradg_rho[j][i]) - (gradglastiter) );
	  betan += (gradplastiter) * (gradglastiter);*/
	  
	  /* Polak and Ribiere */
	  betaz += (gradp_rho[j][i]) * ( (gradp_rho[j][i]) - (gradplastiter) );
	  betan += (gradplastiter) * (gradplastiter);
	  
	  /* Fletcher and Reeves */
	  /*betaz += (gradp[j][i]) * (gradg[j][i]);
	  betan += (gradplastiter) * (gradglastiter);*/
	  
	  
       }
     }
     
     /*printf("TEST: vor exchange (MYID=%d): beta = betaz/betan = %e/%e = %e\n",MYID,betaz,betan,betaz/betan);*/

     /*betaz = exchange_L2(betaz,1,1);
     betan = exchange_L2(betan,1,1);*/
     
     betar = 0.0;
     MPI_Allreduce(&betaz,&betar,1,MPI_FLOAT,MPI_SUM,MPI_COMM_WORLD);
     betaz = betar;
     
     betar = 0.0;
     MPI_Allreduce(&betan,&betar,1,MPI_FLOAT,MPI_SUM,MPI_COMM_WORLD);
     betan = betar;
     
     beta = 0.0f;
     if(betan !=0.0f) beta = betaz/betan;
     
     /* direction reset */
     if(beta<0.0){beta = 0.0;}

     /*betarho = beta;*/
     printf("\n\nTEST: nach exchange (MYID=%d): beta = %e / %e = %e\n",MYID,betaz,betan,beta);
     
     fseek(FP6,0,SEEK_SET);
     
     for (i=1;i<=NX;i=i+IDX){
       for (j=1;j<=NY;j=j+IDY){
   	
	  if(iter==2){
             fread(&gradplastiter,sizeof(float),1,FP6);
             waveconv_rho[j][i] = gradp_rho[j][i] + gradplastiter * beta;
          }
   
          if(iter>2){
	     fread(&gradclastiter,sizeof(float),1,FP5);
             waveconv_rho[j][i] = gradp_rho[j][i] + gradclastiter * beta;
          }
	  
	  
	  /*if (iter >= 2)
	  {
	     if (isnan(waveconv_u[j][i]) || isinf(waveconv_u[j][i]))
	     {
		     sum = 0.0;
		     h = 0;
		     for (ii=-1;ii<=1;ii++){
	       		for (jj=-1;jj<=1;jj++){
				if (isnan(waveconv_rho[j+jj][i+ii]) || isinf(waveconv_rho[j+jj][i+ii])) continue;
				sum += waveconv_rho[j+jj][i+ii];
				h++;
			}
		     }
		     if (h>0) waveconv_rho[j][i] = sum / h;
		     else waveconv_rho[j][i] = 0.0;
	     }
	     
	  }*/

       }
     }
     
   fclose(FP6);
   
   if(iter>2){fclose(FP5);}

}

/* output of the conjugate gradient */
if(iter>1){
  sprintf(jac2,"%s_c_rho.old.%i%i",JACOBIAN,POS[1],POS[2]);
  FP5=fopen(jac2,"wb");


  for (i=1;i<=NX;i=i+IDX){
     for (j=1;j<=NY;j=j+IDY){
         fwrite(&waveconv_rho[j][i],sizeof(float),1,FP5);
     }
  }

  fclose(FP5);
  
MPI_Barrier(MPI_COMM_WORLD);

/* merge gradient file */ 
sprintf(jac2,"%s_c_rho.old",JACOBIAN);
if (MYID==0) mergemod(jac2,3);  

}

} /* end of GRAD_METHOD!=3 */

sprintf(jac,"%s_p_rho.old.%i%i",JACOBIAN,POS[1],POS[2]);
FP4=fopen(jac,"wb");

/* output of the preconditioned gradient */
for (i=1;i<=NX;i=i+IDX){
   for (j=1;j<=NY;j=j+IDY){
        /*fwrite(&waveconv_rho[j][i],sizeof(float),1,FP4);*/
	fwrite(&gradp_rho[j][i],sizeof(float),1,FP4);
   }
}

fclose(FP4);

MPI_Barrier(MPI_COMM_WORLD);

/* merge gradient file */ 
sprintf(jac,"%s_p_rho.old",JACOBIAN);
if (MYID==0) mergemod(jac,3);


}
Exemple #8
0
void LBFGS1(float ** taper_coeff, int nsrc, float ** srcpos, int ** recpos, int ntr_glob, int iter, int nfstart_jac, float ** waveconv, float C_vp, float ** gradp, float ** waveconv_u, float C_vs, float ** gradp_u, float ** waveconv_rho, float C_rho, float ** gradp_rho, float * y_LBFGS, float * s_LBFGS, float * rho_LBFGS, 
            float * alpha_LBFGS, float **ppi, float ** pu, float ** prho, int nxnyi, float * q_LBFGS, float * r_LBFGS, float * beta_LBFGS, int LBFGS_pointer, int NLBFGS, int NLBFGS_vec){

	extern int NX, NY, IDX, IDY, SPATFILTER;
	extern int HESSIAN, INVMAT, SWS_TAPER_GRAD_VERT, SWS_TAPER_GRAD_HOR, SWS_TAPER_GRAD_SOURCES, SWS_TAPER_FILE;
	extern int POS[3], MYID;
	extern char JACOBIAN[STRING_SIZE];
	
	char jac[225], jac1[225];
	int i, j, k, h, h1, h2;
	float betaz, betan, gradplastiter, gradclastiter, betar, beta;
	float gamma_LBFGS, sum_nom, sum_denom;
        float LBFGSTMP, LBFGSTMP1, LBFGSTMP2, LBFGSTMP3, modellastiter, norm_fac, norm_fac_u, norm_fac_rho;
        float beta_LBFGS_1;
        int ki, itershift, iter1;
	extern FILE *FP;
	FILE *FP3, *FP4, *FP6, *FP5, *FP7;
	
        itershift = 1;

/* =================================================================================================================================================== */
/* ===================================================================================================================================================== */
/* ===================================================== GRADIENT Vp/Zp/lambda ================================================================================== */
/* ===================================================================================================================================================== */

if((INVMAT==1)||(INVMAT==0)){
	
/* Normalization of the gradient   */
/* ------------------------------- */
for (i=1;i<=NX;i=i+IDX){
   for (j=1;j<=NY;j=j+IDY){
      waveconv[j][i] = C_vp * waveconv[j][i];
   }
}

/* TEST: IMPLEMENTATION OF TAPER IN denise.c */
/*if (SWS_TAPER_GRAD_VERT){*/   /*vertical gradient taper is applied*/
   /*taper_grad(waveconv,taper_coeff,srcpos,nsrc,recpos,ntr_glob,1);}*/

/*if (SWS_TAPER_GRAD_HOR){*/   /*horizontal gradient taper is applied*/
   /*taper_grad(waveconv,taper_coeff,srcpos,nsrc,recpos,ntr_glob,2);}*/

/*if (SWS_TAPER_GRAD_SOURCES){*/   /*cylindrical taper around sources is applied*/
   /*taper_grad(waveconv,taper_coeff,srcpos,nsrc,recpos,ntr_glob,3);}*/
 
/* apply Hessian^-1 and save in gradp*/
/*if (SWS_TAPER_FILE){ 
  taper_grad(waveconv,taper_coeff,srcpos,nsrc,recpos,ntr_glob,5);
}*/

/* apply median filter at source positions */
/*median_src(waveconv,taper_coeff,srcpos,nsrc,recpos,ntr_glob,iter,0);*/

/* apply wavenumber damping */
if(SPATFILTER==1){
  wavenumber(waveconv);
}

if(SPATFILTER==2){
  smooth2(waveconv);
}
  
/* Normalize gradient to maximum value */
/*norm_fac_u=norm(waveconv_u,iter,2);
if(MYID==0){printf("norm_fac_u=%e \n",norm_fac_u);}*/
  
for (i=1;i<=NX;i=i+IDX){
   for (j=1;j<=NY;j=j+IDY){
	  gradp[j][i] = waveconv[j][i];
   }
}

/* save gradient for output as inversion result */
if(iter==nfstart_jac){
	sprintf(jac,"%s_p_it%d.old.%i%i",JACOBIAN,iter,POS[1],POS[2]);
	FP3=fopen(jac,"wb");

        	for (i=1;i<=NX;i=i+IDX){
           	for (j=1;j<=NY;j=j+IDY){
                	fwrite(&waveconv[j][i],sizeof(float),1,FP3);
           	}
        	}
	
	fclose(FP3);

	MPI_Barrier(MPI_COMM_WORLD);
          
	/* merge gradient file */ 
	sprintf(jac,"%s_p_it%d.old",JACOBIAN,iter);
	if (MYID==0) mergemod(jac,3);
}

}

/* =================================================================================================================================================== */
/* ===================================================================================================================================================== */
/* ===================================================== GRADIENT Vs/Zs/mu ================================================================================== */
/* ===================================================================================================================================================== */

if((INVMAT==3)||(INVMAT==0)){
	
/* Normalization of the gradient   */
/* ------------------------------- */
for (i=1;i<=NX;i=i+IDX){
   for (j=1;j<=NY;j=j+IDY){
      waveconv_u[j][i] = C_vs * waveconv_u[j][i];
   }
}

/* TEST: IMPLEMENTATION OF TAPER IN denise.c */
/*if (SWS_TAPER_GRAD_VERT){*/   /*vertical gradient taper is applied*/
   /*taper_grad(waveconv_u,taper_coeff,srcpos,nsrc,recpos,ntr_glob,1);}*/

/*if (SWS_TAPER_GRAD_HOR){*/   /*horizontal gradient taper is applied*/
   /*taper_grad(waveconv_u,taper_coeff,srcpos,nsrc,recpos,ntr_glob,2);}*/

/*if (SWS_TAPER_GRAD_SOURCES){*/   /*cylindrical taper around sources is applied*/
   /*taper_grad(waveconv_u,taper_coeff,srcpos,nsrc,recpos,ntr_glob,3);}*/
 
/* apply Hessian^-1 and save in gradp*/
/*if (SWS_TAPER_FILE){ 
  taper_grad(waveconv_u,taper_coeff,srcpos,nsrc,recpos,ntr_glob,5);
}*/

/* apply median filter at source positions */
/*median_src(waveconv_u,taper_coeff,srcpos,nsrc,recpos,ntr_glob,iter,0);*/

/* apply wavenumber damping */
if(SPATFILTER==1){
  wavenumber(waveconv_u);
}

if(SPATFILTER==2){
  smooth2(waveconv_u);
}
  
/* Normalize gradient to maximum value */
/*norm_fac_u=norm(waveconv_u,iter,2);
if(MYID==0){printf("norm_fac_u=%e \n",norm_fac_u);}*/
  
for (i=1;i<=NX;i=i+IDX){
   for (j=1;j<=NY;j=j+IDY){
	  gradp_u[j][i] = waveconv_u[j][i];
   }
}

/* save gradient for output as inversion result */
if(iter==nfstart_jac){
	sprintf(jac,"%s_p_u_it%d.old.%i%i",JACOBIAN,iter,POS[1],POS[2]);
	FP3=fopen(jac,"wb");

        	for (i=1;i<=NX;i=i+IDX){
           	for (j=1;j<=NY;j=j+IDY){
                	fwrite(&waveconv_u[j][i],sizeof(float),1,FP3);
           	}
        	}
	
	fclose(FP3);

	MPI_Barrier(MPI_COMM_WORLD);
          
	/* merge gradient file */ 
	sprintf(jac,"%s_p_u_it%d.old",JACOBIAN,iter);
	if (MYID==0) mergemod(jac,3);
}

}

/* ===================================================================================================================================================== */
/* ===================================================== GRADIENT rho ================================================================================== */
/* ===================================================================================================================================================== */

if((INVMAT==2)||(INVMAT==0)){

/* Normalization of the gradient   */
/* ------------------------------- */
for (i=1;i<=NX;i=i+IDX){
   for (j=1;j<=NY;j=j+IDY){
      waveconv_rho[j][i] = C_rho * waveconv_rho[j][i];
   }
}

/* TEST: IMPLEMENTAION OF TAPER IN denise.c */
/*if (SWS_TAPER_GRAD_VERT){*/   /*vertical gradient taper is applied*/
   /*taper_grad(waveconv_rho,taper_coeff,srcpos,nsrc,recpos,ntr_glob,1);}*/

/*if (SWS_TAPER_GRAD_HOR){*/   /*horizontal gradient taper is applied*/
   /*taper_grad(waveconv_rho,taper_coeff,srcpos,nsrc,recpos,ntr_glob,2);}*/

/*if (SWS_TAPER_GRAD_SOURCES){*/   /*cylindrical taper around sources is applied*/
   /*taper_grad(waveconv_rho,taper_coeff,srcpos,nsrc,recpos,ntr_glob,3);}*/

/* apply Hessian^-1 and save in gradp*/
/*if (SWS_TAPER_FILE){ 
  taper_grad(waveconv_rho,taper_coeff,srcpos,nsrc,recpos,ntr_glob,6);
}*/

/* apply median filter at source positions */
/*median_src(waveconv_rho,taper_coeff,srcpos,nsrc,recpos,ntr_glob,iter,0);*/

/* apply wavenumber damping */
if(SPATFILTER==1){
  wavenumber(waveconv_rho);
}

if(SPATFILTER==2){
  smooth2(waveconv_rho);
}
   
/* Normalize gradient to maximum value */
/*norm_fac_rho=norm(waveconv_rho,iter,3);
if(MYID==0){printf("norm_fac_rho=%e \n",norm_fac_rho);}*/

for (i=1;i<=NX;i=i+IDX){
   for (j=1;j<=NY;j=j+IDY){
	  gradp_rho[j][i] = waveconv_rho[j][i];
   }
} 

/* apply spatial wavelength filter */
/*if(SPATFILTER==1){
	if (MYID==0){
   	fprintf(FP,"\n Spatial filter is applied to gradient (written by PE %d)\n",MYID);}
spat_filt(waveconv_rho,iter,3);}*/

/* save gradient for output as inversion result */
if(iter==nfstart_jac){
	sprintf(jac,"%s_p_rho_it%d.old.%i%i",JACOBIAN,iter,POS[1],POS[2]);
	FP3=fopen(jac,"wb");

        	for (i=1;i<=NX;i=i+IDX){
           	for (j=1;j<=NY;j=j+IDY){
                	fwrite(&waveconv_rho[j][i],sizeof(float),1,FP3);
           	}
        	}
	
	fclose(FP3);

	MPI_Barrier(MPI_COMM_WORLD);
          
	/* merge gradient file */ 
	sprintf(jac,"%s_p_rho_it%d.old",JACOBIAN,iter);
	if (MYID==0) mergemod(jac,3);
}
}

/* calculate H^-1 * waveconv, using the L-BFGS method, if iter > 1 */
/* --------------------------------------------------------------------- */

if(iter>1){

   /* load old models and gradients - rho and store them in the LBFGS vectors */
   /* ------------------------------------------------------------------------ */

   sprintf(jac,"%s_p_rho.old.%i%i",JACOBIAN,POS[1],POS[2]);
   FP6=fopen(jac,"rb");
   
   sprintf(jac1,"%s_p_mrho.old.%i%i",JACOBIAN,POS[1],POS[2]);
   FP7=fopen(jac1,"rb");

   /*iter1 = iter-itershift;*/ /* shift iter counter by 1 because L-BFGS method starts at iter > 1 */
   
   h = NLBFGS_vec*(LBFGS_pointer-1) + 1; /* locate current initial position in LBFGS-vector */
   
     for (i=1;i<=NX;i=i+IDX){
        for (j=1;j<=NY;j=j+IDY){
   	  
          /* calculate and save y, s at iteration step iter */
          fread(&gradplastiter,sizeof(float),1,FP6);
          y_LBFGS[h] = waveconv_rho[j][i]-gradplastiter;

	  fread(&modellastiter,sizeof(float),1,FP7);
          s_LBFGS[h] = prho[j][i]-modellastiter;
          
          h++;
 
       }
     }
     
     fclose(FP6);
     fclose(FP7);
   
   /* load old models and gradients - Vs and store them in the LBFGS vectors */
   /* ----------------------------------------------------------------------- */
   sprintf(jac,"%s_p_u.old.%i%i",JACOBIAN,POS[1],POS[2]);
   FP6=fopen(jac,"rb");

   sprintf(jac1,"%s_p_vs.old.%i%i",JACOBIAN,POS[1],POS[2]);
   FP7=fopen(jac1,"rb");
   
     for (i=1;i<=NX;i=i+IDX){
       for (j=1;j<=NY;j=j+IDY){
   	  
          /* calculate and save y, s at iteration step iter */
          fread(&gradplastiter,sizeof(float),1,FP6);
          y_LBFGS[h] = waveconv_u[j][i]-gradplastiter;

    	  fread(&modellastiter,sizeof(float),1,FP7);
          s_LBFGS[h] = pu[j][i]-modellastiter;  
          
          h++;
          
       }
     }
     
     fclose(FP6);
     fclose(FP7);

   /* load old models and gradients - Vp and store them in the LBFGS vectors */
   /* ----------------------------------------------------------------------- */
   sprintf(jac,"%s_p.old.%i%i",JACOBIAN,POS[1],POS[2]);
   FP6=fopen(jac,"rb");

   sprintf(jac1,"%s_p_vp.old.%i%i",JACOBIAN,POS[1],POS[2]);
   FP7=fopen(jac1,"rb");
   
     for (i=1;i<=NX;i=i+IDX){
       for (j=1;j<=NY;j=j+IDY){
   	  
          /* calculate and save y, s at iteration step iter */
          fread(&gradplastiter,sizeof(float),1,FP6);
          y_LBFGS[h] = waveconv[j][i]-gradplastiter;

    	  fread(&modellastiter,sizeof(float),1,FP7);
          s_LBFGS[h] = ppi[j][i]-modellastiter;  
          
          h++;
          
       }
     }
     
     fclose(FP6);
     fclose(FP7);
     
     /* calculate improved first guess Hessian gamma_LBFGS */
     h1 = NLBFGS_vec*(LBFGS_pointer-1) + 1;
     h2 = NLBFGS_vec*LBFGS_pointer; 
     
     sum_nom = dotp(y_LBFGS,s_LBFGS,h1,h2,0);
     sum_denom = dotp(y_LBFGS,y_LBFGS,h1,h2,0);
     gamma_LBFGS = sum_nom/sum_denom;
     
     /*printf("gamma_LBFGS = %e \n",gamma_LBFGS);*/
         
     /* update variable rho for all LBFGS-iterations and all parameter classes*/
     for(k=1;k<=NLBFGS;k++){
          
        h1 = NLBFGS_vec*(k-1) + 1;
        h2 = NLBFGS_vec*k;
        sum_nom = dotp(y_LBFGS,s_LBFGS,h1,h2,0); 
	
	if(fabs(sum_nom)>0.0){
	  rho_LBFGS[k] = 1.0/sum_nom;
	}
	else{
	  rho_LBFGS[k] = 0.0;
	} 
	  
	if(MYID==0){                                                
	printf("rho_LBFGS = %e of k = %d \n",rho_LBFGS[k],k);}
	                                                       
     }
     
     /* save q_LBFGS for all material parameters */    
     h=1;
 
     for (i=1;i<=NX;i=i+IDX){
         for (j=1;j<=NY;j=j+IDY){
                             
	     q_LBFGS[h] = waveconv_rho[j][i];
	     h++;
                                                                 
         }
     }                                                                     
                                                                                   
     for (i=1;i<=NX;i=i+IDX){
         for (j=1;j<=NY;j=j+IDY){
          
	     q_LBFGS[h] = waveconv_u[j][i];
	     h++;	   
	      
         }
     }

     for (i=1;i<=NX;i=i+IDX){
         for (j=1;j<=NY;j=j+IDY){
          
	     q_LBFGS[h] = waveconv[j][i];
	     h++;	   
	      
         }
     }

     /* update alpha_LBFGS and q_LBFGS */
     for(k=NLBFGS;k>=1;k--){
		
       h1 = NLBFGS_vec*(k-1) + 1;
       h2 = NLBFGS_vec*k;
       sum_nom = dotp(s_LBFGS,q_LBFGS,h1,h2,1);
       alpha_LBFGS[k] = rho_LBFGS[k] * sum_nom;
       
       /* update q for all material parameters */
       h = NLBFGS_vec*(k-1) + 1;
       for (i=1;i<=NLBFGS_vec;i++){
           q_LBFGS[i] = q_LBFGS[i] - alpha_LBFGS[k] * y_LBFGS[h];
           h++;
       }
     }
	 
       /* Multiply gradient with approximated Hessian */
       for (i=1;i<=NLBFGS_vec;i++){
           r_LBFGS[i] = gamma_LBFGS * q_LBFGS[i];
       }

     /* calculate H^-1 * waveconv[j][i] */
     for(k=1;k<=NLBFGS;k++){
        
        h1 = NLBFGS_vec*(k-1) + 1;
        h2 = NLBFGS_vec*k;
        /* calculate beta_LBFGS*/   
        sum_nom = dotp(y_LBFGS,r_LBFGS,h1,h2,1);
        beta_LBFGS_1 = rho_LBFGS[k] * sum_nom;

        h = NLBFGS_vec*(k-1) + 1;
        for (i=1;i<=NLBFGS_vec;i++){
	   r_LBFGS[i] = r_LBFGS[i] + s_LBFGS[h]*(alpha_LBFGS[k]-beta_LBFGS_1);
	   h++;
        }
         
     }

     /* update gradients */
     h=1;
     
     /* density */
     for (i=1;i<=NX;i=i+IDX){   
        for (j=1;j<=NY;j=j+IDY){
                                 
	    waveconv_rho[j][i] = r_LBFGS[h];
	    h++;  
                                                                  
	}
     }
                                                                               
     /* Vs */
     for (i=1;i<=NX;i=i+IDX){
        for (j=1;j<=NY;j=j+IDY){
               
            waveconv_u[j][i] = r_LBFGS[h];
	    h++;
		  
        }
     }

     /* Vp */
     for (i=1;i<=NX;i=i+IDX){
        for (j=1;j<=NY;j=j+IDY){
               
            waveconv[j][i] = r_LBFGS[h];
	    h++;
		  
        }
     }


     /* Denormalize Gradients */
     for (i=1;i<=NX;i=i+IDX){
        for (j=1;j<=NY;j=j+IDY){
            
           waveconv[j][i] = waveconv[j][i] * C_vp;
	   waveconv_u[j][i] = waveconv_u[j][i] * C_vs;
	   waveconv_rho[j][i] = waveconv_rho[j][i] * C_rho;

        }
     }

}

/* save old models Vs */
/* ------------------ */

    /* save old model */
	sprintf(jac,"%s_p_vp.old.%i%i",JACOBIAN,POS[1],POS[2]);
	FP3=fopen(jac,"wb");

        for (i=1;i<=NX;i=i+IDX){
           for (j=1;j<=NY;j=j+IDY){
               fwrite(&ppi[j][i],sizeof(float),1,FP3);
           }
        }
	
	fclose(FP3);

	MPI_Barrier(MPI_COMM_WORLD);
          
	/* merge model file */ 
	sprintf(jac,"%s_p_vp.old",JACOBIAN);
	if (MYID==0) mergemod(jac,3);

	/* save old gradient */
	sprintf(jac,"%s_p.old.%i%i",JACOBIAN,POS[1],POS[2]);
	FP3=fopen(jac,"wb");

        for (i=1;i<=NX;i=i+IDX){
            for (j=1;j<=NY;j=j+IDY){
                	fwrite(&gradp[j][i],sizeof(float),1,FP3);
            }
        }
	
	fclose(FP3);

	MPI_Barrier(MPI_COMM_WORLD);
          
	/* merge gradient file */ 
	sprintf(jac,"%s_p.old",JACOBIAN);
	if (MYID==0) mergemod(jac,3);
	
	/* save H^-1 * g */
        sprintf(jac,"%s_c.old.%i%i",JACOBIAN,POS[1],POS[2]);
	FP3=fopen(jac,"wb");
	
	for (i=1;i<=NX;i=i+IDX){   
           for (j=1;j<=NY;j=j+IDY){
                 fwrite(&waveconv[j][i],sizeof(float),1,FP3);
	   }
        }
        
	fclose(FP3);
        MPI_Barrier(MPI_COMM_WORLD);
        
        /* merge gradient file */ 
	sprintf(jac,"%s_c.old",JACOBIAN);
	if (MYID==0) mergemod(jac,3);
	

/* save old models Vs */
/* ------------------ */

    /* save old model */
	sprintf(jac,"%s_p_vs.old.%i%i",JACOBIAN,POS[1],POS[2]);
	FP3=fopen(jac,"wb");

        for (i=1;i<=NX;i=i+IDX){
           for (j=1;j<=NY;j=j+IDY){
               fwrite(&pu[j][i],sizeof(float),1,FP3);
           }
        }
	
	fclose(FP3);

	MPI_Barrier(MPI_COMM_WORLD);
          
	/* merge model file */ 
	sprintf(jac,"%s_p_vs.old",JACOBIAN);
	if (MYID==0) mergemod(jac,3);

	/* save old gradient */
	sprintf(jac,"%s_p_u.old.%i%i",JACOBIAN,POS[1],POS[2]);
	FP3=fopen(jac,"wb");

        for (i=1;i<=NX;i=i+IDX){
            for (j=1;j<=NY;j=j+IDY){
                	fwrite(&gradp_u[j][i],sizeof(float),1,FP3);
            }
        }
	
	fclose(FP3);

	MPI_Barrier(MPI_COMM_WORLD);
          
	/* merge gradient file */ 
	sprintf(jac,"%s_p_u.old",JACOBIAN);
	if (MYID==0) mergemod(jac,3);
	
	/* save H^-1 * g */
        sprintf(jac,"%s_c_u.old.%i%i",JACOBIAN,POS[1],POS[2]);
	FP3=fopen(jac,"wb");
	
	for (i=1;i<=NX;i=i+IDX){   
           for (j=1;j<=NY;j=j+IDY){
                 fwrite(&waveconv_u[j][i],sizeof(float),1,FP3);
	   }
        }
        
	fclose(FP3);
        MPI_Barrier(MPI_COMM_WORLD);
        
        /* merge gradient file */ 
	sprintf(jac,"%s_c_u.old",JACOBIAN);
	if (MYID==0) mergemod(jac,3);


/* save old models Rho */
/* ------------------ */

	sprintf(jac,"%s_p_mrho.old.%i%i",JACOBIAN,POS[1],POS[2]);
	FP3=fopen(jac,"wb");

        for (i=1;i<=NX;i=i+IDX){
           for (j=1;j<=NY;j=j+IDY){
               fwrite(&prho[j][i],sizeof(float),1,FP3);
           }
        }
	
	fclose(FP3);

	MPI_Barrier(MPI_COMM_WORLD);
          
	/* merge model file */ 
	sprintf(jac,"%s_p_mrho.old",JACOBIAN);
	if (MYID==0) mergemod(jac,3);

	/* save old gradient */
	sprintf(jac,"%s_p_rho.old.%i%i",JACOBIAN,POS[1],POS[2]);
	FP3=fopen(jac,"wb");

        for (i=1;i<=NX;i=i+IDX){
            for (j=1;j<=NY;j=j+IDY){
                	fwrite(&gradp_rho[j][i],sizeof(float),1,FP3);
            }
        }
	
	fclose(FP3);

	MPI_Barrier(MPI_COMM_WORLD);
          
	/* merge gradient file */ 
	sprintf(jac,"%s_p_rho.old",JACOBIAN);
	if (MYID==0) mergemod(jac,3);
	
	/* save H^-1 * g_rho */
        sprintf(jac,"%s_c_rho.old.%i%i",JACOBIAN,POS[1],POS[2]);
	FP3=fopen(jac,"wb");
	
	for (i=1;i<=NX;i=i+IDX){   
           for (j=1;j<=NY;j=j+IDY){
                 fwrite(&waveconv_rho[j][i],sizeof(float),1,FP3);
	   }
        }
        
	fclose(FP3);
        MPI_Barrier(MPI_COMM_WORLD);
        
        /* merge gradient file */ 
	sprintf(jac,"%s_c_rho.old",JACOBIAN);
	if (MYID==0) mergemod(jac,3);
	
}