c *********************************************************************** subroutine update_euler(n) c update the Euler angles (alpha,beta,gama and phi) c note: alpha(i,i+1) is saved in alpha(i) (but corresponds to bead(i+1)) c save as bangle problem implicit double precision(a-h, o-z) parameter(maxa=500,maxn=maxa*3,pi2=2.d0*3.1415926535d0) integer n common/bf_coords/f(maxa,3),v(maxa,3),u(maxa,3) common/ischeme/icircular,iele,ihydro,iclose,iknot +,neuler common/tor_param/dr,cg,phi0,dlk,phii,subseg common/euler/alpha(maxa),beta(maxa),gama(maxa),phi(maxa) do i = 1, n if (i .eq. n) then ii = 1 else ii = i+1 endif udotu = u(i,1)*u(ii,1)+u(i,2)*u(ii,2)+u(i,3)*u(ii,3) if (udotu .gt. 1.d0) udotu = 1.d0 if (udotu .lt. -1.d0) udotu = -1.d0 beta(i) = dacos(udotu) fdotu = f(i,1)*u(ii,1)+f(i,2)*u(ii,2)+f(i,3)*u(ii,3) tmp = fdotu/sin(beta(i)) c prevent overflow because of machine error if (tmp .gt. 1.d0) tmp = 1.d0 if (tmp .lt. -1.d0) tmp = -1.d0 alphac = dacos(tmp) vdotu = v(i,1)*u(ii,1)+v(i,2)*u(ii,2)+v(i,3)*u(ii,3) if (vdotu .ge. 0) then alpha(i) = alphac else alpha(i) = -alphac endif fdotf = f(i,1)*f(ii,1)+f(i,2)*f(ii,2)+f(i,3)*f(ii,3) vdotv = v(i,1)*v(ii,1)+v(i,2)*v(ii,2)+v(i,3)*v(ii,3) tmp = (fdotf+vdotv)/(1.d0+udotu) if (tmp .gt. 1.d0) tmp = 1.d0 if (tmp .lt. -1.d0) tmp = -1.d0 alpha_gama = dacos(tmp) fdotv = f(i,1)*v(ii,1)+f(i,2)*v(ii,2)+f(i,3)*v(ii,3) vdotf = v(i,1)*f(ii,1)+v(i,2)*f(ii,2)+v(i,3)*f(ii,3) sin_alpha_gama = (vdotf-fdotv)/(1.d0+udotu) if (sin_alpha_gama .ge. 0.d0) then gama(i) = alpha_gama - alpha(i) else gama(i) = -alpha_gama - alpha(i) endif phi(i) = alpha(i) + gama(i) - phi0 enddo return end