TreeMig Code
Loading...
Searching...
No Matches
GFT_Interact.f90
Go to the documentation of this file.
1!=====================================================================
13!===============================================================
14SUBROUTINE seedrainbyfft (nspc, year)
15 IMPLICIT NONE
16
17 INTEGER, INTENT(IN) :: nspc, year ! number of species, year
18
19 INTEGER ::isp
20 !
21 DO isp=1, nspc
22 CALL seedrainbyfftforthisspec( isp,year)
23 END DO
24 RETURN
25END Subroutine seedrainbyfft
26!=====================================================================
56!===============================================================
57SUBROUTINE seedrainbyfftforthisspec(isp, year)
58 USE gft, only: gft_prec
59 USE all_par, only: stategrid, spec, seedrain, maxlat, maxlon, &
61
62
63 IMPLICIT NONE
64 INTEGER, INTENT(IN) :: isp, year ! number of species
65
66 REAL(kind=gft_prec) :: seedprodarea(0:spec(isp)%maxlatEvenext-1, 1: spec(isp)%maxlonEvenext), &
67 seedrainarea(0:spec(isp)%maxlatEvenext-1, 1: spec(isp)%maxlonEvenext)
68 real*8 :: help(1:maxlat,1:maxlon), verynewseedsarray(1:maxlat, 1:maxlon)
69
70
71 COMPLEX(kind=GFT_Prec):: kernel_FT(0:spec(isp)%maxlatExt/2,spec(isp)%maxlonExt)
72
74
75 INTEGER :: ilat, ilon, latStart_Area, latEnd_Area,lonStart_Area, lonEnd_Area
76 REAL::producedSeedssum,producedSeedsav, presThresh
77
78 seedrainarea(:,:) =0
79
80 producedseedssum=sum(stategrid(1:maxlat,1:maxlon)%sp(isp)%producedSeeds)
81 if (producedseedssum==0) THEN ! if no produced seeds, the seed rain is zero
82 seedrain(:,:)%sp(isp)%verynewSeeds = 0
83 ELSE ! otherwise the convolution is done
84 latstart_area= 0
85 latend_area= maxlat-1
86 lonstart_area= 1
87 lonend_area= maxlon
88 help= stategrid(1:maxlat,1:maxlon)%sp(isp)%producedSeeds
89 ! call PrintMatrixASXY2File( help, 1,maxlat , 1,maxlon, "seedprod" )
90
91 ! store seed production to the small extended area, just for giving it to the convolution subprogram
92 seedprodarea(:,:) = 0.
93 seedprodarea(latstart_area:latend_area,lonstart_area:lonend_area)=stategrid(1:maxlat,1:maxlon)%sp(isp)%producedSeeds
94 ! call PrintMatrixASXY2File( seedProdArea, 0,spec(isp)%maxlatEvenext-1 , 1,spec(isp)%maxlonEvenext, "seedprodlarge" )
95
96
97 ! store the kernel, just for giving it to the convolution subprogram
98 kernel_ft=spec(isp)%kernel_FT
99
100 ! call PrintMatrixASXY2File(ABS(kernel_FT),0,spec(isp)%maxlatExt/2,1,spec(isp)%maxlonExt,"ABSkernel_FT_SR" )
101
102 ! do the convolution
103 CALL gft2dconvolution(isp, &
104 spec(isp)%maxlatEvenext,spec(isp)%maxlonEvenext,&
105 spec(isp)%maxlatExt, spec(isp)%maxlonExt, &
106 seedprodarea, kernel_ft ,seedrainarea)
107 ! This is a trick to "clean" the strange noise coming from the GFT convolution; helps against the noise, but slows down the migration!
108 presthresh = 500! 200. ! 600 is +- okay, a bit slow
109 producedseedsav = producedseedssum/(maxlat*maxlon)
110 do ilat =latstart_area, latend_area
111 do ilon= lonstart_area, lonend_area
112 if (seedrainarea(ilat, ilon)/producedseedsav < epskernel * presthresh) & !200 threshold found out by trying out
113 seedrainarea(ilat, ilon)=0
114 END DO
115 END DO
116 ! call PrintMatrixASXY2File(seedRainArea,0,spec(isp)%maxlatEvenext-1,1,spec(isp)%maxlonEvenext, "seedRainArea")
117
118 ! store back the calculated seedrain
119 verynewseedsarray = seedrainarea((latstart_area ) :(latend_area ), lonstart_area :lonend_area)
120 ! call PrintMatrixASXY2File(verynewseedsArray, 1,maxlat, 1,maxlon, "verynewseedsArray")
121
122 seedrain(:,:)%sp(isp)%verynewSeeds = 0.
123 seedrain(:,:)%sp(isp)%verynewSeeds = verynewseedsarray
124
125 seedrain(:,:)%sp(isp)%verynewSeeds = seedrain(:,:)%sp(isp)%verynewSeeds * stockability(:,:)
126 ENDIF
127 RETURN
128END Subroutine seedrainbyfftforthisspec
129!=====================================================================
146!===============================================================
147SUBROUTINE printmatrixasxy2file(array, dimystart, dimyend, dimxstart, dimxend, varname)
148 USE gft, only: gft_prec
149 IMPLICIT NONE
150 REAL(kind=gft_prec), DIMENSION(dimystart:dimyend,dimxstart:dimxend), INTENT (in):: array
151 INTEGER, INTENT(in):: dimystart,dimyend,dimxstart,dimxend
152 CHARACTER(*), INTENT(in):: varname !, filename
153
154 CHARACTER*50 :: filenamelong
155
156 INTEGER:: i,j
157 filenamelong = "AreaOutputs/"//varname//".txt"
158 print *, varname, " printing"
159 open(17,file= trim(filenamelong) )
160 write(17,*) "i,j,", varname
161 do i= dimystart,dimyend
162 do j= dimxstart,dimxend
163 write(17,*) i,",",j,",",array(i,j)
164 end do
165 end do
166 close(17)
167 return
168END SUBROUTINE printmatrixasxy2file
169
170!==============================================================================
199!==============================================================================
201 ! <CALL modules for TYPEdefinitions>---------------------------------------------------------------
202 USE gft, only: gft_prec
203 USE all_par, ONLY: spec
204
205 IMPLICIT NONE
206
207 ! <Passed variables>--------------------------------------------------------------------------------
208 INTEGER, INTENT(IN) :: isp
209
210 ! <Local variables>---------------------------------------------------------------------------------
211 INTEGER :: kerneldim, y_dim_kernel_orig,x_dim_kernel_orig,y_dim_kernel,x_dim_kernel, rad
212
213 REAL (kind=gft_prec), allocatable, dimension(:,:):: kernel_shifted, kernel_orig
214 COMPLEX(kind=GFT_Prec), allocatable, dimension(:,:):: kernel_FT
215
216
217 ! calculate the dimensions for the kernel arrays
218 rad = spec(isp)%rad
219 kerneldim= 2 * rad+1
220 y_dim_kernel = ((kerneldim-1)/2) * 2 +2 ! next even number
221 x_dim_kernel = ((kerneldim-1)/2) * 2 +2 ! next even number
222
223 y_dim_kernel_orig=kerneldim
224 x_dim_kernel_orig=kerneldim
225 ! allocate the kernel arrays
226 allocate( kernel_shifted(0:y_dim_kernel-1,1:x_dim_kernel))
227 allocate( kernel_orig(kerneldim,kerneldim))
228 allocate( kernel_ft(0 : spec(isp)%maxlatExt/2, 1 : spec(isp)%maxlonExt))
229
230 kernel_orig(:,:) =0.; kernel_shifted(:,:)=0.; kernel_ft(0:,:)=0.; spec(isp)%kernel_FT (0: ,:)=0.
231
232 kernel_orig=spec(isp)%kernel(-rad:rad, -rad:rad)
233
234 ! call PrintMatrixASXY2File(kernel_orig, 1,kerneldim, 1,kerneldim, "kernel_orig1" )
235
236 ! The kernel dimensions need to be even, therefore shifted
237
238 CALL shiftkerneltoeven(isp,y_dim_kernel_orig,x_dim_kernel_orig,&
239 y_dim_kernel, x_dim_kernel,&
240 kernel_orig,kernel_shifted)
241 ! call PrintMatrixASXY2File(kernel_shifted, 0,y_dim_kernel-1, 1,x_dim_kernel, "kernel_shifted" )
242
243
244 ! this is the transformation
245 CALL gft2dtransformkernel(spec(isp)%maxlatEvenExt,spec(isp)%maxlonEvenExt, &
246 spec(isp)%maxlatExt, spec(isp)%maxlonExt ,&
247 y_dim_kernel,x_dim_kernel, kernel_shifted, kernel_ft)
248
249 ! here the result, i.e. the kernel in frequency domain is stored
250 spec(isp)%kernel_FT=kernel_ft
251
252 ! free the kernel arrays
253 deallocate(kernel_shifted)
254 deallocate(kernel_ft)
255 deallocate(kernel_orig)
256 return
258!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
subroutine gft2dconvolution(isp, ny, mx, niy, mjx, spatdatain, kerneltransf, spatdataout)
subroutine gft2dtransformkernel(ny, mx, niy, mjx, y_dim_kernel, x_dim_kernel, kernelin, kerneltransf)
GFT2DTransformKernel
subroutine seedrainbyfftforthisspec(isp, year)
SeedRainByFFTForThisSpec.
subroutine seedrainbyfft(nspc, year)
SeedRainByFFT
subroutine calculatekerneltransformation(isp)
CalculateKernelTransformation.
subroutine printmatrixasxy2file(array, dimystart, dimyend, dimxstart, dimxend, varname)
PrintMatrixASXY2File.
subroutine shiftkerneltoeven(ispec, y_dim_kernel_orig, x_dim_kernel_orig, y_dim_kernel, x_dim_kernel, kernel_orig, kernel_shifted)
ShiftKernelToEven.
real, dimension(:, :), allocatable stockability
Definition All_par.f90:53
type(specproperties), dimension(maxspc) spec
Definition All_par.f90:345
type(currstateincell), dimension(:, :), allocatable stategrid
Definition All_par.f90:340
integer real
Definition All_par.f90:27
integer maxlon
Definition All_par.f90:46
type(newseedsincell), dimension(:, :), allocatable seedrain
Definition All_par.f90:342
real epskernel
Definition All_par.f90:64
real, parameter seednumberthresh
Definition All_par.f90:65
integer maxlat
Definition All_par.f90:45
Definition GFT.f90:15