1
+ program main
2
+ !
3
+ integer :: im= 256 ,jm= 256 ,km= 256 ,hm= 3
4
+ real (8 ),parameter :: pi= 4.d0 * atan (1.0_8 )
5
+ !
6
+ real (8 ),allocatable ,dimension (:,:,:,:) :: x,df,df_ref
7
+ real (8 ),allocatable ,dimension (:,:,:) :: f
8
+ !
9
+ integer :: i,j,k
10
+ real (8 ) :: dx,dy,dz,error(3 )
11
+ real (8 ) :: time_beg,time_end
12
+ !
13
+ allocate (x(0 :im,0 :jm,0 :km,1 :3 ),f(- hm:im+ hm,- hm:jm+ hm,- hm:km+ hm),df(0 :im,0 :jm,0 :km,1 :3 ),df_ref(0 :im,0 :jm,0 :km,1 :3 ))
14
+ !
15
+ call cpu_time(time_beg)
16
+ ! initial value
17
+ do k= 0 ,km
18
+ do j= 0 ,jm
19
+ do i= 0 ,im
20
+ !
21
+ x(i,j,k,1 ) = 2.d0 * pi/ dble (im)* dble (i)
22
+ x(i,j,k,2 ) = 2.d0 * pi/ dble (jm)* dble (j)
23
+ x(i,j,k,3 ) = 2.d0 * pi/ dble (km)* dble (k)
24
+ !
25
+ f(i,j,k) = sin (x(i,j,k,1 ))* cos (x(i,j,k,2 ))* cos (x(i,j,k,3 ))
26
+ !
27
+ df_ref(i,j,k,1 ) = cos (x(i,j,k,1 ))* cos (x(i,j,k,2 ))* cos (x(i,j,k,3 ))
28
+ df_ref(i,j,k,2 ) = - sin (x(i,j,k,1 ))* sin (x(i,j,k,2 ))* cos (x(i,j,k,3 ))
29
+ df_ref(i,j,k,3 ) = - sin (x(i,j,k,1 ))* cos (x(i,j,k,2 ))* sin (x(i,j,k,3 ))
30
+ enddo
31
+ enddo
32
+ enddo
33
+ call cpu_time(time_end)
34
+ print * ,' ** CPU time for initialisation :' ,time_end- time_beg
35
+ !
36
+ dx= x(1 ,1 ,1 ,1 )- x(0 ,0 ,0 ,1 )
37
+ dy= x(1 ,1 ,1 ,2 )- x(0 ,0 ,0 ,2 )
38
+ dz= x(1 ,1 ,1 ,3 )- x(0 ,0 ,0 ,3 )
39
+ !
40
+ call cpu_time(time_beg)
41
+ ! boundary condition
42
+ do k= 0 ,km
43
+ do j= 0 ,jm
44
+ f(- hm:- 1 ,j,k) = f(im- hm:im-1 ,j,k)
45
+ f(im+1 :im+ hm,j,k) = f(1 :hm,j,k)
46
+ enddo
47
+ enddo
48
+ do k= 0 ,km
49
+ do i= 0 ,im
50
+ f(i,- hm:- 1 ,k) = f(i,jm- hm:jm-1 ,k)
51
+ f(i,jm+1 :jm+ hm,k) = f(i,1 :hm,k)
52
+ enddo
53
+ enddo
54
+ do j= 0 ,jm
55
+ do i= 0 ,im
56
+ f(i,j,- hm:- 1 ) = f(i,j,km- hm:km-1 )
57
+ f(i,j,km+1 :km+ hm) = f(i,j,1 :hm)
58
+ enddo
59
+ enddo
60
+ call cpu_time(time_end)
61
+ print * ,' ** CPU time for boundary condition :' ,time_end- time_beg
62
+ !
63
+ call cpu_time(time_beg)
64
+ ! gradient calculation with 6th-order scheme
65
+ !
66
+ do k= 0 ,km
67
+ do j= 0 ,jm
68
+ do i= 0 ,im
69
+ df(i,j,k,1 ) = 0.75d0 * (f(i+1 ,j,k)- f(i-1 ,j,k))- &
70
+ 0.15d0 * (f(i+2 ,j,k)- f(i-2 ,j,k))+ &
71
+ 1.66666666666667d-2 * (f(i+3 ,j,k)- f(i-3 ,j,k))
72
+ df(i,j,k,2 ) = 0.75d0 * (f(i,j+1 ,k)- f(i,j-1 ,k))- &
73
+ 0.15d0 * (f(i,j+2 ,k)- f(i,j-2 ,k))+ &
74
+ 1.66666666666667d-2 * (f(i,j+3 ,k)- f(i,j-3 ,k))
75
+ df(i,j,k,3 ) = 0.75d0 * (f(i,j,k+1 )- f(i,j,k-1 ))- &
76
+ 0.15d0 * (f(i,j,k+2 )- f(i,j,k-2 ))+ &
77
+ 1.66666666666667d-2 * (f(i,j,k+3 )- f(i,j,k-3 ))
78
+ enddo
79
+ enddo
80
+ enddo
81
+ df(:,:,:,1 )= df(:,:,:,1 )/ dx
82
+ df(:,:,:,2 )= df(:,:,:,2 )/ dy
83
+ df(:,:,:,3 )= df(:,:,:,3 )/ dz
84
+ !
85
+ call cpu_time(time_end)
86
+ print * ,' ** CPU time for gradient calculation :' ,time_end- time_beg
87
+ !
88
+ call cpu_time(time_beg)
89
+ ! validation
90
+ error= 0.d0
91
+ do k= 1 ,km
92
+ do j= 1 ,jm
93
+ do i= 1 ,im
94
+ !
95
+ error(1 ) = error(1 ) + (df(i,j,k,1 )- df_ref(i,j,k,1 ))** 2
96
+ error(2 ) = error(2 ) + (df(i,j,k,2 )- df_ref(i,j,k,2 ))** 2
97
+ error(3 ) = error(3 ) + (df(i,j,k,3 )- df_ref(i,j,k,3 ))** 2
98
+ !
99
+ ! if(i==1 .and. j==1) print*,'x-y-z:df3',i,j,k,x(i,j,k,:),df(i,j,k,3)
100
+ ! if(i==1 .and. k==1) print*,'x-y-z:df2',x(i,j,k,:),df(i,j,k,2)
101
+ !
102
+ enddo
103
+ enddo
104
+ enddo
105
+ error= error/ dble (im* jm* km)
106
+ !
107
+ print * ,' ** errors:' ,error
108
+ !
109
+ call cpu_time(time_end)
110
+ print * ,' ** CPU time for validation :' ,time_end- time_beg
111
+ !
112
+ print * ,' ** job done.'
113
+ !
114
+ end program
115
+ !
0 commit comments