Компьютерное моделирование процессов оптической накачки в реакциях фотоиндуцированного переноса электрона

Дипломная работа - Компьютеры, программирование

Другие дипломы по предмету Компьютеры, программирование

ics of Excited Donor-Acceptor Complexes // J. Phys. Chem. A 2008, 112, 594-601 p.

. Risken H. The Fokker-Planck equation: Methods of solurion and applications. - Berlin: Springer-Verlag, 1989. - 475 p.

. Serguei V. Feskov, Anna O. Kichigina, Anatoly I. Ivanov. Kinetics of Nonequilibrium Electron Transfer in PhotoexcitedRuthenium(II)-Cobalt(III) Complexes // J. Phys. Chem. - 2011.-115 1462-1471.

. Roman G. Fedunov, Serguei V. Feskov, Anatoly I. Ivanov, Olivier Nicolet, Stephane Page`s, Eric Vauthey. Effect of the excitation pulse carrier frequency on the ultrafast charge recombination dynamics of donor-acceptor complexes: Stochastic simulations and experiments // Journal of chemical physics. - 2004. - 20 August. - N 8. -3643-3656 p.

. Pages S., Lang B., Vauthey E. Ultrafast spectroscopic investigation of the charge recombination dynamics of ion pairs // J. Phys. Chem. A. - 2004. - V.108. -549-557 p.

. Ivanov A.I., Potovoi V.V. Theory of non-thermal electron transfer // Chem. Phys. - 1999. - V. 247. - N. 2. - 245-259.

 

Приложение А

 

Фрагмент исходного кода программы QM2L:

 

TImagingPoint::TImagingPoint(void)

{_x = prev_x = parameters->q0;(parameters->dq> 1.e-6)_x = prev_x += parameters->dq*RandG(0, 1);

_quantum = 0;= gr_term;_time = aux->start_time;_excited = false;

//exc_sum = 1.0;

}

::ProceedInterval(void)

{double A = profiles->x_limit1;double B = profiles->x_limit2;double C = SF_size/(B-A);T = state->current_time + parameters->save_interval;

(internal_time< T)

{index = round((cur_x-A)*C);= aux->step_profile[index];(internal_time + dt> T)= T - internal_time + 1.0e-9;(dt);_time+=dt;

}

}

void TImagingPoint::DoFullStep(double dt)

{

// ============ оптическая накачка системы ===============(!is_excited)(dt);

 

// ========= диффузия вдоль координаты реакции ===========

DoQStep(dt);

 

// ============= колебательнаярелаксация ================(parameters->is_relaxation)(term == gr_term)(v_quantum != 0)(isVRelax(dt))_quantum--;

 

// =========== пропускаемобратныепереходы ==============(!parameters->is_reversible)(term == gr_term) return;

 

// ======== электронные переходы между термами ===========(isSurfaceHop(dt))

{(term == ct_term)

{= gr_term;>num_hops_all[forw]++;(v_quantum==aux->strongest_sink)>num_hops_central[forw]++;

}

{= ct_term;_quantum = 0;>num_hops_all[back]++;(v_quantum==aux->strongest_sink)>num_hops_central[back]++;

}

}

}

void TImagingPoint::DoExcite(double dt)

{A = -log(1.0-parameters->pump_depth);= parameters->lambda_lf*fabs(aux->saddle_x[0]-cur_x);= parameters->tau_exc*(dU - parameters->omega_exc)/hbar;= exp(-2*dE*dE);arg_1 = (internal_time -

parameters->t_exc)/M_SQRT2/parameters->tau_exc;erf_1 = erf(arg_1);arg_2 = (internal_time +

dt - parameters->t_exc)/M_SQRT2/parameters->tau_exc;erf_2 = erf(arg_2);action = 0.5*Sw*A*(erf_2-erf_1);p = exp(-action);

//exc_sum *= p;r = uniform_random();(r>p)

{_excited = true;= ct_term;

}

}

void TImagingPoint::DoQStep(double dt)

{K1 = exp(-dt/parameters->tau_l);K2 = sqrt( aux->disp_x*(1.0-K1*K1) );_x = cur_x;(term == gr_term)_x = prev_x*K1 + RandG(0,1)*K2; //gaussian_random()_x = 2. + (prev_x-2.)*K1 + RandG(0,1)*K2;

}

::isSurfaceHop(double dt)

{(int quantum = 0; quantum num_hf_terms; quantum++)

{((cur_x-aux->saddle_x[quantum])*(prev_x-aux->saddle_x[quantum])<0.)

{((term == gr_term)&&(quantum != v_quantum)) continue;

v = fabs(cur_x-prev_x)/dt;exponent = aux->k0[quantum]/v;p = exp(-exponent);

(term == ct_term)

{>num_cross_all[forw]++;(quantum==aux->strongest_sink)

{>num_cross_central[forw]++;>average_p[forw] =

state->average_p[forw]*(state->num_cross_central[forw]-1.0)

/ (double)state->num_cross_central[forw] +

p/(double)state->num_cross_central[forw];

}

}

{>num_cross_all[back]++;(quantum==aux->strongest_sink)

{>num_cross_central[back]++;>average_p[back] = state->average_p[back]*

(state->num_cross_central[back]-1.0)

/ (double)state->num_cross_central[back] +

p/(double)state->num_cross_central[back];

}

}

r1 = uniform_random();(r1>p)

{_quantum = quantum;true;

}

}

}false;

}

::isVRelax(double dt)

{(5.*parameters->tau_vps);;

}