- Timestamp:
- Jul 24, 2024, 7:06:44 PM (8 weeks ago)
- File:
-
- 1 moved
Legend:
- Unmodified
- Added
- Removed
-
LMDZ6/branches/Amaury_dev/libf/filtrez/lmdz_filtre_fft_loc.f90
r5119 r5120 1 MODULE mod_filtre_fft_loc 2 3 LOGICAL,SAVE :: use_filtre_fft 4 REAL,SAVE,ALLOCATABLE :: Filtre_u(:,:) 5 REAL,SAVE,ALLOCATABLE :: Filtre_v(:,:) 6 REAL,SAVE,ALLOCATABLE :: Filtre_inv(:,:) 1 MODULE lmdz_filtre_fft_loc 2 IMPLICIT NONE; PRIVATE 3 PUBLIC use_filtre_fft, filtre_u, filtre_v, filtre_inv, init_filtre_fft, filtre_u_fft, & 4 filtre_v_fft, filtre_inv_fft 5 6 LOGICAL, SAVE :: use_filtre_fft 7 REAL, SAVE, ALLOCATABLE :: Filtre_u(:, :) 8 REAL, SAVE, ALLOCATABLE :: Filtre_v(:, :) 9 REAL, SAVE, ALLOCATABLE :: Filtre_inv(:, :) 7 10 8 11 CONTAINS 9 10 SUBROUTINE Init_filtre_fft(coeffu, modfrstu,jfiltnu,jfiltsu,coeffv,modfrstv,jfiltnv,jfiltsv)12 13 SUBROUTINE Init_filtre_fft(coeffu, modfrstu, jfiltnu, jfiltsu, coeffv, modfrstv, jfiltnv, jfiltsv) 11 14 USE lmdz_fft 12 15 IMPLICIT NONE 13 16 include 'dimensions.h' 14 REAL, INTENT(IN) :: coeffu(iim,jjm) 15 INTEGER,INTENT(IN) :: modfrstu(jjm) 16 INTEGER,INTENT(IN) :: jfiltnu 17 INTEGER,INTENT(IN) :: jfiltsu 18 REAL, INTENT(IN) :: coeffv(iim,jjm) 19 INTEGER,INTENT(IN) :: modfrstv(jjm) 20 INTEGER,INTENT(IN) :: jfiltnv 21 INTEGER,INTENT(IN) :: jfiltsv 22 23 INTEGER :: index_vp(iim) 24 INTEGER :: i,j 25 26 index_vp(1)=1 27 DO i=1,iim/2 28 index_vp(i+1)=i*2 29 ENDDO 30 31 DO i=1,iim/2-1 32 index_vp(iim/2+i+1)=iim-2*i+1 33 ENDDO 34 35 ALLOCATE(Filtre_u(iim,jjm)) 36 ALLOCATE(Filtre_v(iim,jjm)) 37 ALLOCATE(Filtre_inv(iim,jjm)) 38 39 40 DO j=2,jfiltnu 41 DO i=1,iim 17 REAL, INTENT(IN) :: coeffu(iim, jjm) 18 INTEGER, INTENT(IN) :: modfrstu(jjm) 19 INTEGER, INTENT(IN) :: jfiltnu 20 INTEGER, INTENT(IN) :: jfiltsu 21 REAL, INTENT(IN) :: coeffv(iim, jjm) 22 INTEGER, INTENT(IN) :: modfrstv(jjm) 23 INTEGER, INTENT(IN) :: jfiltnv 24 INTEGER, INTENT(IN) :: jfiltsv 25 26 INTEGER :: index_vp(iim) 27 INTEGER :: i, j 28 29 index_vp(1) = 1 30 DO i = 1, iim / 2 31 index_vp(i + 1) = i * 2 32 ENDDO 33 34 DO i = 1, iim / 2 - 1 35 index_vp(iim / 2 + i + 1) = iim - 2 * i + 1 36 ENDDO 37 38 ALLOCATE(Filtre_u(iim, jjm)) 39 ALLOCATE(Filtre_v(iim, jjm)) 40 ALLOCATE(Filtre_inv(iim, jjm)) 41 42 DO j = 2, jfiltnu 43 DO i = 1, iim 42 44 IF (index_vp(i) < modfrstu(j)) THEN 43 Filtre_u(i, j)=044 ELSE 45 Filtre_u(i, j)=coeffu(index_vp(i),j)46 ENDIF 47 ENDDO 48 ENDDO 49 50 DO j =jfiltsu,jjm51 DO i =1,iim45 Filtre_u(i, j) = 0 46 ELSE 47 Filtre_u(i, j) = coeffu(index_vp(i), j) 48 ENDIF 49 ENDDO 50 ENDDO 51 52 DO j = jfiltsu, jjm 53 DO i = 1, iim 52 54 IF (index_vp(i) < modfrstu(j)) THEN 53 Filtre_u(i, j)=054 ELSE 55 Filtre_u(i, j)=coeffu(index_vp(i),j)56 ENDIF 57 ENDDO 58 ENDDO 59 60 DO j =1,jfiltnv61 DO i =1,iim55 Filtre_u(i, j) = 0 56 ELSE 57 Filtre_u(i, j) = coeffu(index_vp(i), j) 58 ENDIF 59 ENDDO 60 ENDDO 61 62 DO j = 1, jfiltnv 63 DO i = 1, iim 62 64 IF (index_vp(i) < modfrstv(j)) THEN 63 Filtre_v(i, j)=064 ELSE 65 Filtre_v(i, j)=coeffv(index_vp(i),j)66 ENDIF 67 ENDDO 68 ENDDO 69 70 DO j =jfiltsv,jjm71 DO i =1,iim65 Filtre_v(i, j) = 0 66 ELSE 67 Filtre_v(i, j) = coeffv(index_vp(i), j) 68 ENDIF 69 ENDDO 70 ENDDO 71 72 DO j = jfiltsv, jjm 73 DO i = 1, iim 72 74 IF (index_vp(i) < modfrstv(j)) THEN 73 Filtre_v(i, j)=074 ELSE 75 Filtre_v(i, j)=coeffv(index_vp(i),j)76 ENDIF 77 ENDDO 78 ENDDO 79 80 DO j =2,jfiltnu81 DO i =1,iim75 Filtre_v(i, j) = 0 76 ELSE 77 Filtre_v(i, j) = coeffv(index_vp(i), j) 78 ENDIF 79 ENDDO 80 ENDDO 81 82 DO j = 2, jfiltnu 83 DO i = 1, iim 82 84 IF (index_vp(i) < modfrstu(j)) THEN 83 Filtre_inv(i, j)=084 ELSE 85 Filtre_inv(i, j)=coeffu(index_vp(i),j)/(1.+coeffu(index_vp(i),j))86 ENDIF 87 ENDDO 88 ENDDO 89 90 DO j =jfiltsu,jjm91 DO i =1,iim85 Filtre_inv(i, j) = 0 86 ELSE 87 Filtre_inv(i, j) = coeffu(index_vp(i), j) / (1. + coeffu(index_vp(i), j)) 88 ENDIF 89 ENDDO 90 ENDDO 91 92 DO j = jfiltsu, jjm 93 DO i = 1, iim 92 94 IF (index_vp(i) < modfrstu(j)) THEN 93 Filtre_inv(i,j)=0 94 ELSE 95 Filtre_inv(i,j)=coeffu(index_vp(i),j)/(1.+coeffu(index_vp(i),j)) 96 ENDIF 97 ENDDO 98 ENDDO 99 100 101 ! CALL Init_FFT(iim,(jjm+1)*(llm+1)) 102 103 95 Filtre_inv(i, j) = 0 96 ELSE 97 Filtre_inv(i, j) = coeffu(index_vp(i), j) / (1. + coeffu(index_vp(i), j)) 98 ENDIF 99 ENDDO 100 ENDDO 101 102 103 ! CALL Init_FFT(iim,(jjm+1)*(llm+1)) 104 104 105 END SUBROUTINE Init_filtre_fft 105 106 SUBROUTINE Filtre_u_fft(vect_inout, jjb,jje,jj_begin,jj_end,nbniv)106 107 SUBROUTINE Filtre_u_fft(vect_inout, jjb, jje, jj_begin, jj_end, nbniv) 107 108 USE lmdz_fft 108 109 #ifdef CPP_PARA … … 111 112 IMPLICIT NONE 112 113 include 'dimensions.h' 113 INTEGER, INTENT(IN) :: jjb114 INTEGER, INTENT(IN) :: jje115 INTEGER, INTENT(IN) :: jj_begin116 INTEGER, INTENT(IN) :: jj_end117 INTEGER, INTENT(IN) :: nbniv118 REAL, INTENT(INOUT) :: vect_inout(iim+1,jjb:jje,nbniv)119 120 REAL :: vect(iim+inc,jj_end-jj_begin+1,nbniv)121 COMPLEX :: TF_vect(iim/2+1,jj_end-jj_begin+1,nbniv)122 INTEGER 123 INTEGER :: i, j,l114 INTEGER, INTENT(IN) :: jjb 115 INTEGER, INTENT(IN) :: jje 116 INTEGER, INTENT(IN) :: jj_begin 117 INTEGER, INTENT(IN) :: jj_end 118 INTEGER, INTENT(IN) :: nbniv 119 REAL, INTENT(INOUT) :: vect_inout(iim + 1, jjb:jje, nbniv) 120 121 REAL :: vect(iim + inc, jj_end - jj_begin + 1, nbniv) 122 COMPLEX :: TF_vect(iim / 2 + 1, jj_end - jj_begin + 1, nbniv) 123 INTEGER :: nb_vect 124 INTEGER :: i, j, l 124 125 INTEGER :: ll_nb 125 ! REAL :: vect_tmp(iim+inc,jj_end-jj_begin+1,nbniv)126 127 ll_nb =0128 !$OMP DO SCHEDULE(STATIC,OMP_CHUNK)129 DO l =1,nbniv130 ll_nb =ll_nb+1131 DO j =1,jj_end-jj_begin+1132 DO i =1,iim+1133 vect(i, j,ll_nb)=vect_inout(i,j+jj_begin-1,l)134 ENDDO 135 ENDDO 136 ENDDO 137 !$OMP END DO NOWAIT138 139 nb_vect =(jj_end-jj_begin+1)*ll_nb140 141 ! vect_tmp=vect142 143 CALL FFT_forward(vect, TF_vect,nb_vect)144 145 ! CALL FFT_forward(vect,TF_vect_test,nb_vect)146 ! PRINT *,"XXXXXXXXXXXXX Filtre_u_FFT xxxxxxxxxxxx"147 ! DO j=1,jj_end-jj_begin+1148 ! DO i=1,iim/2+1149 ! PRINT *,"====",i,j,"----->",TF_vect_test(i,j,1)150 ! ENDDO151 ! ENDDO152 153 DO l =1,ll_nb154 DO j =1,jj_end-jj_begin+1155 DO i =1,iim/2+1156 TF_vect(i, j,l)=TF_vect(i,j,l)*Filtre_u(i,jj_begin+j-1)157 ENDDO 158 ENDDO 159 ENDDO 160 161 CALL FFT_backward(TF_vect, vect,nb_vect)162 ! CALL FFT_backward(TF_vect_test,vect_test,nb_vect)163 164 ! PRINT *,"XXXXXXXXXXXXX Filtre_u_FFT xxxxxxxxxxxx"165 ! DO j=1,jj_end-jj_begin+1166 ! DO i=1,iim167 ! PRINT *,"====",i,j,"----->",vect_test(i,j,1)168 ! ENDDO169 ! ENDDO170 171 ll_nb =0172 !$OMP DO SCHEDULE(STATIC,OMP_CHUNK)173 DO l =1,nbniv174 ll_nb =ll_nb+1175 DO j =1,jj_end-jj_begin+1176 DO i =1,iim+1177 vect_inout(i, j+jj_begin-1,l)=vect(i,j,ll_nb)178 ENDDO 179 ENDDO 180 ENDDO 181 !$OMP END DO NOWAIT126 ! REAL :: vect_tmp(iim+inc,jj_end-jj_begin+1,nbniv) 127 128 ll_nb = 0 129 !$OMP DO SCHEDULE(STATIC,OMP_CHUNK) 130 DO l = 1, nbniv 131 ll_nb = ll_nb + 1 132 DO j = 1, jj_end - jj_begin + 1 133 DO i = 1, iim + 1 134 vect(i, j, ll_nb) = vect_inout(i, j + jj_begin - 1, l) 135 ENDDO 136 ENDDO 137 ENDDO 138 !$OMP END DO NOWAIT 139 140 nb_vect = (jj_end - jj_begin + 1) * ll_nb 141 142 ! vect_tmp=vect 143 144 CALL FFT_forward(vect, TF_vect, nb_vect) 145 146 ! CALL FFT_forward(vect,TF_vect_test,nb_vect) 147 ! PRINT *,"XXXXXXXXXXXXX Filtre_u_FFT xxxxxxxxxxxx" 148 ! DO j=1,jj_end-jj_begin+1 149 ! DO i=1,iim/2+1 150 ! PRINT *,"====",i,j,"----->",TF_vect_test(i,j,1) 151 ! ENDDO 152 ! ENDDO 153 154 DO l = 1, ll_nb 155 DO j = 1, jj_end - jj_begin + 1 156 DO i = 1, iim / 2 + 1 157 TF_vect(i, j, l) = TF_vect(i, j, l) * Filtre_u(i, jj_begin + j - 1) 158 ENDDO 159 ENDDO 160 ENDDO 161 162 CALL FFT_backward(TF_vect, vect, nb_vect) 163 ! CALL FFT_backward(TF_vect_test,vect_test,nb_vect) 164 165 ! PRINT *,"XXXXXXXXXXXXX Filtre_u_FFT xxxxxxxxxxxx" 166 ! DO j=1,jj_end-jj_begin+1 167 ! DO i=1,iim 168 ! PRINT *,"====",i,j,"----->",vect_test(i,j,1) 169 ! ENDDO 170 ! ENDDO 171 172 ll_nb = 0 173 !$OMP DO SCHEDULE(STATIC,OMP_CHUNK) 174 DO l = 1, nbniv 175 ll_nb = ll_nb + 1 176 DO j = 1, jj_end - jj_begin + 1 177 DO i = 1, iim + 1 178 vect_inout(i, j + jj_begin - 1, l) = vect(i, j, ll_nb) 179 ENDDO 180 ENDDO 181 ENDDO 182 !$OMP END DO NOWAIT 182 183 183 184 END SUBROUTINE Filtre_u_fft 184 185 186 SUBROUTINE Filtre_v_fft(vect_inout, jjb,jje,jj_begin,jj_end,nbniv)185 186 187 SUBROUTINE Filtre_v_fft(vect_inout, jjb, jje, jj_begin, jj_end, nbniv) 187 188 USE lmdz_fft 188 189 #ifdef CPP_PARA … … 191 192 IMPLICIT NONE 192 193 INCLUDE 'dimensions.h' 193 INTEGER, INTENT(IN) :: jjb194 INTEGER, INTENT(IN) :: jje195 INTEGER, INTENT(IN) :: jj_begin196 INTEGER, INTENT(IN) :: jj_end197 INTEGER, INTENT(IN) :: nbniv198 REAL, INTENT(INOUT) :: vect_inout(iim+1,jjb:jje,nbniv)199 200 REAL :: vect(iim+inc,jj_end-jj_begin+1,nbniv)201 COMPLEX :: TF_vect(iim/2+1,jj_end-jj_begin+1,nbniv)202 INTEGER 203 INTEGER :: i, j,l194 INTEGER, INTENT(IN) :: jjb 195 INTEGER, INTENT(IN) :: jje 196 INTEGER, INTENT(IN) :: jj_begin 197 INTEGER, INTENT(IN) :: jj_end 198 INTEGER, INTENT(IN) :: nbniv 199 REAL, INTENT(INOUT) :: vect_inout(iim + 1, jjb:jje, nbniv) 200 201 REAL :: vect(iim + inc, jj_end - jj_begin + 1, nbniv) 202 COMPLEX :: TF_vect(iim / 2 + 1, jj_end - jj_begin + 1, nbniv) 203 INTEGER :: nb_vect 204 INTEGER :: i, j, l 204 205 INTEGER :: ll_nb 205 206 ll_nb=0 207 !$OMP DO SCHEDULE(STATIC,OMP_CHUNK) 208 DO l=1,nbniv 209 ll_nb=ll_nb+1 210 DO j=1,jj_end-jj_begin+1 211 DO i=1,iim+1 212 vect(i,j,ll_nb)=vect_inout(i,j+jj_begin-1,l) 213 ENDDO 214 ENDDO 215 ENDDO 216 !$OMP END DO NOWAIT 217 218 219 nb_vect=(jj_end-jj_begin+1)*ll_nb 220 221 CALL FFT_forward(vect,TF_vect,nb_vect) 222 223 DO l=1,ll_nb 224 DO j=1,jj_end-jj_begin+1 225 DO i=1,iim/2+1 226 TF_vect(i,j,l)=TF_vect(i,j,l)*Filtre_v(i,jj_begin+j-1) 227 ENDDO 228 ENDDO 229 ENDDO 230 231 CALL FFT_backward(TF_vect,vect,nb_vect) 232 233 234 ll_nb=0 235 !$OMP DO SCHEDULE(STATIC,OMP_CHUNK) 236 DO l=1,nbniv 237 ll_nb=ll_nb+1 238 DO j=1,jj_end-jj_begin+1 239 DO i=1,iim+1 240 vect_inout(i,j+jj_begin-1,l)=vect(i,j,ll_nb) 241 ENDDO 242 ENDDO 243 ENDDO 244 !$OMP END DO NOWAIT 245 206 207 ll_nb = 0 208 !$OMP DO SCHEDULE(STATIC,OMP_CHUNK) 209 DO l = 1, nbniv 210 ll_nb = ll_nb + 1 211 DO j = 1, jj_end - jj_begin + 1 212 DO i = 1, iim + 1 213 vect(i, j, ll_nb) = vect_inout(i, j + jj_begin - 1, l) 214 ENDDO 215 ENDDO 216 ENDDO 217 !$OMP END DO NOWAIT 218 219 nb_vect = (jj_end - jj_begin + 1) * ll_nb 220 221 CALL FFT_forward(vect, TF_vect, nb_vect) 222 223 DO l = 1, ll_nb 224 DO j = 1, jj_end - jj_begin + 1 225 DO i = 1, iim / 2 + 1 226 TF_vect(i, j, l) = TF_vect(i, j, l) * Filtre_v(i, jj_begin + j - 1) 227 ENDDO 228 ENDDO 229 ENDDO 230 231 CALL FFT_backward(TF_vect, vect, nb_vect) 232 233 ll_nb = 0 234 !$OMP DO SCHEDULE(STATIC,OMP_CHUNK) 235 DO l = 1, nbniv 236 ll_nb = ll_nb + 1 237 DO j = 1, jj_end - jj_begin + 1 238 DO i = 1, iim + 1 239 vect_inout(i, j + jj_begin - 1, l) = vect(i, j, ll_nb) 240 ENDDO 241 ENDDO 242 ENDDO 243 !$OMP END DO NOWAIT 244 246 245 END SUBROUTINE Filtre_v_fft 247 246 248 247 249 SUBROUTINE Filtre_inv_fft(vect_inout, jjb,jje,jj_begin,jj_end,nbniv)248 SUBROUTINE Filtre_inv_fft(vect_inout, jjb, jje, jj_begin, jj_end, nbniv) 250 249 USE lmdz_fft 251 250 #ifdef CPP_PARA … … 254 253 IMPLICIT NONE 255 254 INCLUDE 'dimensions.h' 256 INTEGER, INTENT(IN) :: jjb257 INTEGER, INTENT(IN) :: jje258 INTEGER, INTENT(IN) :: jj_begin259 INTEGER, INTENT(IN) :: jj_end260 INTEGER, INTENT(IN) :: nbniv261 REAL, INTENT(INOUT) :: vect_inout(iim+1,jjb:jje,nbniv)262 263 REAL :: vect(iim+inc,jj_end-jj_begin+1,nbniv)264 COMPLEX :: TF_vect(iim/2+1,jj_end-jj_begin+1,nbniv)265 INTEGER 266 INTEGER :: i, j,l255 INTEGER, INTENT(IN) :: jjb 256 INTEGER, INTENT(IN) :: jje 257 INTEGER, INTENT(IN) :: jj_begin 258 INTEGER, INTENT(IN) :: jj_end 259 INTEGER, INTENT(IN) :: nbniv 260 REAL, INTENT(INOUT) :: vect_inout(iim + 1, jjb:jje, nbniv) 261 262 REAL :: vect(iim + inc, jj_end - jj_begin + 1, nbniv) 263 COMPLEX :: TF_vect(iim / 2 + 1, jj_end - jj_begin + 1, nbniv) 264 INTEGER :: nb_vect 265 INTEGER :: i, j, l 267 266 INTEGER :: ll_nb 268 269 ll_nb =0270 !$OMP DO SCHEDULE(STATIC,OMP_CHUNK)271 DO l =1,nbniv272 ll_nb =ll_nb+1273 DO j =1,jj_end-jj_begin+1274 DO i =1,iim+1275 vect(i, j,ll_nb)=vect_inout(i,j+jj_begin-1,l)276 ENDDO 277 ENDDO 278 ENDDO 279 !$OMP END DO NOWAIT280 281 nb_vect =(jj_end-jj_begin+1)*ll_nb282 283 CALL FFT_forward(vect, TF_vect,nb_vect)284 285 DO l =1,ll_nb286 DO j =1,jj_end-jj_begin+1287 DO i =1,iim/2+1288 TF_vect(i, j,l)=TF_vect(i,j,l)*Filtre_inv(i,jj_begin+j-1)289 ENDDO 290 ENDDO 291 ENDDO 292 293 CALL FFT_backward(TF_vect, vect,nb_vect)294 295 ll_nb =0296 !$OMP DO SCHEDULE(STATIC,OMP_CHUNK)297 DO l =1,nbniv298 ll_nb =ll_nb+1299 DO j =1,jj_end-jj_begin+1300 DO i =1,iim+1301 vect_inout(i, j+jj_begin-1,l)=vect(i,j,ll_nb)302 ENDDO 303 ENDDO 304 ENDDO 305 !$OMP END DO NOWAIT306 307 END SUBROUTINE Filtre_inv_fft 308 309 310 ! SUBROUTINE get_ll_index(nbniv,ll_index,ll_nb)311 ! IMPLICIT NONE312 ! INTEGER,INTENT(IN) :: nbniv313 ! INTEGER,INTENT(OUT) :: ll_index(nbniv)314 ! INTEGER,INTENT(OUT) :: ll_nb315 316 ! INTEGER :: l,ll_begin, ll_end317 ! INTEGER :: omp_rank,omp_size318 ! INTEGER :: OMP_GET_NUM_THREADS319 ! INTEGER :: omp_chunk320 ! EXTERNAL OMP_GET_NUM_THREADS321 ! INTEGER :: OMP_GET_THREAD_NUM322 ! EXTERNAL OMP_GET_THREAD_NUM323 324 325 ! omp_size=OMP_GET_NUM_THREADS()326 ! omp_rank=OMP_GET_THREAD_NUM() 327 ! omp_chunk=nbniv/omp_size+min(1,MOD(nbniv,omp_size))328 329 ! ll_begin=omp_rank*OMP_CHUNK+1330 ! ll_nb=0331 ! DO WHILE (ll_begin<=nbniv)332 ! ll_end=min(ll_begin+OMP_CHUNK-1,nbniv)333 ! DO l=ll_begin,ll_end334 ! ll_nb=ll_nb+1335 ! ll_index(ll_nb)=l336 ! ENDDO337 ! ll_begin=ll_begin+omp_size*OMP_CHUNK338 ! ENDDO339 340 ! END SUBROUTINE get_ll_index341 342 END MODULE mod_filtre_fft_loc267 268 ll_nb = 0 269 !$OMP DO SCHEDULE(STATIC,OMP_CHUNK) 270 DO l = 1, nbniv 271 ll_nb = ll_nb + 1 272 DO j = 1, jj_end - jj_begin + 1 273 DO i = 1, iim + 1 274 vect(i, j, ll_nb) = vect_inout(i, j + jj_begin - 1, l) 275 ENDDO 276 ENDDO 277 ENDDO 278 !$OMP END DO NOWAIT 279 280 nb_vect = (jj_end - jj_begin + 1) * ll_nb 281 282 CALL FFT_forward(vect, TF_vect, nb_vect) 283 284 DO l = 1, ll_nb 285 DO j = 1, jj_end - jj_begin + 1 286 DO i = 1, iim / 2 + 1 287 TF_vect(i, j, l) = TF_vect(i, j, l) * Filtre_inv(i, jj_begin + j - 1) 288 ENDDO 289 ENDDO 290 ENDDO 291 292 CALL FFT_backward(TF_vect, vect, nb_vect) 293 294 ll_nb = 0 295 !$OMP DO SCHEDULE(STATIC,OMP_CHUNK) 296 DO l = 1, nbniv 297 ll_nb = ll_nb + 1 298 DO j = 1, jj_end - jj_begin + 1 299 DO i = 1, iim + 1 300 vect_inout(i, j + jj_begin - 1, l) = vect(i, j, ll_nb) 301 ENDDO 302 ENDDO 303 ENDDO 304 !$OMP END DO NOWAIT 305 306 END SUBROUTINE Filtre_inv_fft 307 308 309 ! SUBROUTINE get_ll_index(nbniv,ll_index,ll_nb) 310 ! IMPLICIT NONE 311 ! INTEGER,INTENT(IN) :: nbniv 312 ! INTEGER,INTENT(OUT) :: ll_index(nbniv) 313 ! INTEGER,INTENT(OUT) :: ll_nb 314 315 ! INTEGER :: l,ll_begin, ll_end 316 ! INTEGER :: omp_rank,omp_size 317 ! INTEGER :: OMP_GET_NUM_THREADS 318 ! INTEGER :: omp_chunk 319 ! EXTERNAL OMP_GET_NUM_THREADS 320 ! INTEGER :: OMP_GET_THREAD_NUM 321 ! EXTERNAL OMP_GET_THREAD_NUM 322 323 324 ! omp_size=OMP_GET_NUM_THREADS() 325 ! omp_rank=OMP_GET_THREAD_NUM() 326 ! omp_chunk=nbniv/omp_size+min(1,MOD(nbniv,omp_size)) 327 328 ! ll_begin=omp_rank*OMP_CHUNK+1 329 ! ll_nb=0 330 ! DO WHILE (ll_begin<=nbniv) 331 ! ll_end=min(ll_begin+OMP_CHUNK-1,nbniv) 332 ! DO l=ll_begin,ll_end 333 ! ll_nb=ll_nb+1 334 ! ll_index(ll_nb)=l 335 ! ENDDO 336 ! ll_begin=ll_begin+omp_size*OMP_CHUNK 337 ! ENDDO 338 339 ! END SUBROUTINE get_ll_index 340 341 END MODULE lmdz_filtre_fft_loc 343 342
Note: See TracChangeset
for help on using the changeset viewer.