for (;;) { npair = dmol?nmol[0]*(nmol[0]-1)/2:(nmol[0]*nmol[1]); if (!npair) break; t0 += log(get_random_real()) / (ncol0 * mcs * npair); if (t0 < 0) break; cco1++; mol[0] = base[0] + get_random_integer(nmol[0]); mo[0] = mols_array+mols_index[mt[0]+1][mol[0]]; do { mol[1] = base[1] + get_random_integer(nmol[1]); mo[1] = mols_array+mols_index[mt[1]+1][mol[1]]; } while (mo[0] == mo[1]); for (cc=0; cc < 3; cc++) vrel[cc+1] = mo[0]->v[cc] - mo[1]->v[cc]; vrel[4] = vrel[2]*vrel[2]+vrel[3]*vrel[3]; vrel[5] = vrel[4]+vrel[1]*vrel[1]; FLOAT maxw; FLOAT wi[2]; bool flg; wi[0] = mo[0]->weight * fw[0]; wi[1] = mo[1]->weight * fw[1]; flg = wi[0]<wi[1]; maxw = wi[flg]; cs = ci->x1 * pow(vrel[5],ci->x2) * maxw; if ((mcs*get_random_real()) < cs) { if (cs > mcs) mcs = cs; mol[2] = mol[3] = 0; SINT32 NC[2], NCOL; bool kf[4], nflg; FLOAT wi0, wi2, minw; kf[2] = kf[3] = false; if (dmol && (mol[1] < mol[0])) { UINT32 ss; Molecule_t *m3; ss = mol[0]; mol[0] = mol[1]; mol[1] = ss; m3 = mo[0]; mo[0] = mo[1]; mo[1] = m3; nflg = flg; flg = !flg; minw = wi[flg]; } else { nflg = !flg; minw = wi[nflg]; } wi0 = (maxw-minw)*fw[2+flg]; wi2 = minw*fw[2+flg]; NC[nflg] = minw*fw[2+nflg]+get_random_real(); kf[nflg] = true; if (wi0 >= 1) { mo[flg]->weight = wi0*cell->weight; NC[flg] = wi2+get_random_real(); kf[flg] = false; } else { int a; NC[flg] = wi2; a = get_random_real() >= wi0; kf[flg] = a; NC[flg] += (((a-wi0)*get_random_real()) < (wi2-NC[flg]+a-1)); mo[flg]->weight = cell->weight; } for (NCOL=(NC[0]<NC[1])?NC[1]:NC[0]; NCOL; NCOL--) { if (!kf[2]) { mol[2] = mols_index_size[mt[0]+1]; mo[2] = alloc_mol(); if (!mo[2]) { Log("!Can't create collided mol"); exit(1); } add_mols_index(mt[0]+1, mo[2]-mols_array); nmol[0]++; nmol[1] += dmol; mo[0] = mols_array+mols_index[mt[0]+1][mol[0]]; mo[1] = mols_array+mols_index[mt[1]+1][mol[1]]; mo[3] = mols_array+mols_index[mt[1]+1][mol[3]]; kf[2] = true; } if (!kf[3]) { mol[3] = mols_index_size[mt[1]+1]; mo[3] = alloc_mol(); if (!mo[3]) { Log("!Can't create collided mol"); exit(1); } add_mols_index(mt[1]+1, mo[3]-mols_array); nmol[1]++; nmol[0] += dmol; mo[0] = mols_array+mols_index[mt[0]+1][mol[0]]; mo[1] = mols_array+mols_index[mt[1]+1][mol[1]]; mo[2] = mols_array+mols_index[mt[0]+1][mol[2]]; kf[3] = true; } *(mo[2])=*(mo[0]); *(mo[3])=*(mo[1]); DoCollide(mt[0], mt[1], mo[2], mo[3], ci, vrel); if ((NCOL*get_random_real()) < NC[0]) { mo[2]->weight = cell->weight; NC[0]--; kf[2] = false; } if ((NCOL*get_random_real()) < NC[1]) { mo[3]->weight = cell->weight; NC[1]--; kf[3] = false; } } for (j=3; j >= 0; j--) { int a = kf[j]; if (a) { int k = j&1; int mk = mt[k]; delete_mol(mo[j]); nmol[k]--; nmol[1-k] -= dmol; mols_index[mk+1][mol[j]] = mols_index[mk+1][--mols_index_size[mk+1]]; } } } }
Если кому интересно -- это отрывок из моей старой расчётной программы.
Вы всё ещё советуете мне устроиться программистом?