WavefunctionData::WavefunctionData(SimulationData &sim_data) { this->psi = (MKL_Complex16*)mkl_malloc(sim_data.num_points * sizeof(MKL_Complex16), 64); this->psi_old = (MKL_Complex16*)mkl_malloc(sim_data.num_points * sizeof(MKL_Complex16), 64); this->psi_new = (MKL_Complex16*)mkl_malloc(sim_data.num_points * sizeof(MKL_Complex16), 64); this->conj_psi = (MKL_Complex16*)mkl_malloc(sim_data.num_points * sizeof(MKL_Complex16), 64); this->psi_tf = (double*)mkl_malloc(sim_data.num_points * sizeof(double), 64); this->psi_abs2 = (double*)mkl_malloc(sim_data.num_points * sizeof(double), 64); this->wavefunction_norm = 1; double expval; #pragma omp parallel for private(expval) for (int i = 0; i < sim_data.num_points; ++i) { expval = exp(-0.05 * pow(sim_data.x[i], 2.0)); this->psi[i].real = expval; this->psi[i].imag = 0; this->psi_old[i].real = expval; this->psi_old[i].imag = 0; this->psi_new[i].real = 0; this->psi_new[i].imag = 0; this->conj_psi[i].real = 0; this->conj_psi[i].imag = 0; this->psi_abs2[i] = 0; this->psi_tf[i] = 0; } calc_norm(sim_data, this->psi); normalize_wf(sim_data, this->psi); vzAbs(sim_data.num_points, this->psi, this->psi_abs2); vdMul(sim_data.num_points, this->psi_abs2, this->psi_abs2, this->psi_abs2); save_data(this->psi_abs2, sim_data, "init_state.bin"); }
//vzAbs Computation of the absolute value of vector elements void klVSLAbs(klVector< complex<double > >& v ,klVector<double>& ans) { vmlSetMode( VML_LA | VML_FTZDAZ_ON | VML_ERRMODE_ERRNO ); const __int64_t n = v.getColumns(); vzAbs( n, v.getMemory(),ans.getMemory()); }
void WavefunctionData::calc_norm(SimulationData &sim_data, MKL_Complex16 *wf) { vzAbs(sim_data.num_points, wf, this->psi_abs2); vdMul(sim_data.num_points, this->psi_abs2, this->psi_abs2, this->psi_abs2); double sum = 0; #pragma omp parallel for reduction(+:sum) for (int i = 0; i < sim_data.num_points; ++i) { sum += this->psi_abs2[i]; } this->wavefunction_norm = sum; }