Was cleaning my home laptop and found this fortran transformation module that I wrote long time ago.
Has all the transformation that are generally used. Just posting it in case, I need it again.
module transformation implicit none ! ! Code: Sukhbinder ! 31st March 2010 ! real (kind=8) :: angle,agrad real (kind=8),parameter :: PI = 3.141592653589793 real (kind=8),parameter :: torad = PI/180.0d0 real (kind=8) :: rotz(4,4),rotx(4,4),roty(4,4) real (kind=8) :: shearxy(4,4),shearxz(4,4),shearyz(4,4) real (kind=8) :: trans(4,4),scale(4,4) contains subroutine setshearxy(a,b) real (kind=8) :: a,b shearxy(1:4,1:4) = 0.0d0 shearxy(1,3) = a shearxy(2,3) = b shearxy(1,1) =1.0d0 shearxy(2,2) =1.0d0 shearxy(3,3) =1.0d0 shearxy(4,4) =1.0d0 end subroutine subroutine setshearxz(a,b) real (kind=8) :: a,b shearxz(1:4,1:4) = 0.0d0 shearxz(1,2) = a shearxz(3,2) = b shearxz(1,1) =1.0d0 shearxz(2,2) =1.0d0 shearxz(3,3) =1.0d0 shearxz(4,4) =1.0d0 end subroutine subroutine setshearyz(a,b) real (kind=8) :: a,b shearyz(1:4,1:4) = 0.0d0 shearyz(2,1) = a shearyz(3,1) = b shearyz(1,1) =1.0d0 shearyz(2,2) =1.0d0 shearyz(3,3) =1.0d0 shearyz(4,4) =1.0d0 end subroutine subroutine setscale(p,q,r) real (kind=8) :: p,q,r scale(1:4,1:4) = 0.0d0 scale(1,1) = p scale(2,2) = q scale(3,3) = r scale(4,4) = 1.0d0 end subroutine subroutine settrans(p,q,r) real (kind=8) :: p,q,r trans(1:4,1:4) = 0.0d0 trans(1,4) = p trans(2,4) = q trans(3,4) = r trans(1,1) =1.0d0 trans(2,2) =1.0d0 trans(3,3) =1.0d0 trans(4,4) =1.0d0 end subroutine subroutine setrotz(ang) real(kind=8) :: ang rotz(1:4,1:4)=0.0d0 rotz(1,1) = cos(ang*torad) rotz(1,2) = -1*sin(ang*torad) rotz(2,1) = sin(ang*torad) rotz(2,2) = cos(ang*torad) rotz(3,3) = 1.0d0 rotz(4,4) = 1.0d0 end subroutine subroutine setrotx(ang) real(kind=8) :: ang rotx(1:4,1:4)=0.0d0 rotx(1,1) = 1.0d0 rotx(2,2) = cos(ang*torad) rotx(3,2) = sin(ang*torad) rotx(2,3) = -1*sin(ang*torad) rotx(3,3) = cos(ang*torad) rotx(4,4) = 1.0d0 end subroutine subroutine setroty(ang) real(kind=8) :: ang roty(1:4,1:4)=0.0d0 roty(1,1) = cos(ang*torad) roty(3,1) = -1*sin(ang*torad) roty(2,2) = 1.0d0 roty(1,3) = sin(ang*torad) roty(3,3) = cos(ang*torad) roty(4,4) = 1.0d0 end subroutine subroutine getnewcoords(oldcords,rotmat) real (kind=8) :: oldcords(:,:),rotmat(4,4) real (kind=8), allocatable :: newcoords(:,:) real (kind=8) :: oldone(4),newone(4) integer :: isize,i isize=size(oldcords,2) allocate(newcoords(3,isize)) do i=1,isize oldone(1:4)=1.0d0 oldone(1:3) = oldcords(1:3,i) newone(1:4)=1.0d0 newone=matmul(rotmat,oldone) newcoords(1:3,i)=newone(1:3) end do oldcords = newcoords deallocate(newcoords) end subroutine end module ! !!!!!!!!!!!!!!!!! example use !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! program test use transformation !open(20,file='bladeps.txt',status='old') !open(40,file='30degree.txt',status='new') real(kind=8) :: oldcords(4),xyz(3,10),temp(3,10) call random_number(oldcords) call random_number(xyz) oldcords=oldcords*10.0d0 oldcords(4)=1.0d0 xyz=xyz*10.0d0 write(*, '(3f10.2)') ((xyz(i,j),i=1,3),j=1,10) write(*,*) write(*, '(4f10.2)') (oldcords(i), i=1,4) write(*,*) call setrotz(30.0d0) write(*, '(4f10.2)') ((rotz(i,j),j=1,4),i=1,4) temp=xyz call getnewcoords(temp,rotz) write(*,*) write(*, '(3f10.2)') ((temp(i,j),i=1,3),j=1,10) !close(30) !close(20) end program test
Hello,
Welcome to my blog, my corner of the internet dedicated to all things that touches my life.
Stay updated with our latest tutorials and ideas by joining our newsletter.