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; }
// 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; }
__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; }
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); }
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); }
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); }