#ifndef SMOOTH_H #define SMOOTH_H #include #include "../../include/config.h" #include "../../include/utils.h" void calc_inversed_laplacian(CUSTOMREAL* d, CUSTOMREAL* Ap, const int i, const int j, const int k, const CUSTOMREAL lr, const CUSTOMREAL lt, const CUSTOMREAL lp, const CUSTOMREAL dr, const CUSTOMREAL dt, const CUSTOMREAL dp) { // calculate inversed laplacian operator CUSTOMREAL termx = _0_CR, termy = _0_CR, termz = _0_CR; if (i==0) { termx = dp*lp/3.0 * (1/(lp*dp)*(d[I2V(i,j,k)]) - lp/(dp*dp*dp)*(-2.0*d[I2V(i,j,k)]+2*d[I2V(i+1,j,k)])); } else if (i==loc_I-1) { termx = dp*lp/3.0 * (1/(lp*dp)*(d[I2V(i,j,k)]) - lp/(dp*dp*dp)*(-2.0*d[I2V(i,j,k)]+2*d[I2V(i-1,j,k)])); } else { termx = dp*lp/3.0 * (1/(lp*dp)*(d[I2V(i,j,k)]) - lp/(dp*dp*dp)*(-2.0*d[I2V(i,j,k)]+d[I2V(i-1,j,k)]+d[I2V(i+1,j,k)])); } if (j==0) { termy = dt*lt/3.0 * (1/(lt*dt)*(d[I2V(i,j,k)]) - lt/(dt*dt*dt)*(-2.0*d[I2V(i,j,k)]+2*d[I2V(i,j+1,k)])); } else if (j==loc_J-1) { termy = dt*lt/3.0 * (1/(lt*dt)*(d[I2V(i,j,k)]) - lt/(dt*dt*dt)*(-2.0*d[I2V(i,j,k)]+2*d[I2V(i,j-1,k)])); } else { termy = dt*lt/3.0 * (1/(lt*dt)*(d[I2V(i,j,k)]) - lt/(dt*dt*dt)*(-2.0*d[I2V(i,j,k)]+d[I2V(i,j-1,k)]+d[I2V(i,j+1,k)])); } if (k==0) { termz = dr*lr/3.0 * (1/(lr*dr)*(d[I2V(i,j,k)]) - lr/(dr*dr*dr)*(-2.0*d[I2V(i,j,k)]+2*d[I2V(i,j,k+1)])); } else if (k==loc_K-1) { termz = dr*lr/3.0 * (1/(lr*dr)*(d[I2V(i,j,k)]) - lr/(dr*dr*dr)*(-2.0*d[I2V(i,j,k)]+2*d[I2V(i,j,k-1)])); } else { termz = dr*lr/3.0 * (1/(lr*dr)*(d[I2V(i,j,k)]) - lr/(dr*dr*dr)*(-2.0*d[I2V(i,j,k)]+d[I2V(i,j,k-1)]+d[I2V(i,j,k+1)])); } Ap[I2V(i,j,k)] = termx+termy+termz; } void CG_smooth(CUSTOMREAL* arr_in, CUSTOMREAL* arr_out, CUSTOMREAL lr, CUSTOMREAL lt, CUSTOMREAL lp) { // arr: array to be smoothed // lr: smooth length on r // lt: smooth length on theta // lp: smooth length on phi // arrays : // x_array model // g_array gradient // d_array descent direction // Ap stiffness scalar (laplacian) // pAp = d_array*Ap // rr = g_array * g_array (dot product) const int max_iter_cg = 1000; const CUSTOMREAL xtol = 0.001; const bool use_scaling = true; CUSTOMREAL dr=1, dt=100, dp=100; // allocate memory CUSTOMREAL* x_array = new CUSTOMREAL[loc_I*loc_J*loc_K]; CUSTOMREAL* r_array = new CUSTOMREAL[loc_I*loc_J*loc_K]; CUSTOMREAL* p_array = new CUSTOMREAL[loc_I*loc_J*loc_K]; CUSTOMREAL* Ap = new CUSTOMREAL[loc_I*loc_J*loc_K]; CUSTOMREAL pAp=_0_CR, rr_0=_0_CR, rr=_0_CR, rr_new=_0_CR, aa=_0_CR, bb=_0_CR, tmp=_0_CR; CUSTOMREAL scaling_A=_1_CR, scaling_coeff = _1_CR; if (use_scaling) { // calculate scaling factor //scaling_A = std::sqrt(_1_CR / (_8_CR * PI * lr * lt * lp)); // scaling coefficient for gradient scaling_coeff = find_absmax(arr_in, loc_I*loc_J*loc_K); //tmp = scaling_coeff; //allreduce_cr_single_max(tmp, scaling_coeff); //if (scaling_coeff == _0_CR) if (isZero(scaling_coeff)) scaling_coeff = _1_CR; } // std out scaling factors //if (myrank == 0) { std::cout << "scaling_A = " << scaling_A << std::endl; std::cout << "scaling_coeff = " << scaling_coeff << std::endl; //} // array initialization for (int i=0; i