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
Like Loading…

Leave a comment Cancel reply

Hello,

I’m Sukhbinder

Welcome to my blog, my corner of the internet dedicated to all things that touches my life.

Let’s connect

Join the fun!

Stay updated with our latest tutorials and ideas by joining our newsletter.

[フレーム]
Design a site like this with WordPress.com
Get started

AltStyle によって変換されたページ (->オリジナル) /