5 #include "petsc/finclude/petsc.h" 27 SUBROUTINE fft_par_real(communicator, V1_in, V_out, opt_nb_plane)
34 REAL(KIND=8),
DIMENSION(:,:,:),
INTENT(IN) :: V1_in
35 REAL(KIND=8),
DIMENSION(:,:,:),
ALLOCATABLE :: V_out
38 INTEGER,
OPTIONAL :: opt_nb_plane
39 INTEGER :: np, bloc_size, nb_field, &
40 m_max, m_max_c, rang, nb_procs, MPID, m_max_pad, N_r_pad
41 INTEGER(KIND=8) :: fftw_plan_multi_c2r
42 COMPLEX(KIND=8),
ALLOCATABLE,
DIMENSION(:,:,:) :: cu
43 INTEGER :: nb, nf, shiftc, shiftl, jindex, longueur_tranche, i, n, code
44 REAL(KIND=8),
ALLOCATABLE,
DIMENSION(:,:,:) :: dist_field, combined_field
45 INTEGER :: fft_dim, howmany, istride, ostride, idist, odist
46 INTEGER,
DIMENSION(1) :: dim, inembed, onembed
50 mpi_comm :: communicator
52 CALL mpi_comm_size(communicator, nb_procs, code)
53 CALL mpi_comm_rank(communicator, rang, code)
56 nb_field =
SIZE(v1_in,2)
57 m_max_c =
SIZE(v1_in,3)
58 m_max = m_max_c*nb_procs
59 IF (mod(nb_field,2)/=0 .OR. m_max_c==0)
THEN 60 CALL error_petsc(.OR.
'Bug in FFT_PAR_REAL: MOD(nb_field,2)/=0 m_max_c==0')
65 IF (modulo(np,nb_procs)==0)
THEN 66 bloc_size = np/nb_procs
69 CALL error_petsc(
'Bug in FFT_PAR_REAL: np is not a multiple of nb_procs')
72 IF (
PRESENT(opt_nb_plane))
THEN 73 IF (opt_nb_plane> 2*m_max-1)
THEN 74 m_max_pad = (opt_nb_plane+1)/2
83 ALLOCATE(cu(m_max_pad,nb_field/2, bloc_size))
84 ALLOCATE(dist_field(m_max_c,nb_field,np))
85 ALLOCATE(combined_field(m_max_c,nb_field,np))
88 dist_field(i,:,:) = transpose(v1_in(:,:,i))
91 longueur_tranche=bloc_size*m_max_c*nb_field
93 mpid=mpi_double_precision
94 CALL mpi_alltoall (dist_field,longueur_tranche, mpid, combined_field, longueur_tranche, &
95 mpid, communicator, code)
100 shiftc = (nb-1)*bloc_size
101 shiftl = (nb-1)*m_max_c
103 DO nf = 1, nb_field/2
108 cu(shiftl+1:shiftl+m_max_c,nf,n) = 0.5d0*cmplx(combined_field(:,2*nf-1,jindex),&
109 -combined_field(:,2*nf,jindex),kind=8)
113 cu(1,:,:) = 2*cmplx(
REAL(cu(1,:,:),KIND=8),0.d0,KIND=8)
125 onembed(1)= m_max_pad
126 howmany = bloc_size*nb_field/2
132 IF (
ALLOCATED(v_out))
DEALLOCATE(v_out)
133 ALLOCATE(v_out(n_r_pad,nb_field/2,bloc_size))
135 CALL dfftw_plan_many_dft_c2r(fftw_plan_multi_c2r, fft_dim, dim, howmany, cu, &
136 onembed, ostride, odist, v_out, inembed, istride, idist, fftw_estimate)
137 CALL dfftw_execute(fftw_plan_multi_c2r)
140 CALL dfftw_destroy_plan(fftw_plan_multi_c2r)
142 DEALLOCATE(cu, dist_field, combined_field)
146 SUBROUTINE fft_par_cross_prod_dcl(communicator,V1_in, V2_in, V_out, nb_procs, bloc_size, m_max_pad, temps)
153 REAL(KIND=8),
DIMENSION(:,:,:),
INTENT(IN) :: V1_in, V2_in
154 REAL(KIND=8),
DIMENSION(:,:,:),
INTENT(OUT) :: V_out
155 REAL(KIND=8),
DIMENSION(:),
OPTIONAL,
INTENT(INOUT) :: temps
156 INTEGER,
INTENT(IN) :: bloc_size, m_max_pad, nb_procs
157 INTEGER :: np, np_tot, nb_field, m_max, m_max_c, MPID, N_r_pad
158 INTEGER(KIND=8) :: fftw_plan_multi_c2r, fftw_plan_multi_r2c
159 COMPLEX(KIND=8),
DIMENSION(m_max_pad, SIZE(V1_in,2), bloc_size) :: cu
160 REAL(KIND=8),
DIMENSION(2*m_max_pad-1,SIZE(V1_in,2),bloc_size) :: ru
161 COMPLEX(KIND=8),
DIMENSION(m_max_pad,SIZE(V1_in,2)/2,bloc_size) :: prod_cu
162 REAL(KIND=8),
DIMENSION(2*m_max_pad-1,SIZE(V1_in,2)/2,bloc_size) :: prod_ru
163 COMPLEX(KIND=8),
DIMENSION(SIZE(V1_in,2)/2,bloc_size) :: intermediate
164 REAL(KIND=8),
DIMENSION(SIZE(V1_in,3),2*SIZE(V1_in,2),bloc_size*nb_procs) :: dist_field, combined_field
165 COMPLEX(KIND=8),
DIMENSION(SIZE(V1_in,2)/2,bloc_size,SIZE(V1_in,3)*nb_procs) :: combined_prod_cu
166 COMPLEX(KIND=8),
DIMENSION(SIZE(V1_in,2)/2,bloc_size,SIZE(V1_in,3)*nb_procs) :: dist_prod_cu
168 INTEGER :: nb, nf, shiftc, shiftl, jindex, longueur_tranche, i, n, code
171 INTEGER :: fft_dim, howmany, istride, ostride, idist, odist
172 INTEGER,
DIMENSION(1) :: dim, inembed, onembed
176 mpi_comm :: communicator
178 IF (
PRESENT(temps)) temps = 0.d0
181 nb_field=
SIZE(v1_in,2)
182 m_max_c =
SIZE(v1_in,3)
183 m_max = m_max_c*nb_procs
184 n_r_pad=2*m_max_pad-1
185 np_tot = nb_procs*bloc_size
187 IF (mod(nb_field,2)/=0 .OR. m_max_c==0)
THEN 205 dist_field(i,1:nb_field,1:np) = transpose(v1_in(:,:,i))
206 dist_field(i,nb_field+1:2*nb_field,1:np) = transpose(v2_in(:,:,i))
208 IF (
PRESENT(temps)) temps(3) = temps(3) + mpi_wtime() -t
210 IF (np/=np_tot) dist_field(:,:,np+1:np_tot) = 1.d100
212 longueur_tranche=bloc_size*m_max_c*nb_field*2
215 mpid=mpi_double_precision
216 CALL mpi_alltoall (dist_field,longueur_tranche, mpid, combined_field, longueur_tranche, &
217 mpid, communicator, code)
218 IF (
PRESENT(temps)) temps(1) = temps(1) + mpi_wtime() -t
226 shiftc = (nb-1)*bloc_size
227 shiftl = (nb-1)*m_max_c
235 cu(shiftl+1:shiftl+m_max_c,nf,n) = 0.5d0*cmplx(combined_field(:,2*nf-1,jindex),&
236 -combined_field(:,2*nf,jindex),kind=8)
240 cu(1,:,:) = 2*cmplx(
REAL(cu(1,:,:),KIND=8),0.d0,KIND=8)
246 IF (
PRESENT(temps)) temps(3) = temps(3) + mpi_wtime() -t
249 fft_dim=1; istride=1; ostride=1;
253 idist=n_r_pad; inembed(1)=n_r_pad; dim(1)=n_r_pad
254 odist=m_max_pad; onembed(1)=m_max_pad
257 howmany=bloc_size*nb_field
260 CALL dfftw_plan_many_dft_c2r(fftw_plan_multi_c2r, fft_dim, dim, howmany, cu, &
261 onembed, ostride, odist, ru, inembed, istride, idist, fftw_estimate)
263 CALL dfftw_execute(fftw_plan_multi_c2r)
266 CALL dfftw_destroy_plan(fftw_plan_multi_c2r)
269 IF (nb_field==6)
THEN 270 prod_ru(:,1,:) = ru(:,2,:)*ru(:,6,:) - ru(:,3,:)*ru(:,5,:)
271 prod_ru(:,2,:) = ru(:,3,:)*ru(:,4,:) - ru(:,1,:)*ru(:,6,:)
272 prod_ru(:,3,:) = ru(:,1,:)*ru(:,5,:) - ru(:,2,:)*ru(:,4,:)
277 CALL dfftw_plan_many_dft_r2c(fftw_plan_multi_r2c, fft_dim, dim, howmany, prod_ru, &
278 inembed, istride, idist, prod_cu, onembed, ostride, odist, fftw_estimate)
280 CALL dfftw_execute(fftw_plan_multi_r2c)
283 CALL dfftw_destroy_plan(fftw_plan_multi_r2c)
287 prod_cu = (1.d0/n_r_pad)*prod_cu
289 IF (
PRESENT(temps)) temps(2) = temps(2) + mpi_wtime() -t
294 combined_prod_cu(:,:,1)=prod_cu(1,:,:)
297 combined_prod_cu(:,:,n)=2*conjg(prod_cu(n,:,:))
300 IF (
PRESENT(temps)) temps(3) = temps(3) + mpi_wtime() -t
303 longueur_tranche=bloc_size*m_max_c*nb_field
304 mpid=mpi_double_precision
305 CALL mpi_alltoall (combined_prod_cu,longueur_tranche,mpid, dist_prod_cu,longueur_tranche, &
306 mpid,communicator,code)
307 IF (
PRESENT(temps)) temps(1) = temps(1) + mpi_wtime() -t
312 shiftc = (nb-1)*bloc_size
313 shiftl = (nb-1)*m_max_c
314 intermediate = dist_prod_cu(:,:,shiftl+i)
316 IF (n+shiftc > np ) cycle
317 DO i_field = 1, nb_field/2
318 v_out(n+shiftc, i_field*2-1, i) =
REAL (intermediate(i_field,n),KIND=8)
319 v_out(n+shiftc, i_field*2 , i) = aimag(intermediate(i_field,n))
325 IF (
PRESENT(temps)) temps(3) = temps(3) + mpi_wtime() -t
329 SUBROUTINE fft_par_dot_prod_dcl(communicator,V1_in, V2_in, c_out, nb_procs, bloc_size, m_max_pad, temps)
337 REAL(KIND=8),
DIMENSION(:,:,:),
INTENT(IN) :: V1_in, V2_in
338 REAL(KIND=8),
DIMENSION(:,:,:),
INTENT(OUT) :: c_out
339 REAL(KIND=8),
DIMENSION(:),
OPTIONAL,
INTENT(INOUT) :: temps
340 INTEGER,
INTENT(IN) :: nb_procs, bloc_size, m_max_pad
341 COMPLEX(KIND=8),
DIMENSION(m_max_pad, SIZE(V1_in,2), bloc_size) :: cu
342 REAL(KIND=8),
DIMENSION(2*m_max_pad-1,SIZE(V1_in,2),bloc_size) :: ru
343 COMPLEX(KIND=8),
DIMENSION(m_max_pad,bloc_size) :: prod_cu
344 REAL(KIND=8),
DIMENSION(2*m_max_pad-1,bloc_size) :: prod_ru
345 COMPLEX(KIND=8),
DIMENSION(bloc_size) :: intermediate
346 REAL(KIND=8),
DIMENSION(SIZE(V1_in,3),2*SIZE(V1_in,2),bloc_size*nb_procs) :: dist_field, combined_field
347 COMPLEX(KIND=8),
DIMENSION(bloc_size,SIZE(V1_in,3)*nb_procs) :: combined_prod_cu
348 COMPLEX(KIND=8),
DIMENSION(bloc_size,SIZE(V1_in,3)*nb_procs) :: dist_prod_cu
349 INTEGER :: np, np_tot, nb_field, m_max, m_max_c, MPID, N_r_pad
350 INTEGER(KIND=8) :: fftw_plan_multi_c2r, fftw_plan_multi_r2c
351 INTEGER :: nb, nf, shiftc, shiftl, jindex, longueur_tranche, i, n, code
354 INTEGER :: fft_dim, howmany, istride, ostride, idist, odist
355 INTEGER,
DIMENSION(1) :: dim, inembed, onembed
359 mpi_comm :: communicator
361 IF (
PRESENT(temps)) temps = 0.d0
364 nb_field=
SIZE(v1_in,2)
365 m_max_c =
SIZE(v1_in,3)
366 m_max = m_max_c*nb_procs
367 np_tot = nb_procs*bloc_size
368 n_r_pad=2*m_max_pad-1
370 IF (mod(nb_field,2)/=0 .OR. m_max_c==0)
THEN 383 dist_field(i,1:nb_field,1:np) = transpose(v1_in(:,:,i))
384 dist_field(i,nb_field+1:2*nb_field,1:np) = transpose(v2_in(:,:,i))
386 IF (
PRESENT(temps)) temps(3) = temps(3) + mpi_wtime() -t
388 IF (np/=np_tot) dist_field(:,:,np+1:np_tot) = 1.d100
390 longueur_tranche=bloc_size*m_max_c*nb_field*2
393 mpid=mpi_double_precision
394 CALL mpi_alltoall (dist_field,longueur_tranche, mpid, combined_field, longueur_tranche, &
395 mpid, communicator, code)
396 IF (
PRESENT(temps)) temps(1) = temps(1) + mpi_wtime() -t
404 shiftc = (nb-1)*bloc_size
405 shiftl = (nb-1)*m_max_c
413 cu(shiftl+1:shiftl+m_max_c,nf,n) = 0.5d0*cmplx(combined_field(:,2*nf-1,jindex),&
414 -combined_field(:,2*nf,jindex),kind=8)
418 cu(1,:,:) = 2*cmplx(
REAL(cu(1,:,:),KIND=8),0.d0,KIND=8)
424 IF (
PRESENT(temps)) temps(3) = temps(3) + mpi_wtime() -t
427 fft_dim=1; istride=1; ostride=1;
431 idist=n_r_pad; inembed(1)=n_r_pad; dim(1)=n_r_pad
432 odist=m_max_pad; onembed(1)=m_max_pad
435 howmany=bloc_size*nb_field
439 CALL dfftw_plan_many_dft_c2r(fftw_plan_multi_c2r, fft_dim, dim, howmany, cu, &
440 onembed, ostride, odist, ru, inembed, istride, idist, fftw_estimate)
442 CALL dfftw_execute(fftw_plan_multi_c2r)
445 CALL dfftw_destroy_plan(fftw_plan_multi_c2r)
448 IF (nb_field==6)
THEN 449 prod_ru(:,:) = ru(:,1,:)*ru(:,4,:) + ru(:,2,:)*ru(:,5,:) + ru(:,3,:)*ru(:,6,:)
453 howmany = bloc_size*1
454 CALL dfftw_plan_many_dft_r2c(fftw_plan_multi_r2c, fft_dim, dim, howmany, prod_ru, &
455 inembed, istride, idist, prod_cu, onembed, ostride, odist, fftw_estimate)
457 CALL dfftw_execute(fftw_plan_multi_r2c)
460 CALL dfftw_destroy_plan(fftw_plan_multi_r2c)
464 prod_cu = prod_cu*(1.d0/n_r_pad)
466 IF (
PRESENT(temps)) temps(2) = temps(2) + mpi_wtime() -t
470 combined_prod_cu(:,1)=prod_cu(1,:)
472 combined_prod_cu(:,n)=2*conjg(prod_cu(n,:))
475 IF (
PRESENT(temps)) temps(3) = temps(3) + mpi_wtime() -t
478 longueur_tranche=bloc_size*m_max_c*2
479 mpid=mpi_double_precision
480 CALL mpi_alltoall (combined_prod_cu,longueur_tranche,mpid, dist_prod_cu,longueur_tranche, &
481 mpid,communicator,code)
482 IF (
PRESENT(temps)) temps(1) = temps(1) + mpi_wtime() -t
487 shiftc = (nb-1)*bloc_size
488 shiftl = (nb-1)*m_max_c
489 intermediate = dist_prod_cu(:,shiftl+i)
491 IF (n+shiftc > np ) cycle
492 c_out(n+shiftc, 1, i) =
REAL (intermediate(n),KIND=8)
493 c_out(n+shiftc, 2 , i) = aimag(intermediate(n))
497 IF (
PRESENT(temps)) temps(3) = temps(3) + mpi_wtime() -t
501 SUBROUTINE fft_par_prod_dcl(communicator, c1_in, c2_in, c_out, nb_procs, bloc_size, m_max_pad, temps)
510 REAL(KIND=8),
DIMENSION(:,:,:),
INTENT(IN) :: c1_in, c2_in
511 REAL(KIND=8),
DIMENSION(:,:,:),
INTENT(OUT) :: c_out
512 REAL(KIND=8),
DIMENSION(:),
OPTIONAL,
INTENT(INOUT) :: temps
513 INTEGER,
INTENT(IN) :: nb_procs, bloc_size, m_max_pad
514 COMPLEX(KIND=8),
DIMENSION(m_max_pad, 2, bloc_size) :: cu
515 REAL(KIND=8),
DIMENSION(2*m_max_pad-1, 2, bloc_size) :: ru
516 COMPLEX(KIND=8),
DIMENSION(m_max_pad, bloc_size) :: prod_cu
517 REAL(KIND=8),
DIMENSION(2*m_max_pad-1,bloc_size) :: prod_ru
518 REAL(KIND=8),
DIMENSION(SIZE(c1_in,3),4, bloc_size*nb_procs) :: dist_field, combined_field
519 COMPLEX(KIND=8),
DIMENSION(bloc_size,SIZE(c1_in,3)*nb_procs) :: dist_prod_cu, combined_prod_cu
520 COMPLEX(KIND=8),
DIMENSION(bloc_size) :: intermediate
521 INTEGER :: np, np_tot, m_max, m_max_c, MPID, N_r_pad
522 INTEGER(KIND=8) :: fftw_plan_multi_c2r, fftw_plan_multi_r2c
523 INTEGER :: nb, nf, shiftc, shiftl, jindex, longueur_tranche, i, n, code
526 INTEGER :: fft_dim, howmany, istride, ostride, idist, odist
527 INTEGER,
DIMENSION(1) :: dim, inembed, onembed
531 mpi_comm :: communicator
533 IF (
PRESENT(temps)) temps = 0.d0
536 m_max_c =
SIZE(c1_in,3)
537 m_max = m_max_c*nb_procs
538 np_tot = nb_procs*bloc_size
539 n_r_pad=2*m_max_pad-1
553 dist_field(i,1:2,1:np) = transpose(c1_in(:,:,i))
554 dist_field(i,3:4,1:np) = transpose(c2_in(:,:,i))
556 IF (
PRESENT(temps)) temps(3) = temps(3) + mpi_wtime() -t
558 IF (np/=np_tot) dist_field(:,:,np+1:np_tot) = 1.d100
560 longueur_tranche=bloc_size*m_max_c*4
563 mpid=mpi_double_precision
564 CALL mpi_alltoall (dist_field,longueur_tranche, mpid, combined_field, longueur_tranche, &
565 mpid, communicator, code)
566 IF (
PRESENT(temps)) temps(1) = temps(1) + mpi_wtime() -t
574 shiftc = (nb-1)*bloc_size
575 shiftl = (nb-1)*m_max_c
583 cu(shiftl+1:shiftl+m_max_c,nf,n) = 0.5d0*cmplx(combined_field(:,2*nf-1,jindex),&
584 -combined_field(:,2*nf,jindex),kind=8)
588 cu(1,:,:) = 2*cmplx(
REAL(cu(1,:,:),KIND=8),0.d0,KIND=8)
594 IF (
PRESENT(temps)) temps(3) = temps(3) + mpi_wtime() -t
597 fft_dim=1; istride=1; ostride=1;
601 idist=n_r_pad; inembed(1)=n_r_pad; dim(1)=n_r_pad
602 odist=m_max_pad; onembed(1)=m_max_pad
608 CALL dfftw_plan_many_dft_c2r(fftw_plan_multi_c2r, fft_dim, dim, howmany, cu, &
609 onembed, ostride, odist, ru, inembed, istride, idist, fftw_estimate)
610 CALL dfftw_execute(fftw_plan_multi_c2r)
613 CALL dfftw_destroy_plan(fftw_plan_multi_c2r)
616 prod_ru(:,:) = ru(:,1,:)*ru(:,2,:)
619 howmany = bloc_size*1
620 CALL dfftw_plan_many_dft_r2c(fftw_plan_multi_r2c, fft_dim, dim, howmany, prod_ru, &
621 inembed, istride, idist, prod_cu, onembed, ostride, odist, fftw_estimate)
622 CALL dfftw_execute(fftw_plan_multi_r2c)
625 CALL dfftw_destroy_plan(fftw_plan_multi_r2c)
629 prod_cu = prod_cu*(1.d0/n_r_pad)
631 IF (
PRESENT(temps)) temps(2) = temps(2) + mpi_wtime() -t
635 combined_prod_cu(:,1)=prod_cu(1,:)
637 combined_prod_cu(:,n)=2*conjg(prod_cu(n,:))
640 IF (
PRESENT(temps)) temps(3) = temps(3) + mpi_wtime() -t
643 longueur_tranche=bloc_size*m_max_c*2
644 mpid=mpi_double_precision
645 CALL mpi_alltoall (combined_prod_cu,longueur_tranche,mpid, dist_prod_cu,longueur_tranche, &
646 mpid,communicator,code)
647 IF (
PRESENT(temps)) temps(1) = temps(1) + mpi_wtime() -t
652 shiftc = (nb-1)*bloc_size
653 shiftl = (nb-1)*m_max_c
654 intermediate = dist_prod_cu(:,shiftl+i)
656 IF (n+shiftc > np ) cycle
657 c_out(n+shiftc, 1, i) =
REAL (intermediate(n),KIND=8)
658 c_out(n+shiftc, 2 , i) = aimag(intermediate(n))
662 IF (
PRESENT(temps)) temps(3) = temps(3) + mpi_wtime() -t
666 SUBROUTINE fft_heaviside_dcl(communicator, V1_in, values, V_out, nb_procs, bloc_size, &
667 m_max_pad, coeff_tanh, temps)
674 REAL(KIND=8),
DIMENSION(:,:,:,:),
INTENT(IN) :: V1_in
675 REAL(KIND=8),
DIMENSION(:),
INTENT(IN) :: values
676 REAL(KIND=8),
INTENT(IN) :: coeff_tanh
677 REAL(KIND=8),
DIMENSION(:,:,:),
INTENT(OUT) :: V_out
678 REAL(KIND=8),
DIMENSION(:),
OPTIONAL,
INTENT(INOUT) :: temps
679 INTEGER,
INTENT(IN) :: bloc_size, m_max_pad, nb_procs
680 INTEGER :: np, np_tot, nb_field, m_max, m_max_c, MPID, N_r_pad
681 INTEGER(KIND=8) :: fftw_plan_multi_c2r, fftw_plan_multi_r2c
682 COMPLEX(KIND=8),
DIMENSION(m_max_pad, bloc_size) :: cu
683 REAL(KIND=8),
DIMENSION(2*m_max_pad-1, bloc_size) :: ru
684 COMPLEX(KIND=8),
DIMENSION(m_max_pad,bloc_size) :: prod_cu
685 REAL(KIND=8),
DIMENSION(2*m_max_pad-1,bloc_size) :: prod_ru
686 COMPLEX(KIND=8),
DIMENSION(bloc_size) :: intermediate
687 REAL(KIND=8),
DIMENSION(SIZE(V1_in,4),SIZE(V1_in,3),bloc_size*nb_procs) :: dist_field, combined_field
688 COMPLEX(KIND=8),
DIMENSION(bloc_size,SIZE(V1_in,4)*nb_procs) :: combined_prod_cu
689 COMPLEX(KIND=8),
DIMENSION(bloc_size,SIZE(V1_in,4)*nb_procs) :: dist_prod_cu
690 REAL(KIND=8),
DIMENSION(SIZE(values),2*m_max_pad-1, bloc_size) :: V1_real_loc
692 INTEGER :: nb, shiftc, shiftl, jindex, longueur_tranche, i, n, code, interface_nb
695 INTEGER :: fft_dim, howmany, istride, ostride, idist, odist
696 INTEGER,
DIMENSION(1) :: dim, inembed, onembed
700 mpi_comm :: communicator
702 IF (
PRESENT(temps)) temps = 0.d0
705 nb_field=
SIZE(v1_in,3)
706 m_max_c =
SIZE(v1_in,4)
707 m_max = m_max_c*nb_procs
708 n_r_pad=2*m_max_pad-1
709 np_tot = nb_procs*bloc_size
711 IF (mod(nb_field,2)/=0 .OR. m_max_c==0)
THEN 728 DO interface_nb = 1,
SIZE(values)-1
731 dist_field(i,1:nb_field,1:np) = transpose(v1_in(interface_nb,:,:,i))
733 IF (
PRESENT(temps)) temps(3) = temps(3) + mpi_wtime() -t
735 IF (np/=np_tot) dist_field(:,:,np+1:np_tot) = 1.d100
737 longueur_tranche=bloc_size*m_max_c*nb_field
740 mpid=mpi_double_precision
741 CALL mpi_alltoall (dist_field,longueur_tranche, mpid, combined_field, longueur_tranche, &
742 mpid, communicator, code)
744 IF (
PRESENT(temps)) temps(1) = temps(1) + mpi_wtime() -t
752 shiftc = (nb-1)*bloc_size
753 shiftl = (nb-1)*m_max_c
760 cu(shiftl+1:shiftl+m_max_c,n) = 0.5d0*cmplx(combined_field(:,1,jindex),&
761 -combined_field(:,2,jindex),kind=8)
764 cu(1,:) = 2*cmplx(
REAL(cu(1,:),KIND=8),0.d0,KIND=8)
767 IF (
PRESENT(temps)) temps(3) = temps(3) + mpi_wtime() -t
770 fft_dim=1; istride=1; ostride=1;
774 idist=n_r_pad; inembed(1)=n_r_pad; dim(1)=n_r_pad
775 odist=m_max_pad; onembed(1)=m_max_pad
778 howmany=bloc_size*nb_field/2
781 CALL dfftw_plan_many_dft_c2r(fftw_plan_multi_c2r, fft_dim, dim, howmany, cu, &
782 onembed, ostride, odist, ru, inembed, istride, idist, fftw_estimate)
784 CALL dfftw_execute(fftw_plan_multi_c2r)
787 CALL dfftw_destroy_plan(fftw_plan_multi_c2r)
788 v1_real_loc(interface_nb,:,:)=ru
792 IF (nb_field==2)
THEN 793 DO n1 = 1, 2*m_max_pad-1
795 prod_ru(n1,n2) = values(1)
796 DO interface_nb = 1,
SIZE(values)-1
798 prod_ru(n1,n2) = prod_ru(n1,n2)*(1.d0-
regul(v1_real_loc(interface_nb,n1,n2),coeff_tanh)) + &
799 values(interface_nb+1)*
regul(v1_real_loc(interface_nb,n1,n2),coeff_tanh)
807 CALL dfftw_plan_many_dft_r2c(fftw_plan_multi_r2c, fft_dim, dim, howmany, prod_ru, &
808 inembed, istride, idist, prod_cu, onembed, ostride, odist, fftw_estimate)
810 CALL dfftw_execute(fftw_plan_multi_r2c)
813 CALL dfftw_destroy_plan(fftw_plan_multi_r2c)
817 prod_cu = prod_cu*(1.d0/n_r_pad)
819 IF (
PRESENT(temps)) temps(2) = temps(2) + mpi_wtime() -t
823 combined_prod_cu(:,1)=prod_cu(1,:)
826 combined_prod_cu(:,n)=2*conjg(prod_cu(n,:))
829 IF (
PRESENT(temps)) temps(3) = temps(3) + mpi_wtime() -t
832 longueur_tranche=bloc_size*m_max_c*nb_field
833 mpid=mpi_double_precision
834 CALL mpi_alltoall (combined_prod_cu,longueur_tranche,mpid, dist_prod_cu,longueur_tranche, &
835 mpid,communicator,code)
836 IF (
PRESENT(temps)) temps(1) = temps(1) + mpi_wtime() -t
841 shiftc = (nb-1)*bloc_size
842 shiftl = (nb-1)*m_max_c
843 intermediate = dist_prod_cu(:,shiftl+i)
845 IF (n+shiftc > np ) cycle
846 v_out(n+shiftc, 1, i) =
REAL (intermediate(n),KIND=8)
847 v_out(n+shiftc, 2, i) = aimag(intermediate(n))
851 IF (
PRESENT(temps)) temps(3) = temps(3) + mpi_wtime() -t
856 bloc_size, m_max_pad, temps)
864 REAL(KIND=8),
DIMENSION(:,:,:),
INTENT(IN) :: V1_in
865 REAL(KIND=8),
DIMENSION(:,:,:),
INTENT(IN) :: V2_in
866 REAL(KIND=8),
DIMENSION(:,:,:),
INTENT(OUT) :: V_out
867 REAL(KIND=8),
DIMENSION(:),
OPTIONAL,
INTENT(INOUT) :: temps
868 INTEGER,
INTENT(IN) :: bloc_size, m_max_pad, nb_procs
869 INTEGER,
INTENT(IN) :: pb
870 INTEGER :: np, np_tot, nb_field1, nb_field2, m_max, m_max_c, MPID, N_r_pad
871 INTEGER(KIND=8) :: fftw_plan_multi_c2r, fftw_plan_multi_r2c
872 COMPLEX(KIND=8),
DIMENSION(m_max_pad, (SIZE(V1_in,2)+SIZE(V2_in,2))/2, bloc_size) :: cu
873 REAL(KIND=8),
DIMENSION(2*m_max_pad-1,(SIZE(V1_in,2)+SIZE(V2_in,2))/2,bloc_size) :: ru
874 COMPLEX(KIND=8),
DIMENSION(m_max_pad,SIZE(V1_in,2)/2,bloc_size) :: prod_cu
875 REAL(KIND=8),
DIMENSION(2*m_max_pad-1,SIZE(V1_in,2)/2,bloc_size) :: prod_ru
876 COMPLEX(KIND=8),
DIMENSION(SIZE(V1_in,2)/2, bloc_size) :: intermediate
877 REAL(KIND=8),
DIMENSION(SIZE(V1_in,3),SIZE(V1_in,2)+SIZE(V2_in,2),bloc_size*nb_procs) :: dist_field
878 REAL(KIND=8),
DIMENSION(SIZE(V1_in,3),SIZE(V1_in,2)+SIZE(V2_in,2),bloc_size*nb_procs) :: combined_field
879 COMPLEX(KIND=8),
DIMENSION(SIZE(V1_in,2)/2,bloc_size,SIZE(V1_in,3)*nb_procs) :: combined_prod_cu
880 COMPLEX(KIND=8),
DIMENSION(SIZE(V1_in,2)/2,bloc_size,SIZE(V1_in,3)*nb_procs) :: dist_prod_cu
882 INTEGER :: nb, nf, shiftc, shiftl, jindex, longueur_tranche, i, n, code
885 INTEGER :: fft_dim, howmany, istride, ostride, idist, odist
886 INTEGER,
DIMENSION(1) :: dim, inembed, onembed
890 mpi_comm :: communicator
892 IF (
PRESENT(temps)) temps = 0.d0
895 nb_field1=
SIZE(v1_in,2)
896 nb_field2=
SIZE(v2_in,2)
897 m_max_c =
SIZE(v1_in,3)
898 m_max = m_max_c*nb_procs
899 n_r_pad=2*m_max_pad-1
900 np_tot = nb_procs*bloc_size
902 IF (mod(nb_field1,2)/=0 .OR. mod(nb_field2,2)/=0 .OR. m_max_c==0)
THEN 920 dist_field(i,1:nb_field1,1:np) = transpose(v1_in(:,:,i))
921 dist_field(i,nb_field1+1:nb_field1+nb_field2,1:np) = transpose(v2_in(:,:,i))
923 IF (
PRESENT(temps)) temps(3) = temps(3) + mpi_wtime() -t
925 IF (np/=np_tot) dist_field(:,:,np+1:np_tot) = 1.d100
927 longueur_tranche=bloc_size*m_max_c*(nb_field1+nb_field2)
930 mpid=mpi_double_precision
931 CALL mpi_alltoall (dist_field,longueur_tranche, mpid, combined_field, longueur_tranche, &
932 mpid, communicator, code)
933 IF (
PRESENT(temps)) temps(1) = temps(1) + mpi_wtime() -t
941 shiftc = (nb-1)*bloc_size
942 shiftl = (nb-1)*m_max_c
944 DO nf = 1, (nb_field1+nb_field2)/2
950 cu(shiftl+1:shiftl+m_max_c,nf,n) = 0.5d0*cmplx(combined_field(:,2*nf-1,jindex),&
951 -combined_field(:,2*nf,jindex),kind=8)
955 cu(1,:,:) = 2*cmplx(
REAL(cu(1,:,:),KIND=8),0.d0,KIND=8)
961 IF (
PRESENT(temps)) temps(3) = temps(3) + mpi_wtime() -t
964 fft_dim=1; istride=1; ostride=1;
968 idist=n_r_pad; inembed(1)=n_r_pad; dim(1)=n_r_pad
969 odist=m_max_pad; onembed(1)=m_max_pad
972 howmany=bloc_size*(nb_field1+nb_field2)/2
975 CALL dfftw_plan_many_dft_c2r(fftw_plan_multi_c2r, fft_dim, dim, howmany, cu, &
976 onembed, ostride, odist, ru, inembed, istride, idist, fftw_estimate)
978 CALL dfftw_execute(fftw_plan_multi_c2r)
981 CALL dfftw_destroy_plan(fftw_plan_multi_c2r)
983 IF (nb_field1 == 6 .AND. nb_field2 == 2)
THEN 985 prod_ru(:,1,:) = ru(:,4,:)*ru(:,1,:)
986 prod_ru(:,2,:) = ru(:,4,:)*ru(:,2,:)
987 prod_ru(:,3,:) = ru(:,4,:)*ru(:,3,:)
989 prod_ru(:,1,:) = ru(:,1,:)/ru(:,4,:)
990 prod_ru(:,2,:) = ru(:,2,:)/ru(:,4,:)
991 prod_ru(:,3,:) = ru(:,3,:)/ru(:,4,:)
993 CALL error_petsc(
'error in problem type while calling FFT_SCALAR_VECT_DCL ')
996 CALL error_petsc(
'error in dimension of INPUT variables while calling FFT_SCALAR_VECT_DCL ')
999 howmany = bloc_size*nb_field1/2
1001 CALL dfftw_plan_many_dft_r2c(fftw_plan_multi_r2c, fft_dim, dim, howmany, prod_ru, &
1002 inembed, istride, idist, prod_cu, onembed, ostride, odist, fftw_estimate)
1004 CALL dfftw_execute(fftw_plan_multi_r2c)
1006 CALL dfftw_destroy_plan(fftw_plan_multi_r2c)
1012 prod_cu = prod_cu*(1.d0/n_r_pad)
1014 IF (
PRESENT(temps)) temps(2) = temps(2) + mpi_wtime() -t
1019 combined_prod_cu(:,:,1)=prod_cu(1,:,:)
1022 combined_prod_cu(:,:,n)=2*conjg(prod_cu(n,:,:))
1025 IF (
PRESENT(temps)) temps(3) = temps(3) + mpi_wtime() -t
1027 longueur_tranche=bloc_size*m_max_c*nb_field1
1030 mpid=mpi_double_precision
1031 CALL mpi_alltoall (combined_prod_cu,longueur_tranche,mpid, dist_prod_cu,longueur_tranche, &
1032 mpid,communicator,code)
1034 IF (
PRESENT(temps)) temps(1) = temps(1) + mpi_wtime() -t
1040 shiftc = (nb-1)*bloc_size
1041 shiftl = (nb-1)*m_max_c
1042 intermediate = dist_prod_cu(:,:,shiftl+i)
1044 IF (n+shiftc > np ) cycle
1045 DO i_field = 1, nb_field1/2
1046 v_out(n+shiftc, i_field*2-1, i) =
REAL (intermediate(i_field,n),KIND=8)
1047 v_out(n+shiftc, i_field*2 , i) = aimag(intermediate(i_field,n))
1052 IF (
PRESENT(temps)) temps(3) = temps(3) + mpi_wtime() -t
1057 bloc_size, m_max_pad, temps)
1065 REAL(KIND=8),
DIMENSION(:,:,:),
INTENT(IN) :: V1_in
1066 REAL(KIND=8),
DIMENSION(:,:,:),
INTENT(IN) :: V2_in
1067 REAL(KIND=8),
DIMENSION(:),
INTENT(IN) :: scalar_bounds
1068 REAL(KIND=8),
DIMENSION(:,:,:),
INTENT(OUT) :: V_out
1069 REAL(KIND=8),
DIMENSION(:),
OPTIONAL,
INTENT(INOUT) :: temps
1070 INTEGER,
INTENT(IN) :: bloc_size, m_max_pad, nb_procs
1071 INTEGER,
INTENT(IN) :: pb
1072 INTEGER :: np, np_tot, nb_field1, nb_field2, m_max, m_max_c, MPID, N_r_pad
1073 INTEGER(KIND=8) :: fftw_plan_multi_c2r, fftw_plan_multi_r2c
1074 COMPLEX(KIND=8),
DIMENSION(m_max_pad, (SIZE(V1_in,2)+SIZE(V2_in,2))/2, bloc_size) :: cu
1075 REAL(KIND=8),
DIMENSION(2*m_max_pad-1,(SIZE(V1_in,2)+SIZE(V2_in,2))/2,bloc_size) :: ru
1076 COMPLEX(KIND=8),
DIMENSION(m_max_pad,SIZE(V1_in,2)/2,bloc_size) :: prod_cu
1077 REAL(KIND=8),
DIMENSION(2*m_max_pad-1,SIZE(V1_in,2)/2,bloc_size) :: prod_ru
1078 COMPLEX(KIND=8),
DIMENSION(SIZE(V1_in,2)/2, bloc_size) :: intermediate
1079 REAL(KIND=8),
DIMENSION(SIZE(V1_in,3),SIZE(V1_in,2)+SIZE(V2_in,2),bloc_size*nb_procs) :: dist_field
1080 REAL(KIND=8),
DIMENSION(SIZE(V1_in,3),SIZE(V1_in,2)+SIZE(V2_in,2),bloc_size*nb_procs) :: combined_field
1081 COMPLEX(KIND=8),
DIMENSION(SIZE(V1_in,2)/2,bloc_size,SIZE(V1_in,3)*nb_procs) :: combined_prod_cu
1082 COMPLEX(KIND=8),
DIMENSION(SIZE(V1_in,2)/2,bloc_size,SIZE(V1_in,3)*nb_procs) :: dist_prod_cu
1084 INTEGER :: nb, nf, shiftc, shiftl, jindex, longueur_tranche, i, n, code
1085 REAL(KIND=8) :: t, scalar_min, scalar_max
1087 INTEGER :: fft_dim, howmany, istride, ostride, idist, odist
1088 INTEGER,
DIMENSION(1) :: dim, inembed, onembed
1092 mpi_comm :: communicator
1094 IF (
PRESENT(temps)) temps = 0.d0
1097 nb_field1=
SIZE(v1_in,2)
1098 nb_field2=
SIZE(v2_in,2)
1099 m_max_c =
SIZE(v1_in,3)
1100 m_max = m_max_c*nb_procs
1101 n_r_pad=2*m_max_pad-1
1102 np_tot = nb_procs*bloc_size
1104 IF (mod(nb_field1,2)/=0 .OR. mod(nb_field2,2)/=0 .OR. m_max_c==0)
THEN 1122 dist_field(i,1:nb_field1,1:np) = transpose(v1_in(:,:,i))
1123 dist_field(i,nb_field1+1:nb_field1+nb_field2,1:np) = transpose(v2_in(:,:,i))
1125 IF (
PRESENT(temps)) temps(3) = temps(3) + mpi_wtime() -t
1127 IF (np/=np_tot) dist_field(:,:,np+1:np_tot) = 1.d100
1129 longueur_tranche=bloc_size*m_max_c*(nb_field1+nb_field2)
1132 mpid=mpi_double_precision
1133 CALL mpi_alltoall (dist_field,longueur_tranche, mpid, combined_field, longueur_tranche, &
1134 mpid, communicator, code)
1135 IF (
PRESENT(temps)) temps(1) = temps(1) + mpi_wtime() -t
1143 shiftc = (nb-1)*bloc_size
1144 shiftl = (nb-1)*m_max_c
1146 DO nf = 1, (nb_field1+nb_field2)/2
1152 cu(shiftl+1:shiftl+m_max_c,nf,n) = 0.5d0*cmplx(combined_field(:,2*nf-1,jindex),&
1153 -combined_field(:,2*nf,jindex),kind=8)
1157 cu(1,:,:) = 2*cmplx(
REAL(cu(1,:,:),KIND=8),0.d0,KIND=8)
1163 IF (
PRESENT(temps)) temps(3) = temps(3) + mpi_wtime() -t
1166 fft_dim=1; istride=1; ostride=1;
1170 idist=n_r_pad; inembed(1)=n_r_pad; dim(1)=n_r_pad
1171 odist=m_max_pad; onembed(1)=m_max_pad
1174 howmany=bloc_size*(nb_field1+nb_field2)/2
1177 CALL dfftw_plan_many_dft_c2r(fftw_plan_multi_c2r, fft_dim, dim, howmany, cu, &
1178 onembed, ostride, odist, ru, inembed, istride, idist, fftw_estimate)
1180 CALL dfftw_execute(fftw_plan_multi_c2r)
1183 CALL dfftw_destroy_plan(fftw_plan_multi_c2r)
1185 IF (nb_field1 == 6 .AND. nb_field2 == 2)
THEN 1186 scalar_min = minval(scalar_bounds)
1187 scalar_max = maxval(scalar_bounds)
1189 prod_ru(:,1,:) = max(scalar_min,min(ru(:,4,:),scalar_max))*ru(:,1,:)
1190 prod_ru(:,2,:) = max(scalar_min,min(ru(:,4,:),scalar_max))*ru(:,2,:)
1191 prod_ru(:,3,:) = max(scalar_min,min(ru(:,4,:),scalar_max))*ru(:,3,:)
1192 ELSE IF (pb==2)
THEN 1193 prod_ru(:,1,:) = ru(:,1,:)/max(scalar_min,min(ru(:,4,:),scalar_max))
1194 prod_ru(:,2,:) = ru(:,2,:)/max(scalar_min,min(ru(:,4,:),scalar_max))
1195 prod_ru(:,3,:) = ru(:,3,:)/max(scalar_min,min(ru(:,4,:),scalar_max))
1197 CALL error_petsc(
'error in problem type while calling FFT_SCALAR_VECT_DCL ')
1200 CALL error_petsc(
'error in dimension of INPUT variables while calling FFT_SCALAR_VECT_DCL ')
1203 howmany = bloc_size*nb_field1/2
1205 CALL dfftw_plan_many_dft_r2c(fftw_plan_multi_r2c, fft_dim, dim, howmany, prod_ru, &
1206 inembed, istride, idist, prod_cu, onembed, ostride, odist, fftw_estimate)
1208 CALL dfftw_execute(fftw_plan_multi_r2c)
1210 CALL dfftw_destroy_plan(fftw_plan_multi_r2c)
1216 prod_cu = prod_cu*(1.d0/n_r_pad)
1218 IF (
PRESENT(temps)) temps(2) = temps(2) + mpi_wtime() -t
1223 combined_prod_cu(:,:,1)=prod_cu(1,:,:)
1226 combined_prod_cu(:,:,n)=2*conjg(prod_cu(n,:,:))
1229 IF (
PRESENT(temps)) temps(3) = temps(3) + mpi_wtime() -t
1231 longueur_tranche=bloc_size*m_max_c*nb_field1
1234 mpid=mpi_double_precision
1235 CALL mpi_alltoall (combined_prod_cu,longueur_tranche,mpid, dist_prod_cu,longueur_tranche, &
1236 mpid,communicator,code)
1238 IF (
PRESENT(temps)) temps(1) = temps(1) + mpi_wtime() -t
1244 shiftc = (nb-1)*bloc_size
1245 shiftl = (nb-1)*m_max_c
1246 intermediate = dist_prod_cu(:,:,shiftl+i)
1248 IF (n+shiftc > np ) cycle
1249 DO i_field = 1, nb_field1/2
1250 v_out(n+shiftc, i_field*2-1, i) =
REAL (intermediate(i_field,n),KIND=8)
1251 v_out(n+shiftc, i_field*2 , i) = aimag(intermediate(i_field,n))
1256 IF (
PRESENT(temps)) temps(3) = temps(3) + mpi_wtime() -t
1260 SUBROUTINE fft_max_vel_dcl(communicator, V1_in, V_out, nb_procs, bloc_size, m_max_pad)
1268 REAL(KIND=8),
DIMENSION(:,:,:),
INTENT(IN) :: V1_in
1269 REAL(KIND=8),
INTENT(OUT) :: V_out
1270 INTEGER,
INTENT(IN) :: bloc_size, m_max_pad, nb_procs
1271 INTEGER :: np, np_tot, nb_field1, m_max, m_max_c, MPID, N_r_pad
1272 INTEGER(KIND=8) :: fftw_plan_multi_c2r
1273 COMPLEX(KIND=8),
DIMENSION(m_max_pad, SIZE(V1_in,2)/2, bloc_size) :: cu
1274 REAL(KIND=8),
DIMENSION(2*m_max_pad-1, SIZE(V1_in,2)/2,bloc_size) :: ru
1275 REAL(KIND=8),
DIMENSION(SIZE(V1_in,3),SIZE(V1_in,2),bloc_size*nb_procs) :: dist_field, combined_field
1276 INTEGER :: nb, nf, shiftc, shiftl, jindex, longueur_tranche, i, n, code
1277 REAL(KIND=8),
DIMENSION(2*m_max_pad-1, bloc_size) :: norm_vel_loc
1278 REAL(KIND=8) :: max_velocity
1280 INTEGER :: fft_dim, howmany, istride, ostride, idist, odist
1281 INTEGER,
DIMENSION(1) :: dim, inembed, onembed
1285 mpi_comm :: communicator
1288 nb_field1 =
SIZE(v1_in,2)
1289 m_max_c =
SIZE(v1_in,3)
1290 m_max = m_max_c*nb_procs
1291 n_r_pad = 2*m_max_pad-1
1292 np_tot = nb_procs*bloc_size
1294 IF (mod(nb_field1,2)/=0 .OR. m_max_c==0)
THEN 1311 dist_field(i,1:nb_field1,1:np) = transpose(v1_in(:,:,i))
1314 IF (np/=np_tot) dist_field(:,:,np+1:np_tot) = 0.d0
1316 longueur_tranche=bloc_size*m_max_c*nb_field1
1318 mpid=mpi_double_precision
1319 CALL mpi_alltoall (dist_field,longueur_tranche, mpid, combined_field, longueur_tranche, &
1320 mpid, communicator, code)
1327 shiftc = (nb-1)*bloc_size
1328 shiftl = (nb-1)*m_max_c
1330 DO nf = 1, nb_field1/2
1336 cu(shiftl+1:shiftl+m_max_c,nf,n) = 0.5d0*cmplx(combined_field(:,2*nf-1,jindex),&
1337 -combined_field(:,2*nf,jindex),kind=8)
1341 cu(1,:,:) = 2*cmplx(
REAL(cu(1,:,:),KIND=8),0.d0,KIND=8)
1348 fft_dim=1; istride=1; ostride=1;
1352 idist=n_r_pad; inembed(1)=n_r_pad; dim(1)=n_r_pad
1353 odist=m_max_pad; onembed(1)=m_max_pad
1356 howmany=bloc_size*nb_field1/2
1358 CALL dfftw_plan_many_dft_c2r(fftw_plan_multi_c2r, fft_dim, dim, howmany, cu, &
1359 onembed, ostride, odist, ru, inembed, istride, idist, fftw_estimate)
1361 CALL dfftw_execute(fftw_plan_multi_c2r)
1364 CALL dfftw_destroy_plan(fftw_plan_multi_c2r)
1366 IF (nb_field1==6)
THEN 1367 norm_vel_loc(:,:) = sqrt(ru(:,1,:)**2 + ru(:,2,:)**2 + ru(:,3,:)**2)
1369 norm_vel_loc(:,:) = sqrt(ru(:,1,:)**2)
1371 max_velocity = maxval(norm_vel_loc)
1372 CALL mpi_allreduce(max_velocity, v_out, 1, mpi_double_precision, &
1373 mpi_max, communicator, code)
1377 SUBROUTINE fft_tensor_dcl(communicator,V1_in, V2_in, V_out, nb_procs, bloc_size, m_max_pad, temps, opt_tension)
1385 REAL(KIND=8),
DIMENSION(:,:,:),
INTENT(IN) :: V1_in, V2_in
1386 REAL(KIND=8),
DIMENSION(:,:,:,:),
INTENT(OUT) :: V_out
1387 REAL(KIND=8),
DIMENSION(:),
OPTIONAL,
INTENT(INOUT) :: temps
1388 LOGICAL,
OPTIONAL,
INTENT(IN) :: opt_tension
1389 INTEGER,
INTENT(IN) :: bloc_size, m_max_pad, nb_procs
1390 INTEGER :: np, np_tot, nb_field, m_max, m_max_c, MPID, N_r_pad
1391 INTEGER(KIND=8) :: fftw_plan_multi_c2r, fftw_plan_multi_r2c
1392 COMPLEX(KIND=8),
DIMENSION(m_max_pad, SIZE(V1_in,2), bloc_size) :: cu
1393 REAL(KIND=8),
DIMENSION(2*m_max_pad-1,SIZE(V1_in,2),bloc_size) :: ru
1394 COMPLEX(KIND=8),
DIMENSION(m_max_pad,SIZE(V1_in,2)/2,bloc_size) :: prod_cu1, prod_cu2, prod_cu3
1395 REAL(KIND=8),
DIMENSION(2*m_max_pad-1,SIZE(V1_in,2)/2,bloc_size) :: prod_ru1, prod_ru2, prod_ru3
1396 REAL(KIND=8),
DIMENSION(SIZE(V1_in,3),2*SIZE(V1_in,2),bloc_size*nb_procs) :: dist_field
1397 REAL(KIND=8),
DIMENSION(SIZE(V1_in,3),2*SIZE(V1_in,2),bloc_size*nb_procs) :: combined_field
1398 COMPLEX(KIND=8),
DIMENSION(SIZE(V1_in,2)/2,bloc_size,SIZE(V1_in,3)*nb_procs) :: combined_prod_cu1
1399 COMPLEX(KIND=8),
DIMENSION(SIZE(V1_in,2)/2,bloc_size,SIZE(V1_in,3)*nb_procs) :: combined_prod_cu2
1400 COMPLEX(KIND=8),
DIMENSION(SIZE(V1_in,2)/2,bloc_size,SIZE(V1_in,3)*nb_procs) :: combined_prod_cu3
1401 COMPLEX(KIND=8),
DIMENSION(3,SIZE(V1_in,2)/2,bloc_size,SIZE(V1_in,3)*nb_procs) :: combined_prod_cu_tot
1402 COMPLEX(KIND=8),
DIMENSION(3,SIZE(V1_in,2)/2,bloc_size,SIZE(V1_in,3)*nb_procs) :: dist_prod_cu_tot
1403 COMPLEX(KIND=8),
DIMENSION(3,SIZE(V1_in,2)/2,bloc_size) :: intermediate_tot
1404 REAL(KIND=8),
DIMENSION(2*m_max_pad-1,bloc_size) :: norm_grad_tension
1406 INTEGER :: nb, nf, shiftc, shiftl, jindex, longueur_tranche, i, n, code
1409 INTEGER :: fft_dim, howmany, istride, ostride, idist, odist
1410 INTEGER,
DIMENSION(1) :: dim, inembed, onembed
1414 mpi_comm :: communicator
1416 IF (
PRESENT(temps)) temps = 0.d0
1419 nb_field=
SIZE(v1_in,2)
1420 m_max_c =
SIZE(v1_in,3)
1421 m_max = m_max_c*nb_procs
1422 n_r_pad=2*m_max_pad-1
1423 np_tot = nb_procs*bloc_size
1425 IF (mod(nb_field,2)/=0 .OR. m_max_c==0)
THEN 1443 dist_field(i,1:nb_field,1:np) = transpose(v1_in(:,:,i))
1444 dist_field(i,nb_field+1:2*nb_field,1:np) = transpose(v2_in(:,:,i))
1446 IF (
PRESENT(temps)) temps(3) = temps(3) + mpi_wtime() -t
1448 IF (np/=np_tot) dist_field(:,:,np+1:np_tot) = 1.d100
1450 longueur_tranche=bloc_size*m_max_c*nb_field*2
1453 mpid=mpi_double_precision
1454 CALL mpi_alltoall (dist_field,longueur_tranche, mpid, combined_field, longueur_tranche, &
1455 mpid, communicator, code)
1456 IF (
PRESENT(temps)) temps(1) = temps(1) + mpi_wtime() -t
1464 shiftc = (nb-1)*bloc_size
1465 shiftl = (nb-1)*m_max_c
1473 cu(shiftl+1:shiftl+m_max_c,nf,n) = 0.5d0*cmplx(combined_field(:,2*nf-1,jindex),&
1474 -combined_field(:,2*nf,jindex),kind=8)
1478 cu(1,:,:) = 2*cmplx(
REAL(cu(1,:,:),KIND=8),0.d0,KIND=8)
1484 IF (
PRESENT(temps)) temps(3) = temps(3) + mpi_wtime() -t
1487 fft_dim=1; istride=1; ostride=1;
1491 idist=n_r_pad; inembed(1)=n_r_pad; dim(1)=n_r_pad
1492 odist=m_max_pad; onembed(1)=m_max_pad
1495 howmany=bloc_size*nb_field
1499 CALL dfftw_plan_many_dft_c2r(fftw_plan_multi_c2r, fft_dim, dim, howmany, cu, &
1500 onembed, ostride, odist, ru, inembed, istride, idist, fftw_estimate)
1502 CALL dfftw_execute(fftw_plan_multi_c2r)
1505 CALL dfftw_destroy_plan(fftw_plan_multi_c2r)
1509 IF(.NOT.
PRESENT(opt_tension))
THEN 1510 IF (nb_field==6)
THEN 1511 prod_ru1(:,1,:) = ru(:,1,:)*ru(:,4,:)
1512 prod_ru1(:,2,:) = ru(:,1,:)*ru(:,5,:)
1513 prod_ru1(:,3,:) = ru(:,1,:)*ru(:,6,:)
1515 prod_ru2(:,1,:) = ru(:,2,:)*ru(:,4,:)
1516 prod_ru2(:,2,:) = ru(:,2,:)*ru(:,5,:)
1517 prod_ru2(:,3,:) = ru(:,2,:)*ru(:,6,:)
1519 prod_ru3(:,1,:) = ru(:,3,:)*ru(:,4,:)
1520 prod_ru3(:,2,:) = ru(:,3,:)*ru(:,5,:)
1521 prod_ru3(:,3,:) = ru(:,3,:)*ru(:,6,:)
1523 ELSE IF (opt_tension)
THEN 1524 IF (nb_field==6)
THEN 1525 norm_grad_tension = sqrt(ru(:,4,:)**2 + ru(:,5,:)**2 + ru(:,6,:)**2)
1526 prod_ru1(:,1,:) = ru(:,1,:)*ru(:,4,:)/(norm_grad_tension + 1.d-14) &
1528 prod_ru1(:,2,:) = ru(:,1,:)*ru(:,5,:)/(norm_grad_tension + 1.d-14)
1529 prod_ru1(:,3,:) = ru(:,1,:)*ru(:,6,:)/(norm_grad_tension + 1.d-14)
1531 prod_ru2(:,1,:) = ru(:,2,:)*ru(:,4,:)/(norm_grad_tension + 1.d-14)
1532 prod_ru2(:,2,:) = ru(:,2,:)*ru(:,5,:)/(norm_grad_tension + 1.d-14) &
1534 prod_ru2(:,3,:) = ru(:,2,:)*ru(:,6,:)/(norm_grad_tension + 1.d-14)
1536 prod_ru3(:,1,:) = ru(:,3,:)*ru(:,4,:)/(norm_grad_tension + 1.d-14)
1537 prod_ru3(:,2,:) = ru(:,3,:)*ru(:,5,:)/(norm_grad_tension + 1.d-14)
1538 prod_ru3(:,3,:) = ru(:,3,:)*ru(:,6,:)/(norm_grad_tension + 1.d-14) &
1542 CALL error_petsc(
'BUG in FFT_TENSOR_DCL : opt_tension should be true if used')
1547 fft_dim=1; istride=1; ostride=1;
1551 idist=n_r_pad; inembed(1)=n_r_pad; dim(1)=n_r_pad
1552 odist=m_max_pad; onembed(1)=m_max_pad
1555 howmany=bloc_size*nb_field/2
1557 CALL dfftw_plan_many_dft_r2c(fftw_plan_multi_r2c, fft_dim, dim, howmany, prod_ru1, &
1558 inembed, istride, idist, prod_cu1, onembed, ostride, odist, fftw_estimate)
1560 CALL dfftw_execute(fftw_plan_multi_r2c)
1562 CALL dfftw_destroy_plan(fftw_plan_multi_r2c)
1564 CALL dfftw_plan_many_dft_r2c(fftw_plan_multi_r2c, fft_dim, dim, howmany, prod_ru2, &
1565 inembed, istride, idist, prod_cu2, onembed, ostride, odist, fftw_estimate)
1567 CALL dfftw_execute(fftw_plan_multi_r2c)
1569 CALL dfftw_destroy_plan(fftw_plan_multi_r2c)
1571 CALL dfftw_plan_many_dft_r2c(fftw_plan_multi_r2c, fft_dim, dim, howmany, prod_ru3, &
1572 inembed, istride, idist, prod_cu3, onembed, ostride, odist, fftw_estimate)
1574 CALL dfftw_execute(fftw_plan_multi_r2c)
1576 CALL dfftw_destroy_plan(fftw_plan_multi_r2c)
1582 prod_cu1 = prod_cu1*(1.d0/n_r_pad)
1583 prod_cu2 = prod_cu2*(1.d0/n_r_pad)
1584 prod_cu3 = prod_cu3*(1.d0/n_r_pad)
1587 IF (
PRESENT(temps)) temps(2) = temps(2) + mpi_wtime() -t
1591 combined_prod_cu1(:,:,1)=prod_cu1(1,:,:)
1592 combined_prod_cu2(:,:,1)=prod_cu2(1,:,:)
1593 combined_prod_cu3(:,:,1)=prod_cu3(1,:,:)
1596 combined_prod_cu1(:,:,n)=2*conjg(prod_cu1(n,:,:))
1597 combined_prod_cu2(:,:,n)=2*conjg(prod_cu2(n,:,:))
1598 combined_prod_cu3(:,:,n)=2*conjg(prod_cu3(n,:,:))
1601 combined_prod_cu_tot(1,:,:,:) = combined_prod_cu1(:,:,:)
1602 combined_prod_cu_tot(2,:,:,:) = combined_prod_cu2(:,:,:)
1603 combined_prod_cu_tot(3,:,:,:) = combined_prod_cu3(:,:,:)
1605 IF (
PRESENT(temps)) temps(3) = temps(3) + mpi_wtime() -t
1608 longueur_tranche=bloc_size*m_max_c*nb_field*3
1609 mpid=mpi_double_precision
1610 CALL mpi_alltoall (combined_prod_cu_tot,longueur_tranche,mpid, dist_prod_cu_tot,longueur_tranche, &
1611 mpid,communicator,code)
1612 IF (
PRESENT(temps)) temps(1) = temps(1) + mpi_wtime() -t
1617 shiftc = (nb-1)*bloc_size
1618 shiftl = (nb-1)*m_max_c
1619 intermediate_tot = dist_prod_cu_tot(:,:,:,shiftl+i)
1621 IF (n+shiftc > np ) cycle
1622 DO i_field = 1, nb_field/2
1623 v_out(:, n+shiftc, i_field*2-1, i) =
REAL (intermediate_tot(:,i_field,n),KIND=8)
1624 v_out(:, n+shiftc, i_field*2 , i) = aimag(intermediate_tot(:,i_field,n))
1629 IF (
PRESENT(temps)) temps(3) = temps(3) + mpi_wtime() -t
1633 c_in, c_out, nb_procs, bloc_size, m_max_pad, time, temps)
1642 FUNCTION eta(H_mesh,angles,nb_angles,nb,ne,time) RESULT(vv)
1648 REAL(KIND=8),
DIMENSION(:),
INTENT(IN) :: angles
1649 INTEGER,
INTENT(IN) :: nb_angles
1650 INTEGER,
INTENT(IN) :: nb, ne
1651 REAL(KIND=8),
INTENT(IN) :: time
1652 REAL(KIND=8),
DIMENSION(nb_angles,ne-nb+1) :: vv
1655 INTEGER,
INTENT(IN) :: nb_procs, bloc_size, m_max_pad
1656 REAL(KIND=8),
DIMENSION(2*m_max_pad-1) :: angles
1657 REAL(KIND=8),
DIMENSION(2*m_max_pad-1,bloc_size) :: eta_n
1660 REAL(KIND=8),
DIMENSION(:,:,:),
INTENT(IN) :: c_in
1661 REAL(KIND=8),
DIMENSION(:,:,:),
INTENT(OUT) :: c_out
1662 REAL(KIND=8),
DIMENSION(:),
OPTIONAL,
INTENT(INOUT) :: temps
1663 REAL(KIND=8) :: time
1664 COMPLEX(KIND=8),
DIMENSION(m_max_pad, SIZE(c_in,2)/2, bloc_size) :: cu
1665 REAL(KIND=8),
DIMENSION(2*m_max_pad-1, SIZE(c_in,2)/2, bloc_size) :: ru
1666 COMPLEX(KIND=8),
DIMENSION(m_max_pad, SIZE(c_in,2)/2, bloc_size) :: prod_cu
1667 REAL(KIND=8),
DIMENSION(2*m_max_pad-1, SIZE(c_in,2)/2,bloc_size) :: prod_ru
1668 REAL(KIND=8),
DIMENSION(SIZE(c_in,3),SIZE(c_in,2), bloc_size*nb_procs) :: dist_field, combined_field
1669 COMPLEX(KIND=8),
DIMENSION(SIZE(c_in,2)/2,bloc_size,SIZE(c_in,3)*nb_procs):: dist_prod_cu
1670 COMPLEX(KIND=8),
DIMENSION(SIZE(c_in,2)/2,bloc_size,SIZE(c_in,3)*nb_procs):: combined_prod_cu
1671 COMPLEX(KIND=8),
DIMENSION(SIZE(c_in,2)/2,bloc_size) :: intermediate
1672 INTEGER :: np, np_tot, m_max, m_max_c, MPID, N_r_pad, nb_field, i_field
1673 INTEGER(KIND=8) :: fftw_plan_multi_c2r, fftw_plan_multi_r2c
1674 INTEGER :: nb, ne, nf, shiftc, shiftl, jindex, longueur_tranche, i, n, code
1677 INTEGER :: fft_dim, howmany, istride, ostride, idist, odist
1678 INTEGER,
DIMENSION(1) :: dim, inembed, onembed
1682 petscerrorcode :: ierr
1683 mpi_comm :: communicator
1685 IF (
PRESENT(temps)) temps = 0.d0
1688 nb_field =
SIZE(c_in,2)
1689 m_max_c =
SIZE(c_in,3)
1690 m_max = m_max_c*nb_procs
1691 np_tot = nb_procs*bloc_size
1692 n_r_pad = 2*m_max_pad-1
1694 IF (m_max_c==0)
THEN 1701 angles(n) = 2*pi*(n-1)/n_r_pad
1711 dist_field(i,:,1:np) = transpose(c_in(:,:,i))
1713 IF (
PRESENT(temps)) temps(3) = temps(3) + mpi_wtime() -t
1715 IF (np/=np_tot) dist_field(:,:,np+1:np_tot) = 1.d100
1717 longueur_tranche=bloc_size*m_max_c*nb_field
1720 mpid=mpi_double_precision
1721 CALL mpi_alltoall (dist_field,longueur_tranche, mpid, combined_field, longueur_tranche, &
1722 mpid, communicator, code)
1723 IF (
PRESENT(temps)) temps(1) = temps(1) + mpi_wtime() -t
1731 shiftc = (nb-1)*bloc_size
1732 shiftl = (nb-1)*m_max_c
1734 DO nf = 1, nb_field/2
1738 cu(shiftl+1:shiftl+m_max_c,nf,n) = 0.5d0*cmplx(combined_field(:,2*nf-1,jindex),&
1739 -combined_field(:,2*nf,jindex),kind=8)
1743 cu(1,:,:) = 2*cmplx(
REAL(cu(1,:,:),KIND=8),0.d0,KIND=8)
1749 IF (
PRESENT(temps)) temps(3) = temps(3) + mpi_wtime() -t
1752 fft_dim=1; istride=1; ostride=1;
1756 idist=n_r_pad; inembed(1)=n_r_pad; dim(1)=n_r_pad
1757 odist=m_max_pad; onembed(1)=m_max_pad
1760 howmany=bloc_size*nb_field/2
1763 CALL dfftw_plan_many_dft_c2r(fftw_plan_multi_c2r, fft_dim, dim, howmany, cu, &
1764 onembed, ostride, odist, ru, inembed, istride, idist, fftw_estimate)
1765 CALL dfftw_execute(fftw_plan_multi_c2r)
1768 CALL dfftw_destroy_plan(fftw_plan_multi_c2r)
1772 CALL mpi_comm_rank(communicator, rank_f, ierr)
1773 IF (rank_f==nb_procs-1)
THEN 1774 IF (np-rank_f*bloc_size.GE.1)
THEN 1775 nb = rank_f*bloc_size+1
1777 eta_n(:,1:np-rank_f*bloc_size) = eta(h_mesh,angles,n_r_pad,nb,ne,time)
1778 eta_n(:,np-rank_f*bloc_size+1:bloc_size) = 1.d0
1783 nb = rank_f*bloc_size+1
1784 ne = rank_f*bloc_size+bloc_size
1785 eta_n(:,:) = eta(h_mesh,angles,n_r_pad,nb,ne,time)
1788 IF (nb_field==2)
THEN 1789 prod_ru(:,1,:) = eta_n*ru(:,1,:)
1790 ELSE IF (nb_field==6)
THEN 1791 prod_ru(:,1,:) = eta_n*ru(:,1,:)
1792 prod_ru(:,2,:) = eta_n*ru(:,2,:)
1793 prod_ru(:,3,:) = eta_n*ru(:,3,:)
1795 CALL error_petsc(
'error in nb_field of c_in while calling FFT_PAR_VAR_ETA_PROD_T_DCL')
1799 howmany = bloc_size*nb_field/2
1801 CALL dfftw_plan_many_dft_r2c(fftw_plan_multi_r2c, fft_dim, dim, howmany, prod_ru, &
1802 inembed, istride, idist, prod_cu, onembed, ostride, odist, fftw_estimate)
1803 CALL dfftw_execute(fftw_plan_multi_r2c)
1806 CALL dfftw_destroy_plan(fftw_plan_multi_r2c)
1810 prod_cu = prod_cu*(1.d0/n_r_pad)
1812 IF (
PRESENT(temps)) temps(2) = temps(2) + mpi_wtime() -t
1816 combined_prod_cu(:,:,1)=prod_cu(1,:,:)
1818 combined_prod_cu(:,:,n)=2*conjg(prod_cu(n,:,:))
1821 IF (
PRESENT(temps)) temps(3) = temps(3) + mpi_wtime() -t
1824 longueur_tranche=bloc_size*m_max_c*nb_field
1825 mpid=mpi_double_precision
1826 CALL mpi_alltoall (combined_prod_cu,longueur_tranche,mpid, dist_prod_cu,longueur_tranche, &
1827 mpid,communicator,code)
1828 IF (
PRESENT(temps)) temps(1) = temps(1) + mpi_wtime() -t
1833 shiftc = (nb-1)*bloc_size
1834 shiftl = (nb-1)*m_max_c
1835 intermediate = dist_prod_cu(:,:,shiftl+i)
1837 IF (n+shiftc > np ) cycle
1838 DO i_field = 1, nb_field/2
1839 c_out(n+shiftc, 2*i_field-1, i) =
REAL (intermediate(i_field,n),KIND=8)
1840 c_out(n+shiftc, 2*i_field, i) = aimag(intermediate(i_field,n))
1845 IF (
PRESENT(temps)) temps(3) = temps(3) + mpi_wtime() -t
1850 c_in, c_out, nb_procs, bloc_size, m_max_pad, rr_gauss, time, temps)
1859 FUNCTION eta(H_mesh,rr_gauss,angles,nb_angles,nb,ne,time) RESULT(vv)
1865 REAL(KIND=8),
DIMENSION(:,:),
INTENT(IN) :: rr_gauss
1866 REAL(KIND=8),
DIMENSION(:),
INTENT(IN) :: angles
1867 INTEGER,
INTENT(IN) :: nb_angles
1868 INTEGER,
INTENT(IN) :: nb, ne
1869 REAL(KIND=8),
INTENT(IN) :: time
1870 REAL(KIND=8),
DIMENSION(nb_angles,ne-nb+1) :: vv
1873 INTEGER,
INTENT(IN) :: nb_procs, bloc_size, m_max_pad
1874 REAL(KIND=8),
DIMENSION(2*m_max_pad-1) :: angles
1875 REAL(KIND=8),
DIMENSION(2*m_max_pad-1,bloc_size) :: eta_n
1878 REAL(KIND=8) :: time
1879 REAL(KIND=8),
DIMENSION(:,:,:),
INTENT(IN) :: c_in
1880 REAL(KIND=8),
DIMENSION(:,:,:),
INTENT(OUT) :: c_out
1881 REAL(KIND=8),
DIMENSION(:,:),
INTENT(IN) :: rr_gauss
1882 REAL(KIND=8),
DIMENSION(:),
OPTIONAL,
INTENT(INOUT) :: temps
1883 COMPLEX(KIND=8),
DIMENSION(m_max_pad, SIZE(c_in,2)/2, bloc_size) :: cu
1884 REAL(KIND=8),
DIMENSION(2*m_max_pad-1, SIZE(c_in,2)/2, bloc_size) :: ru
1885 COMPLEX(KIND=8),
DIMENSION(m_max_pad, SIZE(c_in,2)/2, bloc_size) :: prod_cu
1886 REAL(KIND=8),
DIMENSION(2*m_max_pad-1, SIZE(c_in,2)/2,bloc_size) :: prod_ru
1887 REAL(KIND=8),
DIMENSION(SIZE(c_in,3),SIZE(c_in,2), bloc_size*nb_procs) :: dist_field, combined_field
1888 COMPLEX(KIND=8),
DIMENSION(SIZE(c_in,2)/2,bloc_size,SIZE(c_in,3)*nb_procs):: dist_prod_cu
1889 COMPLEX(KIND=8),
DIMENSION(SIZE(c_in,2)/2,bloc_size,SIZE(c_in,3)*nb_procs):: combined_prod_cu
1890 COMPLEX(KIND=8),
DIMENSION(SIZE(c_in,2)/2,bloc_size) :: intermediate
1891 INTEGER :: np, np_tot, m_max, m_max_c, MPID, N_r_pad, nb_field, i_field
1892 INTEGER(KIND=8) :: fftw_plan_multi_c2r, fftw_plan_multi_r2c
1893 INTEGER :: nb, ne, nf, shiftc, shiftl, jindex, longueur_tranche, i, n, code
1896 INTEGER :: fft_dim, howmany, istride, ostride, idist, odist
1897 INTEGER,
DIMENSION(1) :: dim, inembed, onembed
1901 petscerrorcode :: ierr
1902 mpi_comm :: communicator
1904 IF (
PRESENT(temps)) temps = 0.d0
1907 nb_field =
SIZE(c_in,2)
1908 m_max_c =
SIZE(c_in,3)
1909 m_max = m_max_c*nb_procs
1910 np_tot = nb_procs*bloc_size
1911 n_r_pad = 2*m_max_pad-1
1913 IF (m_max_c==0)
THEN 1920 angles(n) = 2*pi*(n-1)/n_r_pad
1930 dist_field(i,:,1:np) = transpose(c_in(:,:,i))
1932 IF (
PRESENT(temps)) temps(3) = temps(3) + mpi_wtime() -t
1934 IF (np/=np_tot) dist_field(:,:,np+1:np_tot) = 1.d100
1936 longueur_tranche=bloc_size*m_max_c*nb_field
1939 mpid=mpi_double_precision
1940 CALL mpi_alltoall (dist_field,longueur_tranche, mpid, combined_field, longueur_tranche, &
1941 mpid, communicator, code)
1942 IF (
PRESENT(temps)) temps(1) = temps(1) + mpi_wtime() -t
1950 shiftc = (nb-1)*bloc_size
1951 shiftl = (nb-1)*m_max_c
1953 DO nf = 1, nb_field/2
1957 cu(shiftl+1:shiftl+m_max_c,nf,n) = 0.5d0*cmplx(combined_field(:,2*nf-1,jindex),&
1958 -combined_field(:,2*nf,jindex),kind=8)
1962 cu(1,:,:) = 2*cmplx(
REAL(cu(1,:,:),KIND=8),0.d0,KIND=8)
1968 IF (
PRESENT(temps)) temps(3) = temps(3) + mpi_wtime() -t
1971 fft_dim=1; istride=1; ostride=1;
1975 idist=n_r_pad; inembed(1)=n_r_pad; dim(1)=n_r_pad
1976 odist=m_max_pad; onembed(1)=m_max_pad
1979 howmany=bloc_size*nb_field/2
1982 CALL dfftw_plan_many_dft_c2r(fftw_plan_multi_c2r, fft_dim, dim, howmany, cu, &
1983 onembed, ostride, odist, ru, inembed, istride, idist, fftw_estimate)
1984 CALL dfftw_execute(fftw_plan_multi_c2r)
1987 CALL dfftw_destroy_plan(fftw_plan_multi_c2r)
1991 CALL mpi_comm_rank(communicator, rank_f, ierr)
1992 IF (rank_f==nb_procs-1)
THEN 1993 IF (np-rank_f*bloc_size.GE.1)
THEN 1994 nb = rank_f*bloc_size+1
1996 eta_n(:,1:np-rank_f*bloc_size) = eta(h_mesh,rr_gauss(:,nb:ne),angles,n_r_pad,nb,ne,time)
1997 eta_n(:,np-rank_f*bloc_size+1:bloc_size) = 1.d0
2002 nb = rank_f*bloc_size+1
2003 ne = rank_f*bloc_size+bloc_size
2004 eta_n(:,:) = eta(h_mesh,rr_gauss(:,nb:ne),angles,n_r_pad,nb,ne,time)
2007 IF (nb_field==2)
THEN 2008 prod_ru(:,1,:) = eta_n*ru(:,1,:)
2009 ELSE IF (nb_field==6)
THEN 2010 prod_ru(:,1,:) = eta_n*ru(:,1,:)
2011 prod_ru(:,2,:) = eta_n*ru(:,2,:)
2012 prod_ru(:,3,:) = eta_n*ru(:,3,:)
2014 CALL error_petsc(
'error in nb_field of c_in while calling FFT_PAR_VAR_ETA_PROD_GAUSS_DCL')
2018 howmany = bloc_size*nb_field/2
2020 CALL dfftw_plan_many_dft_r2c(fftw_plan_multi_r2c, fft_dim, dim, howmany, prod_ru, &
2021 inembed, istride, idist, prod_cu, onembed, ostride, odist, fftw_estimate)
2022 CALL dfftw_execute(fftw_plan_multi_r2c)
2025 CALL dfftw_destroy_plan(fftw_plan_multi_r2c)
2029 prod_cu = prod_cu*(1.d0/n_r_pad)
2031 IF (
PRESENT(temps)) temps(2) = temps(2) + mpi_wtime() -t
2035 combined_prod_cu(:,:,1)=prod_cu(1,:,:)
2037 combined_prod_cu(:,:,n)=2*conjg(prod_cu(n,:,:))
2040 IF (
PRESENT(temps)) temps(3) = temps(3) + mpi_wtime() -t
2043 longueur_tranche=bloc_size*m_max_c*nb_field
2044 mpid=mpi_double_precision
2045 CALL mpi_alltoall (combined_prod_cu,longueur_tranche,mpid, dist_prod_cu,longueur_tranche, &
2046 mpid,communicator,code)
2047 IF (
PRESENT(temps)) temps(1) = temps(1) + mpi_wtime() -t
2052 shiftc = (nb-1)*bloc_size
2053 shiftl = (nb-1)*m_max_c
2054 intermediate = dist_prod_cu(:,:,shiftl+i)
2056 IF (n+shiftc > np ) cycle
2057 DO i_field = 1, nb_field/2
2058 c_out(n+shiftc, 2*i_field-1, i) =
REAL (intermediate(i_field,n),KIND=8)
2059 c_out(n+shiftc, 2*i_field, i) = aimag(intermediate(i_field,n))
2064 IF (
PRESENT(temps)) temps(3) = temps(3) + mpi_wtime() -t
2068 FUNCTION regul(phi,eps) RESULT(r)
2070 REAL(KIND=8),
INTENT(IN) :: phi, eps
2071 REAL(KIND=8) :: x, r
2073 IF (x .LE. -eps)
THEN 2075 ELSE IF (x .LE. eps)
THEN 2076 r = (1+ x*(x**2 - 3*eps**2)/(-2*eps**3))/2
2084 REAL(KIND=8),
DIMENSION(:),
INTENT(IN) :: phi
2085 REAL(KIND=8),
INTENT(IN) :: eps
2087 REAL(KIND=8),
DIMENSION(SIZE(phi)) :: r
2091 IF (x .LE. -eps)
THEN 2093 ELSE IF (x .LE. eps)
THEN 2094 r(n) = (1.d0 + x*(x**2 - 3*eps**2)/(-2*eps**3))/2
2102 nb_procs, bloc_size, m_max_pad, temps)
2110 REAL(KIND=8),
DIMENSION(:,:,:,:),
INTENT(IN) :: V1_in
2111 INTEGER,
INTENT(IN) :: nb_fluids
2112 INTEGER,
INTENT(OUT) :: interface_ok
2113 REAL(KIND=8),
DIMENSION(:),
OPTIONAL,
INTENT(INOUT) :: temps
2114 INTEGER,
INTENT(IN) :: bloc_size, m_max_pad, nb_procs
2115 INTEGER :: np, np_tot, nb_field, m_max, m_max_c, MPID, N_r_pad
2116 INTEGER(KIND=8) :: fftw_plan_multi_c2r
2117 COMPLEX(KIND=8),
DIMENSION(m_max_pad, bloc_size) :: cu
2118 REAL(KIND=8),
DIMENSION(2*m_max_pad-1, bloc_size) :: ru
2119 REAL(KIND=8),
DIMENSION(SIZE(V1_in,4),SIZE(V1_in,3),bloc_size*nb_procs) :: dist_field, combined_field
2120 REAL(KIND=8),
DIMENSION(nb_fluids-1,2*m_max_pad-1, bloc_size) :: V1_real_loc
2122 INTEGER :: nb, shiftc, shiftl, jindex, longueur_tranche, i, n, code, interface_nb
2125 INTEGER :: fft_dim, howmany, istride, ostride, idist, odist
2126 INTEGER,
DIMENSION(1) :: dim, inembed, onembed
2130 mpi_comm :: communicator
2132 IF (
PRESENT(temps)) temps = 0.d0
2135 nb_field=
SIZE(v1_in,3)
2136 m_max_c =
SIZE(v1_in,4)
2137 m_max = m_max_c*nb_procs
2138 n_r_pad=2*m_max_pad-1
2139 np_tot = nb_procs*bloc_size
2141 IF (mod(nb_field,2)/=0 .OR. m_max_c==0)
THEN 2158 DO interface_nb = 1, nb_fluids-1
2161 dist_field(i,1:nb_field,1:np) = transpose(v1_in(interface_nb,:,:,i))
2163 IF (
PRESENT(temps)) temps(3) = temps(3) + mpi_wtime() -t
2167 IF (np/=np_tot) dist_field(:,:,np+1:np_tot) = 0.d0
2169 longueur_tranche=bloc_size*m_max_c*nb_field
2172 mpid=mpi_double_precision
2173 CALL mpi_alltoall (dist_field,longueur_tranche, mpid, combined_field, longueur_tranche, &
2174 mpid, communicator, code)
2176 IF (
PRESENT(temps)) temps(1) = temps(1) + mpi_wtime() -t
2184 shiftc = (nb-1)*bloc_size
2185 shiftl = (nb-1)*m_max_c
2192 cu(shiftl+1:shiftl+m_max_c,n) = 0.5d0*cmplx(combined_field(:,1,jindex),&
2193 -combined_field(:,2,jindex),kind=8)
2196 cu(1,:) = 2*cmplx(
REAL(cu(1,:),KIND=8),0.d0,KIND=8)
2199 IF (
PRESENT(temps)) temps(3) = temps(3) + mpi_wtime() -t
2202 fft_dim=1; istride=1; ostride=1;
2206 idist=n_r_pad; inembed(1)=n_r_pad; dim(1)=n_r_pad
2207 odist=m_max_pad; onembed(1)=m_max_pad
2210 howmany=bloc_size*nb_field/2
2213 CALL dfftw_plan_many_dft_c2r(fftw_plan_multi_c2r, fft_dim, dim, howmany, cu, &
2214 onembed, ostride, odist, ru, inembed, istride, idist, fftw_estimate)
2216 CALL dfftw_execute(fftw_plan_multi_c2r)
2219 CALL dfftw_destroy_plan(fftw_plan_multi_c2r)
2220 v1_real_loc(interface_nb,:,:)=ru
2227 IF (nb_field==2)
THEN 2228 IF (nb_fluids==2)
THEN 2231 DO interface_nb = 1, nb_fluids-2
2232 DO n1 = 1, 2*m_max_pad-1
2233 DO n2 = 1, bloc_size
2234 IF((0.1d0.LE.v1_real_loc(interface_nb,n1,n2)).AND. &
2235 (v1_real_loc(interface_nb,n1,n2).LE.0.9d0))
THEN 2236 IF(v1_real_loc(interface_nb,n1,n2).LT.v1_real_loc(interface_nb+1,n1,n2))
THEN 2246 CALL error_petsc(
'BUG in FFT_CHECK_INTERFACE: pb with V1_in dimensions')
2253 hloc_gauss, v1_out, v2_out, v3_out, &
2254 nb_procs, bloc_size, m_max_pad, residual_normalization,
l_g, temps)
2264 REAL(KIND=8),
DIMENSION(:,:,:),
INTENT(IN) :: V1_in, V2_in, V3_in, V4_in, V5_in
2265 REAL(KIND=8),
DIMENSION(:),
INTENT(IN) :: hloc_gauss
2266 REAL(KIND=8),
DIMENSION(:,:,:),
INTENT(OUT) :: V1_out, V2_out, V3_out
2267 REAL(KIND=8),
INTENT(IN) :: residual_normalization
2268 INTEGER,
INTENT(IN) :: nb_procs, bloc_size, m_max_pad, l_G
2269 REAL(KIND=8),
DIMENSION(:),
OPTIONAL,
INTENT(INOUT) :: temps
2270 COMPLEX(KIND=8),
DIMENSION(m_max_pad, SIZE(V1_in,2)*5/2, bloc_size) :: cu
2271 REAL(KIND=8),
DIMENSION(2*m_max_pad-1,SIZE(V1_in,2)*5/2,bloc_size) :: ru
2272 REAL(KIND=8),
DIMENSION(2*m_max_pad-1,bloc_size) :: visco_entro
2273 REAL(KIND=8),
DIMENSION(2*m_max_pad-1,SIZE(V1_in,2)/2,bloc_size) :: prod_ru_1, prod_ru_2, prod_ru_3
2274 COMPLEX(KIND=8),
DIMENSION(m_max_pad,SIZE(V1_in,2)/2,bloc_size) :: prod_cu_1, prod_cu_2, prod_cu_3
2275 COMPLEX(KIND=8),
DIMENSION(SIZE(V1_in,2)/2,bloc_size) :: intermediate_1
2276 COMPLEX(KIND=8),
DIMENSION(SIZE(V1_in,2)/2,bloc_size) :: intermediate_2
2277 COMPLEX(KIND=8),
DIMENSION(SIZE(V1_in,2)/2,bloc_size) :: intermediate_3
2278 REAL(KIND=8),
DIMENSION(2*m_max_pad-1,bloc_size) :: norm_vel
2279 REAL(KIND=8),
DIMENSION(2*m_max_pad-1, bloc_size/l_G) :: norm_vel_int
2280 REAL(KIND=8),
DIMENSION(SIZE(V1_in,3),5*SIZE(V1_in,2),bloc_size*nb_procs) :: dist_field
2281 REAL(KIND=8),
DIMENSION(SIZE(V1_in,3),5*SIZE(V1_in,2),bloc_size*nb_procs) :: combined_field
2282 COMPLEX(KIND=8),
DIMENSION(SIZE(V1_in,2)/2,bloc_size,SIZE(V1_in,3)*nb_procs) :: combined_prod_cu_1
2283 COMPLEX(KIND=8),
DIMENSION(SIZE(V1_in,2)/2,bloc_size,SIZE(V1_in,3)*nb_procs) :: combined_prod_cu_2
2284 COMPLEX(KIND=8),
DIMENSION(SIZE(V1_in,2)/2,bloc_size,SIZE(V1_in,3)*nb_procs) :: combined_prod_cu_3
2285 COMPLEX(KIND=8),
DIMENSION(SIZE(V1_in,2)/2,bloc_size,SIZE(V1_in,3)*nb_procs) :: dist_prod_cu_1
2286 COMPLEX(KIND=8),
DIMENSION(SIZE(V1_in,2)/2,bloc_size,SIZE(V1_in,3)*nb_procs) :: dist_prod_cu_2
2287 COMPLEX(KIND=8),
DIMENSION(SIZE(V1_in,2)/2,bloc_size,SIZE(V1_in,3)*nb_procs) :: dist_prod_cu_3
2288 REAL(KIND=8),
DIMENSION(bloc_size*nb_procs) :: hloc_gauss_tot
2289 INTEGER :: np, np_tot, nb_field, m_max, m_max_c, MPID, N_r_pad
2290 INTEGER(KIND=8) :: fftw_plan_multi_c2r, fftw_plan_multi_r2c
2291 INTEGER :: nb, nf, shiftc, shiftl, jindex, longueur_tranche, i, n, code, rank, l, i_field
2292 REAL(KIND=8) :: t, hh, x
2293 REAL(KIND=8) :: max_norm_vel_loc, max_norm_vel_loc_F, max_norm_vel_tot
2295 INTEGER :: fft_dim, howmany, istride, ostride, idist, odist
2296 INTEGER,
DIMENSION(1) :: dim, inembed, onembed
2300 mpi_comm :: communicator
2301 mpi_comm :: communicator_s
2302 CALL mpi_comm_rank(communicator, rank, code)
2304 IF (
PRESENT(temps)) temps = 0.d0
2307 nb_field=
SIZE(v1_in,2)
2308 m_max_c =
SIZE(v1_in,3)
2309 m_max = m_max_c*nb_procs
2310 np_tot = nb_procs*bloc_size
2311 n_r_pad=2*m_max_pad-1
2313 IF (mod(nb_field,2)/=0 .OR. m_max_c==0)
THEN 2326 dist_field(i, 1:nb_field, 1:np) = transpose(v1_in(:,:,i))
2327 dist_field(i, nb_field+1:2*nb_field,1:np) = transpose(v2_in(:,:,i))
2328 dist_field(i,2*nb_field+1:3*nb_field,1:np) = transpose(v3_in(:,:,i))
2329 dist_field(i,3*nb_field+1:4*nb_field,1:np) = transpose(v4_in(:,:,i))
2330 dist_field(i,4*nb_field+1:5*nb_field,1:np) = transpose(v5_in(:,:,i))
2332 IF (
PRESENT(temps)) temps(3) = temps(3) + mpi_wtime() -t
2336 IF (np/=np_tot) dist_field(:,:,np+1:np_tot) = 0.d0
2339 hloc_gauss_tot(1:np) = hloc_gauss
2340 IF (np/=np_tot) hloc_gauss_tot(np+1:np_tot) = 1.d100
2342 longueur_tranche=bloc_size*m_max_c*nb_field*5
2345 mpid=mpi_double_precision
2346 CALL mpi_alltoall (dist_field,longueur_tranche, mpid, combined_field, longueur_tranche, &
2347 mpid, communicator, code)
2348 IF (
PRESENT(temps)) temps(1) = temps(1) + mpi_wtime() -t
2356 shiftc = (nb-1)*bloc_size
2357 shiftl = (nb-1)*m_max_c
2359 DO nf = 1, nb_field*5/2
2365 cu(shiftl+1:shiftl+m_max_c,nf,n) = 0.5d0*cmplx(combined_field(:,2*nf-1,jindex),&
2366 -combined_field(:,2*nf,jindex),kind=8)
2370 cu(1,:,:) = 2*cmplx(
REAL(cu(1,:,:),KIND=8),0.d0,KIND=8)
2376 IF (
PRESENT(temps)) temps(3) = temps(3) + mpi_wtime() -t
2379 fft_dim=1; istride=1; ostride=1;
2383 idist=n_r_pad; inembed(1)=n_r_pad; dim(1)=n_r_pad
2384 odist=m_max_pad; onembed(1)=m_max_pad
2387 howmany=bloc_size*nb_field*5/2
2390 CALL dfftw_plan_many_dft_c2r(fftw_plan_multi_c2r, fft_dim, dim, howmany, cu, &
2391 onembed, ostride, odist, ru, inembed, istride, idist, fftw_estimate)
2393 CALL dfftw_execute(fftw_plan_multi_c2r)
2396 CALL dfftw_destroy_plan(fftw_plan_multi_c2r)
2405 norm_vel(:,:) = sqrt(ru(:,1,:)**2 + ru(:,2,:)**2 + ru(:,3,:)**2)
2406 DO i = 1, 2*m_max_pad - 1
2407 DO l = 1, bloc_size/l_g
2408 x = maxval(norm_vel(i,(l-1)*l_g+1:l*l_g))
2409 norm_vel_int(i,l) = x
2412 IF (2*m_max_pad - 1 .GE. 3)
THEN 2413 DO l = 1, bloc_size/l_g
2414 DO i = 2, 2*m_max_pad - 2
2415 norm_vel(i,(l-1)*l_g+1:l*l_g) = maxval(norm_vel_int(i-1:i+1,l))
2417 norm_vel(1,(l-1)*l_g+1:l*l_g) = max(norm_vel_int(1,l),norm_vel_int(2,l),norm_vel_int(2*m_max_pad - 1,l))
2418 norm_vel(2*m_max_pad - 1,(l-1)*l_g+1:l*l_g) = &
2419 max(norm_vel_int(2*m_max_pad - 2,l),norm_vel_int(2*m_max_pad - 1,l),norm_vel_int(1,l))
2422 DO l = 1, bloc_size/l_g
2423 norm_vel(1,(l-1)*l_g+1:l*l_g) = norm_vel_int(1,l)
2429 max_norm_vel_loc=maxval(norm_vel)
2430 CALL mpi_allreduce(max_norm_vel_loc,max_norm_vel_loc_f,1,mpi_double_precision, mpi_max, communicator, code)
2431 CALL mpi_allreduce(max_norm_vel_loc_f,max_norm_vel_tot,1,mpi_double_precision, mpi_max, communicator_s, code)
2436 hh = hloc_gauss_tot(n+rank*bloc_size)
2437 visco_entro(:,n) = -
inputs%LES_coeff1 + min(
inputs%LES_coeff4*norm_vel(:,n), &
2438 inputs%LES_coeff2*hh*abs(ru(:,1,n)*ru(:,4,n) + ru(:,2,n)*ru(:,5,n) + ru(:,3,n)*ru(:,6,n))&
2439 /(residual_normalization+1.d-14))
2444 prod_ru_1(:,1,:) = visco_entro*ru(:,7,:)
2445 prod_ru_1(:,2,:) = visco_entro*ru(:,8,:)
2446 prod_ru_1(:,3,:) = visco_entro*ru(:,9,:)
2448 prod_ru_2(:,1,:) = visco_entro*ru(:,10,:)
2449 prod_ru_2(:,2,:) = visco_entro*ru(:,11,:)
2450 prod_ru_2(:,3,:) = visco_entro*ru(:,12,:)
2452 prod_ru_3(:,1,:) = visco_entro*ru(:,13,:)
2453 prod_ru_3(:,2,:) = visco_entro*ru(:,14,:)
2454 prod_ru_3(:,3,:) = visco_entro*ru(:,15,:)
2457 howmany = bloc_size*nb_field/2
2458 CALL dfftw_plan_many_dft_r2c(fftw_plan_multi_r2c, fft_dim, dim, howmany, prod_ru_1, &
2459 inembed, istride, idist, prod_cu_1, onembed, ostride, odist, fftw_estimate)
2461 CALL dfftw_execute(fftw_plan_multi_r2c)
2463 CALL dfftw_destroy_plan(fftw_plan_multi_r2c)
2465 CALL dfftw_plan_many_dft_r2c(fftw_plan_multi_r2c, fft_dim, dim, howmany, prod_ru_2, &
2466 inembed, istride, idist, prod_cu_2, onembed, ostride, odist, fftw_estimate)
2468 CALL dfftw_execute(fftw_plan_multi_r2c)
2470 CALL dfftw_destroy_plan(fftw_plan_multi_r2c)
2472 CALL dfftw_plan_many_dft_r2c(fftw_plan_multi_r2c, fft_dim, dim, howmany, prod_ru_3, &
2473 inembed, istride, idist, prod_cu_3, onembed, ostride, odist, fftw_estimate)
2475 CALL dfftw_execute(fftw_plan_multi_r2c)
2477 CALL dfftw_destroy_plan(fftw_plan_multi_r2c)
2479 prod_cu_1 = prod_cu_1*(1.d0/n_r_pad)
2480 prod_cu_2 = prod_cu_2*(1.d0/n_r_pad)
2481 prod_cu_3 = prod_cu_3*(1.d0/n_r_pad)
2483 IF (
PRESENT(temps)) temps(2) = temps(2) + mpi_wtime() -t
2487 combined_prod_cu_1(:,:,1)=prod_cu_1(1,:,:)
2488 combined_prod_cu_2(:,:,1)=prod_cu_2(1,:,:)
2489 combined_prod_cu_3(:,:,1)=prod_cu_3(1,:,:)
2492 combined_prod_cu_1(:,:,n)=2*conjg(prod_cu_1(n,:,:))
2493 combined_prod_cu_2(:,:,n)=2*conjg(prod_cu_2(n,:,:))
2494 combined_prod_cu_3(:,:,n)=2*conjg(prod_cu_3(n,:,:))
2497 IF (
PRESENT(temps)) temps(3) = temps(3) + mpi_wtime() -t
2500 longueur_tranche=bloc_size*m_max_c*nb_field
2501 mpid=mpi_double_precision
2502 CALL mpi_alltoall (combined_prod_cu_1,longueur_tranche,mpid, dist_prod_cu_1,longueur_tranche, &
2503 mpid,communicator,code)
2504 CALL mpi_alltoall (combined_prod_cu_2,longueur_tranche,mpid, dist_prod_cu_2,longueur_tranche, &
2505 mpid,communicator,code)
2506 CALL mpi_alltoall (combined_prod_cu_3,longueur_tranche,mpid, dist_prod_cu_3,longueur_tranche, &
2507 mpid,communicator,code)
2508 IF (
PRESENT(temps)) temps(1) = temps(1) + mpi_wtime() -t
2513 shiftc = (nb-1)*bloc_size
2514 shiftl = (nb-1)*m_max_c
2515 intermediate_1 = dist_prod_cu_1(:,:,shiftl+i)
2516 intermediate_2 = dist_prod_cu_2(:,:,shiftl+i)
2517 intermediate_3 = dist_prod_cu_3(:,:,shiftl+i)
2519 IF (n+shiftc > np ) cycle
2520 DO i_field = 1, nb_field/2
2521 v1_out(n+shiftc, i_field*2-1, i) =
REAL (intermediate_1(i_field,n),KIND=8)
2522 v1_out(n+shiftc, i_field*2 , i) = aimag(intermediate_1(i_field,n))
2523 v2_out(n+shiftc, i_field*2-1, i) =
REAL (intermediate_2(i_field,n),KIND=8)
2524 v2_out(n+shiftc, i_field*2 , i) = aimag(intermediate_2(i_field,n))
2525 v3_out(n+shiftc, i_field*2-1, i) =
REAL (intermediate_3(i_field,n),KIND=8)
2526 v3_out(n+shiftc, i_field*2 , i) = aimag(intermediate_3(i_field,n))
2531 IF (
PRESENT(temps)) temps(3) = temps(3) + mpi_wtime() -t
2536 c1_real_out, nb_procs, bloc_size, m_max_pad,
l_g, opt_c2_real_out, temps)
2546 REAL(KIND=8),
DIMENSION(:,:,:),
INTENT(IN) :: V1_in, V2_in, V3_in
2547 REAL(KIND=8),
DIMENSION(:,:,:),
INTENT(IN) :: c1_in
2548 REAL(KIND=8),
DIMENSION(:),
INTENT(IN) :: hloc_gauss
2549 REAL(KIND=8),
DIMENSION(:,:),
INTENT(OUT) :: c1_real_out
2550 INTEGER,
INTENT(IN) :: nb_procs, bloc_size, m_max_pad, l_G
2551 REAL(KIND=8),
DIMENSION(:,:),
OPTIONAL,
INTENT(OUT) :: opt_c2_real_out
2552 REAL(KIND=8),
DIMENSION(:),
OPTIONAL,
INTENT(INOUT) :: temps
2553 REAL(KIND=8),
DIMENSION(SIZE(V1_in,3),3*SIZE(V1_in,2)+SIZE(c1_in,2),bloc_size*nb_procs) :: dist_field
2554 REAL(KIND=8),
DIMENSION(SIZE(V1_in,3),3*SIZE(V1_in,2)+SIZE(c1_in,2),bloc_size*nb_procs) :: combined_field
2555 COMPLEX(KIND=8),
DIMENSION(m_max_pad, (3*SIZE(V1_in,2)+SIZE(c1_in,2))/2, bloc_size) :: cu
2556 REAL(KIND=8),
DIMENSION(2*m_max_pad-1,(3*SIZE(V1_in,2)+SIZE(c1_in,2))/2,bloc_size) :: ru
2557 REAL(KIND=8),
DIMENSION(2*m_max_pad-1,bloc_size) :: norm_vel, norm_mom
2558 REAL(KIND=8),
DIMENSION(2*m_max_pad-1, bloc_size/l_G) :: norm_vel_int, norm_mom_int
2559 REAL(KIND=8),
DIMENSION(bloc_size*nb_procs) :: hloc_gauss_tot
2560 REAL(KIND=8),
DIMENSION(2*m_max_pad-1,bloc_size) :: visco_entro
2561 INTEGER :: np, np_tot, nb_field, nb_field2, m_max, m_max_c, MPID, N_r_pad
2562 INTEGER(KIND=8) :: fftw_plan_multi_c2r
2563 INTEGER :: nb, nf, shiftc, shiftl, jindex, longueur_tranche, i, n, code, rank, l
2566 REAL(KIND=8) :: t, hh, x, max_vel_loc, max_vel_F, max_vel_tot, max_mom_loc, max_mom_F, max_mom_tot, max_v_m
2568 INTEGER :: fft_dim, howmany, istride, ostride, idist, odist
2569 INTEGER,
DIMENSION(1) :: dim, inembed, onembed
2573 mpi_comm :: communicator
2574 mpi_comm :: communicator_s
2576 CALL mpi_comm_rank(communicator, rank, code)
2578 IF (
PRESENT(temps)) temps = 0.d0
2581 nb_field =
SIZE(v1_in,2)
2582 nb_field2 =
SIZE(c1_in,2)
2583 m_max_c =
SIZE(v1_in,3)
2584 m_max = m_max_c*nb_procs
2585 np_tot = nb_procs*bloc_size
2586 n_r_pad = 2*m_max_pad-1
2588 IF (mod(nb_field,2)/=0 .OR. m_max_c==0)
THEN 2601 dist_field(i, 1:nb_field, 1:np) = transpose(v1_in(:,:,i))
2602 dist_field(i, nb_field+1:2*nb_field,1:np) = transpose(v2_in(:,:,i))
2603 dist_field(i,2*nb_field+1:3*nb_field,1:np) = transpose(v3_in(:,:,i))
2604 dist_field(i,3*nb_field+1:3*nb_field+nb_field2,1:np) = transpose(c1_in(:,:,i))
2606 IF (
PRESENT(temps)) temps(3) = temps(3) + mpi_wtime() -t
2608 IF (np/=np_tot) dist_field(:,:,np+1:np_tot) = 0.d0
2610 hloc_gauss_tot(1:np) = hloc_gauss
2611 IF (np/=np_tot) hloc_gauss_tot(np+1:np_tot) = 1.d100
2613 longueur_tranche=bloc_size*m_max_c*(nb_field*3+nb_field2)
2616 mpid=mpi_double_precision
2617 CALL mpi_alltoall (dist_field,longueur_tranche, mpid, combined_field, longueur_tranche, &
2618 mpid, communicator, code)
2619 IF (
PRESENT(temps)) temps(1) = temps(1) + mpi_wtime() -t
2627 shiftc = (nb-1)*bloc_size
2628 shiftl = (nb-1)*m_max_c
2630 DO nf = 1, (3*nb_field+nb_field2)/2
2636 cu(shiftl+1:shiftl+m_max_c,nf,n) = 0.5d0*cmplx(combined_field(:,2*nf-1,jindex),&
2637 -combined_field(:,2*nf,jindex),kind=8)
2641 cu(1,:,:) = 2*cmplx(
REAL(cu(1,:,:),KIND=8),0.d0,KIND=8)
2647 IF (
PRESENT(temps)) temps(3) = temps(3) + mpi_wtime() -t
2650 fft_dim=1; istride=1; ostride=1;
2652 idist=n_r_pad; inembed(1)=n_r_pad; dim(1)=n_r_pad
2653 odist=m_max_pad; onembed(1)=m_max_pad
2656 howmany=bloc_size*(nb_field*3+nb_field2)/2
2659 CALL dfftw_plan_many_dft_c2r(fftw_plan_multi_c2r, fft_dim, dim, howmany, cu, &
2660 onembed, ostride, odist, ru, inembed, istride, idist, fftw_estimate)
2662 CALL dfftw_execute(fftw_plan_multi_c2r)
2665 CALL dfftw_destroy_plan(fftw_plan_multi_c2r)
2673 norm_vel(:,:) = sqrt(ru(:,1,:)**2 + ru(:,2,:)**2 + ru(:,3,:)**2)
2674 norm_mom(:,:) = sqrt(ru(:,4,:)**2 + ru(:,5,:)**2 + ru(:,6,:)**2)
2675 DO i = 1, 2*m_max_pad - 1
2676 DO l = 1, bloc_size/l_g
2677 x = maxval(norm_vel(i,(l-1)*l_g+1:l*l_g))
2678 norm_vel_int(i,l) = x
2679 x = maxval(norm_mom(i,(l-1)*l_g+1:l*l_g))
2680 norm_mom_int(i,l) = x
2683 IF (2*m_max_pad - 1 .GE. 3)
THEN 2684 DO l = 1, bloc_size/l_g
2685 DO i = 2, 2*m_max_pad - 2
2686 norm_vel(i,(l-1)*l_g+1:l*l_g) = maxval(norm_vel_int(i-1:i+1,l))
2687 norm_mom(i,(l-1)*l_g+1:l*l_g) = maxval(norm_mom_int(i-1:i+1,l))
2689 norm_vel(1,(l-1)*l_g+1:l*l_g) = max(norm_vel_int(1,l),norm_vel_int(2,l),norm_vel_int(2*m_max_pad - 1,l))
2690 norm_vel(2*m_max_pad - 1,(l-1)*l_g+1:l*l_g) = &
2691 max(norm_vel_int(2*m_max_pad - 2,l),norm_vel_int(2*m_max_pad - 1,l),norm_vel_int(1,l))
2692 norm_mom(1,(l-1)*l_g+1:l*l_g) = max(norm_mom_int(1,l),norm_mom_int(2,l),norm_mom_int(2*m_max_pad - 1,l))
2693 norm_mom(2*m_max_pad - 1,(l-1)*l_g+1:l*l_g) = &
2694 max(norm_mom_int(2*m_max_pad - 2,l),norm_mom_int(2*m_max_pad - 1,l),norm_mom_int(1,l))
2697 DO l = 1, bloc_size/l_g
2698 norm_vel(1,(l-1)*l_g+1:l*l_g) = norm_vel_int(1,l)
2699 norm_mom(1,(l-1)*l_g+1:l*l_g) = norm_mom_int(1,l)
2705 max_vel_loc=maxval(norm_vel)
2706 CALL mpi_allreduce(max_vel_loc,max_vel_f, 1, mpi_double_precision, &
2707 mpi_max, communicator, code)
2708 CALL mpi_allreduce(max_vel_f, max_vel_tot, 1, mpi_double_precision, &
2709 mpi_max, communicator_s, code)
2712 max_mom_loc=maxval(norm_mom)
2713 CALL mpi_allreduce(max_mom_loc,max_mom_f, 1, mpi_double_precision, &
2714 mpi_max, communicator, code)
2715 CALL mpi_allreduce(max_mom_f, max_mom_tot, 1, mpi_double_precision, &
2716 mpi_max, communicator_s, code)
2717 max_v_m = max_vel_tot*max_mom_tot
2722 hh = hloc_gauss_tot(n+rank*bloc_size)
2724 visco_entro(:,n) =
inputs%LES_coeff2*hh* &
2725 max(abs(ru(:,1,n)*ru(:,7,n) + ru(:,2,n)*ru(:,8,n) + ru(:,3,n)*ru(:,9,n)), &
2726 abs(ru(:,10,n)*(ru(:,1,n)**2 + ru(:,2,n)**2 + ru(:,3,n)**2)))
2731 IF (2*m_max_pad - 1 .GE. 3)
THEN 2732 DO l = 1, bloc_size/l_g
2733 DO i = 2, 2*m_max_pad - 2
2734 norm_vel_int(i,l) = maxval(visco_entro(i-1:i+1,(l-1)*l_g+1:l*l_g))
2736 norm_vel_int(1,l) = max(maxval(visco_entro(1,(l-1)*l_g+1:l*l_g)),maxval(visco_entro(2,(l-1)*l_g+1:l*l_g)),&
2737 maxval(visco_entro(2*m_max_pad - 1,(l-1)*l_g+1:l*l_g)))
2738 norm_vel_int(2*m_max_pad - 1,l) = max(maxval(visco_entro(2*m_max_pad - 2,(l-1)*l_g+1:l*l_g)),&
2739 maxval(visco_entro(2*m_max_pad - 1,(l-1)*l_g+1:l*l_g)),maxval(visco_entro(1,(l-1)*l_g+1:l*l_g)))
2742 DO l = 1, bloc_size/l_g
2743 norm_vel_int(1,l) = maxval(visco_entro(1,(l-1)*l_g+1:l*l_g))
2746 DO i = 1, 2*m_max_pad - 1
2747 DO l = 1, bloc_size/l_g
2748 visco_entro(i,(l-1)*l_g+1:l*l_g)=norm_vel_int(i,l)
2756 c1_real_out(:,n) = min(4*
inputs%LES_coeff4*max_vel_tot, &
2757 16*visco_entro(:,n)/(norm_vel(:,n)*norm_mom(:,n)+1.d-30))
2759 c1_real_out(:,n) = min(
inputs%LES_coeff4*norm_vel(:,n), &
2760 visco_entro(:,n)/(norm_vel(:,n)*norm_mom(:,n)+1.d-30))
2761 IF (
PRESENT(opt_c2_real_out))
THEN 2762 opt_c2_real_out(:,n) = min(
inputs%LES_coeff4*max_vel_tot, &
2763 visco_entro(:,n)/(norm_vel(:,n)*norm_mom(:,n)+1.d-30))
2769 IF (
PRESENT(temps)) temps(3) = temps(3) + mpi_wtime() -t
2774 v1_out, v2_out, nb_procs, bloc_size, m_max_pad, temps)
2783 REAL(KIND=8),
DIMENSION(:,:,:),
INTENT(IN) :: V1_in, V2_in
2784 REAL(KIND=8),
DIMENSION(:,:,:),
INTENT(IN) :: V3_in
2785 REAL(KIND=8),
DIMENSION(:,:,:),
INTENT(OUT) :: V1_out
2786 REAL(KIND=8),
DIMENSION(:,:,:),
INTENT(OUT) :: V2_out
2787 REAL(KIND=8),
DIMENSION(:),
OPTIONAL,
INTENT(INOUT) :: temps
2788 INTEGER,
INTENT(IN) :: bloc_size, m_max_pad, nb_procs
2789 INTEGER :: np, np_tot, nb_field1, nb_field2, nb_field3
2790 INTEGER :: m_max, m_max_c, MPID, N_r_pad
2791 INTEGER(KIND=8) :: fftw_plan_multi_c2r, fftw_plan_multi_r2c
2792 REAL(KIND=8),
DIMENSION(SIZE(V1_in,3),2*SIZE(V1_in,2)+SIZE(V3_in,2), bloc_size*nb_procs) :: dist_field
2793 REAL(KIND=8),
DIMENSION(SIZE(V1_in,3),2*SIZE(V1_in,2)+SIZE(V3_in,2), bloc_size*nb_procs) :: combined_field
2794 COMPLEX(KIND=8),
DIMENSION(m_max_pad, (2*SIZE(V1_in,2)+SIZE(V3_in,2))/2, bloc_size) :: cu
2795 REAL(KIND=8),
DIMENSION(2*m_max_pad-1,(2*SIZE(V1_in,2)+SIZE(V3_in,2))/2,bloc_size) :: ru
2796 REAL(KIND=8),
DIMENSION(2*m_max_pad-1,SIZE(V1_in,2)/2,bloc_size) :: prod_ru_1, prod_ru_2
2797 COMPLEX(KIND=8),
DIMENSION(m_max_pad,SIZE(V1_in,2)/2,bloc_size) :: prod_cu_1, prod_cu_2
2798 COMPLEX(KIND=8),
DIMENSION(SIZE(V1_in,2)/2,bloc_size) :: intermediate_1, intermediate_2
2799 COMPLEX(KIND=8),
DIMENSION(SIZE(V1_in,2)/2,bloc_size,SIZE(V1_in,3)*nb_procs) :: combined_prod_cu_1
2800 COMPLEX(KIND=8),
DIMENSION(SIZE(V1_in,2)/2,bloc_size,SIZE(V1_in,3)*nb_procs) :: combined_prod_cu_2
2801 COMPLEX(KIND=8),
DIMENSION(SIZE(V1_in,2)/2,bloc_size,SIZE(V1_in,3)*nb_procs) :: dist_prod_cu_1
2802 COMPLEX(KIND=8),
DIMENSION(SIZE(V1_in,2)/2,bloc_size,SIZE(V1_in,3)*nb_procs) :: dist_prod_cu_2
2803 INTEGER :: i_field, rank
2804 INTEGER :: nb, nf, shiftc, shiftl, jindex, longueur_tranche, i, n, code
2807 INTEGER :: fft_dim, howmany, istride, ostride, idist, odist
2808 INTEGER,
DIMENSION(1) :: dim, inembed, onembed
2812 mpi_comm :: communicator
2813 petscerrorcode :: ierr
2815 IF (
PRESENT(temps)) temps = 0.d0
2817 CALL mpi_comm_rank(communicator, rank, ierr)
2820 nb_field1=
SIZE(v1_in,2)
2821 nb_field2=
SIZE(v2_in,2)
2822 nb_field3=
SIZE(v3_in,2)
2823 m_max_c =
SIZE(v1_in,3)
2824 m_max = m_max_c*nb_procs
2825 n_r_pad = 2*m_max_pad-1
2826 np_tot = nb_procs*bloc_size
2828 IF (mod(nb_field1,2)/=0 .OR. mod(nb_field2,2)/=0 .OR. m_max_c==0)
THEN 2846 dist_field(i,1:nb_field1,1:np) = transpose(v1_in(:,:,i))
2847 dist_field(i,nb_field1+1:2*nb_field1,1:np) = transpose(v2_in(:,:,i))
2848 dist_field(i,2*nb_field1+1:2*nb_field1+nb_field3,1:np) = transpose(v3_in(:,:,i))
2850 IF (
PRESENT(temps)) temps(3) = temps(3) + mpi_wtime() -t
2852 IF (np/=np_tot) dist_field(:,:,np+1:np_tot) = 0.d0
2854 longueur_tranche=bloc_size*m_max_c*(nb_field1+nb_field2+nb_field3)
2857 mpid=mpi_double_precision
2858 CALL mpi_alltoall (dist_field,longueur_tranche, mpid, combined_field, longueur_tranche, &
2859 mpid, communicator, code)
2860 IF (
PRESENT(temps)) temps(1) = temps(1) + mpi_wtime() -t
2868 shiftc = (nb-1)*bloc_size
2869 shiftl = (nb-1)*m_max_c
2871 DO nf = 1, (nb_field1+nb_field2+nb_field3)/2
2877 cu(shiftl+1:shiftl+m_max_c,nf,n) = 0.5d0*cmplx(combined_field(:,2*nf-1,jindex),&
2878 -combined_field(:,2*nf,jindex),kind=8)
2882 cu(1,:,:) = 2*cmplx(
REAL(cu(1,:,:),KIND=8),0.d0,KIND=8)
2888 IF (
PRESENT(temps)) temps(3) = temps(3) + mpi_wtime() -t
2891 fft_dim=1; istride=1; ostride=1;
2895 idist=n_r_pad; inembed(1)=n_r_pad; dim(1)=n_r_pad
2896 odist=m_max_pad; onembed(1)=m_max_pad
2899 howmany=bloc_size*(nb_field1+nb_field2+nb_field3)/2
2902 CALL dfftw_plan_many_dft_c2r(fftw_plan_multi_c2r, fft_dim, dim, howmany, cu, &
2903 onembed, ostride, odist, ru, inembed, istride, idist, fftw_estimate)
2905 CALL dfftw_execute(fftw_plan_multi_c2r)
2908 CALL dfftw_destroy_plan(fftw_plan_multi_c2r)
2914 IF (nb_field1==6 .AND. nb_field2==6 .AND. nb_field3==2)
THEN 2916 prod_ru_1(:,1,:) = ru(:,7,:)*ru(:,1,:)
2917 prod_ru_1(:,2,:) = ru(:,7,:)*ru(:,2,:)
2918 prod_ru_1(:,3,:) = ru(:,7,:)*ru(:,3,:)
2920 prod_ru_2(:,1,:) = ru(:,7,:)*ru(:,4,:)
2921 prod_ru_2(:,2,:) = ru(:,7,:)*ru(:,5,:)
2922 prod_ru_2(:,3,:) = ru(:,7,:)*ru(:,6,:)
2925 CALL error_petsc(
'error on inputs while calling FFT_COMPUTE_DIFFU_MOM')
2928 howmany = bloc_size*nb_field1/2
2929 CALL dfftw_plan_many_dft_r2c(fftw_plan_multi_r2c, fft_dim, dim, howmany, prod_ru_1, &
2930 inembed, istride, idist, prod_cu_1, onembed, ostride, odist, fftw_estimate)
2931 CALL dfftw_execute(fftw_plan_multi_r2c)
2933 CALL dfftw_destroy_plan(fftw_plan_multi_r2c)
2935 howmany = bloc_size*nb_field1/2
2936 CALL dfftw_plan_many_dft_r2c(fftw_plan_multi_r2c, fft_dim, dim, howmany, prod_ru_2, &
2937 inembed, istride, idist, prod_cu_2, onembed, ostride, odist, fftw_estimate)
2938 CALL dfftw_execute(fftw_plan_multi_r2c)
2940 CALL dfftw_destroy_plan(fftw_plan_multi_r2c)
2944 prod_cu_1 = prod_cu_1*(1.d0/n_r_pad)
2945 prod_cu_2 = prod_cu_2*(1.d0/n_r_pad)
2947 IF (
PRESENT(temps)) temps(2) = temps(2) + mpi_wtime() -t
2952 combined_prod_cu_1(:,:,1)=prod_cu_1(1,:,:)
2953 combined_prod_cu_2(:,:,1)=prod_cu_2(1,:,:)
2955 combined_prod_cu_1(:,:,n)=2*conjg(prod_cu_1(n,:,:))
2956 combined_prod_cu_2(:,:,n)=2*conjg(prod_cu_2(n,:,:))
2959 IF (
PRESENT(temps)) temps(3) = temps(3) + mpi_wtime() -t
2962 longueur_tranche=bloc_size*m_max_c*nb_field1
2963 mpid=mpi_double_precision
2964 CALL mpi_alltoall (combined_prod_cu_1,longueur_tranche,mpid, dist_prod_cu_1,longueur_tranche, &
2965 mpid,communicator,code)
2966 CALL mpi_alltoall (combined_prod_cu_2,longueur_tranche,mpid, dist_prod_cu_2,longueur_tranche, &
2967 mpid,communicator,code)
2969 IF (
PRESENT(temps)) temps(1) = temps(1) + mpi_wtime() -t
2974 shiftc = (nb-1)*bloc_size
2975 shiftl = (nb-1)*m_max_c
2976 intermediate_1 = dist_prod_cu_1(:,:,shiftl+i)
2977 intermediate_2 = dist_prod_cu_2(:,:,shiftl+i)
2979 IF (n+shiftc > np ) cycle
2980 DO i_field = 1, nb_field1/2
2981 v1_out(n+shiftc, i_field*2-1, i) =
REAL (intermediate_1(i_field,n),KIND=8)
2982 v1_out(n+shiftc, i_field*2 , i) = aimag(intermediate_1(i_field,n))
2983 v2_out(n+shiftc, i_field*2-1, i) =
REAL (intermediate_2(i_field,n),KIND=8)
2984 v2_out(n+shiftc, i_field*2 , i) = aimag(intermediate_2(i_field,n))
2990 IF (
PRESENT(temps)) temps(3) = temps(3) + mpi_wtime() -t
2995 coeff1_in_level, v_out, c_out, nb_procs, bloc_size, m_max_pad, temps)
3004 REAL(KIND=8),
DIMENSION(:,:,:),
INTENT(IN) :: V1_in, V2_in
3005 REAL(KIND=8),
DIMENSION(:,:,:),
INTENT(IN) :: c1_in
3006 REAL(KIND=8),
DIMENSION(:,:),
INTENT(IN) :: c_in_real
3007 REAL(KIND=8),
DIMENSION(:),
INTENT(IN) :: hloc_gauss
3008 REAL(KIND=8),
INTENT(IN) :: coeff1_in_level
3009 REAL(KIND=8),
DIMENSION(:,:,:),
INTENT(OUT) :: V_out
3010 REAL(KIND=8),
DIMENSION(:,:,:),
INTENT(OUT) :: c_out
3011 REAL(KIND=8),
DIMENSION(:),
OPTIONAL,
INTENT(INOUT) :: temps
3012 INTEGER,
INTENT(IN) :: bloc_size, m_max_pad, nb_procs
3013 INTEGER :: np, np_tot, nb_field1, nb_field2, nb_field3
3014 INTEGER :: m_max, m_max_c, MPID, N_r_pad
3015 INTEGER(KIND=8) :: fftw_plan_multi_c2r, fftw_plan_multi_r2c
3016 REAL(KIND=8),
DIMENSION(SIZE(V1_in,3),2*SIZE(V1_in,2)+SIZE(c1_in,2),bloc_size*nb_procs) :: dist_field
3017 REAL(KIND=8),
DIMENSION(SIZE(V1_in,3),2*SIZE(V1_in,2)+SIZE(c1_in,2),bloc_size*nb_procs) :: combined_field
3018 COMPLEX(KIND=8),
DIMENSION(m_max_pad, (2*SIZE(V1_in,2)+SIZE(c1_in,2))/2, bloc_size) :: cu
3019 REAL(KIND=8),
DIMENSION(2*m_max_pad-1,(2*SIZE(V1_in,2)+SIZE(c1_in,2))/2,bloc_size) :: ru
3020 REAL(KIND=8),
DIMENSION(2*m_max_pad-1, bloc_size) :: norm_grad_phi
3021 REAL(KIND=8),
DIMENSION(bloc_size*nb_procs) :: hloc_gauss_tot
3022 REAL(KIND=8),
DIMENSION(2*m_max_pad-1, bloc_size) :: visc_comp, visc_entro
3023 COMPLEX(KIND=8),
DIMENSION(m_max_pad,SIZE(V1_in,2)/2,bloc_size) :: prod_cu
3024 REAL(KIND=8),
DIMENSION(2*m_max_pad-1,SIZE(V1_in,2)/2,bloc_size) :: prod_ru
3025 COMPLEX(KIND=8),
DIMENSION(SIZE(V1_in,2)/2, bloc_size) :: intermediate
3026 COMPLEX(KIND=8),
DIMENSION(SIZE(V1_in,2)/2,bloc_size,SIZE(V1_in,3)*nb_procs) :: combined_prod_cu
3027 COMPLEX(KIND=8),
DIMENSION(SIZE(V1_in,2)/2,bloc_size,SIZE(V1_in,3)*nb_procs) :: dist_prod_cu
3028 COMPLEX(KIND=8),
DIMENSION(m_max_pad,bloc_size) :: prod_cu2
3029 REAL(KIND=8),
DIMENSION(2*m_max_pad-1,bloc_size) :: prod_ru2
3030 COMPLEX(KIND=8),
DIMENSION(bloc_size,SIZE(V1_in,3)*nb_procs) :: combined_prod_cu2
3031 COMPLEX(KIND=8),
DIMENSION(bloc_size,SIZE(V1_in,3)*nb_procs) :: dist_prod_cu2
3032 COMPLEX(KIND=8),
DIMENSION(bloc_size) :: intermediate2
3034 INTEGER :: nb, nf, shiftc, shiftl, jindex, longueur_tranche, i, n, code
3038 INTEGER :: fft_dim, howmany, istride, ostride, idist, odist
3039 INTEGER,
DIMENSION(1) :: dim, inembed, onembed
3043 mpi_comm :: communicator
3045 CALL mpi_comm_rank(communicator, rank, code)
3047 IF (
PRESENT(temps)) temps = 0.d0
3050 nb_field1=
SIZE(v1_in,2)
3051 nb_field2=
SIZE(v2_in,2)
3052 nb_field3=
SIZE(c1_in,2)
3053 m_max_c =
SIZE(v1_in,3)
3054 m_max = m_max_c*nb_procs
3055 n_r_pad = 2*m_max_pad-1
3056 np_tot = nb_procs*bloc_size
3058 IF (mod(nb_field1,2)/=0 .OR. mod(nb_field2,2)/=0 .OR. m_max_c==0)
THEN 3076 dist_field(i,1:nb_field1,1:np) = transpose(v1_in(:,:,i))
3077 dist_field(i,nb_field1+1:2*nb_field1,1:np) = transpose(v2_in(:,:,i))
3078 dist_field(i,2*nb_field1+1:2*nb_field1+nb_field3,1:np) = transpose(c1_in(:,:,i))
3080 IF (
PRESENT(temps)) temps(3) = temps(3) + mpi_wtime() -t
3082 IF (np/=np_tot) dist_field(:,:,np+1:np_tot) = 1.d100
3084 hloc_gauss_tot(1:np) = hloc_gauss
3085 IF (np/=np_tot) hloc_gauss_tot(np+1:np_tot) = 1.d100
3087 longueur_tranche=bloc_size*m_max_c*(nb_field1+nb_field2+nb_field3)
3090 mpid=mpi_double_precision
3091 CALL mpi_alltoall (dist_field,longueur_tranche, mpid, combined_field, longueur_tranche, &
3092 mpid, communicator, code)
3093 IF (
PRESENT(temps)) temps(1) = temps(1) + mpi_wtime() -t
3101 shiftc = (nb-1)*bloc_size
3102 shiftl = (nb-1)*m_max_c
3104 DO nf = 1, (nb_field1+nb_field2+nb_field3)/2
3110 cu(shiftl+1:shiftl+m_max_c,nf,n) = 0.5d0*cmplx(combined_field(:,2*nf-1,jindex),&
3111 -combined_field(:,2*nf,jindex),kind=8)
3115 cu(1,:,:) = 2*cmplx(
REAL(cu(1,:,:),KIND=8),0.d0,KIND=8)
3121 IF (
PRESENT(temps)) temps(3) = temps(3) + mpi_wtime() -t
3124 fft_dim=1; istride=1; ostride=1;
3128 idist=n_r_pad; inembed(1)=n_r_pad; dim(1)=n_r_pad
3129 odist=m_max_pad; onembed(1)=m_max_pad
3132 howmany=bloc_size*(nb_field1+nb_field2+nb_field3)/2
3135 CALL dfftw_plan_many_dft_c2r(fftw_plan_multi_c2r, fft_dim, dim, howmany, cu, &
3136 onembed, ostride, odist, ru, inembed, istride, idist, fftw_estimate)
3138 CALL dfftw_execute(fftw_plan_multi_c2r)
3141 CALL dfftw_destroy_plan(fftw_plan_multi_c2r)
3143 IF (nb_field1 == 6 .AND. nb_field2 == 6 .AND. nb_field3 == 2)
THEN 3150 prod_ru2(:,:) = max(0.d0, ru(:,7,:)*(1.d0 - ru(:,7,:)))
3153 norm_grad_phi(:,:) = sqrt(ru(:,4,:)**2 + ru(:,5,:)**2 + ru(:,6,:)**2) + 1.d-14
3157 visc_entro(:,n) = -coeff1_in_level + c_in_real(:,n)
3158 visc_comp(:,n)= c_in_real(:,n)*
inputs%level_set_comp_factor*prod_ru2(:,n)/norm_grad_phi(:,n)
3162 prod_ru(:,1,:) = -visc_entro*ru(:,1,:) + visc_comp*ru(:,4,:)
3163 prod_ru(:,2,:) = -visc_entro*ru(:,2,:) + visc_comp*ru(:,5,:)
3164 prod_ru(:,3,:) = -visc_entro*ru(:,3,:) + visc_comp*ru(:,6,:)
3180 CALL error_petsc(
'error in problem type while calling FFT_PAR_COMPR_ENTRO_VISC_DCL')
3183 howmany = bloc_size*nb_field1/2
3184 CALL dfftw_plan_many_dft_r2c(fftw_plan_multi_r2c, fft_dim, dim, howmany, prod_ru, &
3185 inembed, istride, idist, prod_cu, onembed, ostride, odist, fftw_estimate)
3186 CALL dfftw_execute(fftw_plan_multi_r2c)
3188 CALL dfftw_destroy_plan(fftw_plan_multi_r2c)
3190 howmany = bloc_size*1
3191 CALL dfftw_plan_many_dft_r2c(fftw_plan_multi_r2c, fft_dim, dim, howmany, prod_ru2, &
3192 inembed, istride, idist, prod_cu2, onembed, ostride, odist, fftw_estimate)
3193 CALL dfftw_execute(fftw_plan_multi_r2c)
3195 CALL dfftw_destroy_plan(fftw_plan_multi_r2c)
3199 prod_cu = prod_cu*(1.d0/n_r_pad)
3200 prod_cu2 = prod_cu2*(1.d0/n_r_pad)
3202 IF (
PRESENT(temps)) temps(2) = temps(2) + mpi_wtime() -t
3207 combined_prod_cu(:,:,1)=prod_cu(1,:,:)
3208 combined_prod_cu2(:,1)=prod_cu2(1,:)
3210 combined_prod_cu(:,:,n)=2*conjg(prod_cu(n,:,:))
3211 combined_prod_cu2(:,n)=2*conjg(prod_cu2(n,:))
3214 IF (
PRESENT(temps)) temps(3) = temps(3) + mpi_wtime() -t
3217 longueur_tranche=bloc_size*m_max_c*nb_field1
3218 mpid=mpi_double_precision
3219 CALL mpi_alltoall (combined_prod_cu,longueur_tranche,mpid, dist_prod_cu,longueur_tranche, &
3220 mpid,communicator,code)
3222 longueur_tranche=bloc_size*m_max_c*2
3223 mpid=mpi_double_precision
3224 CALL mpi_alltoall (combined_prod_cu2,longueur_tranche,mpid, dist_prod_cu2,longueur_tranche, &
3225 mpid,communicator,code)
3227 IF (
PRESENT(temps)) temps(1) = temps(1) + mpi_wtime() -t
3233 shiftc = (nb-1)*bloc_size
3234 shiftl = (nb-1)*m_max_c
3235 intermediate = dist_prod_cu(:,:,shiftl+i)
3236 intermediate2 = dist_prod_cu2(:,shiftl+i)
3238 IF (n+shiftc > np ) cycle
3239 DO i_field = 1, nb_field1/2
3240 v_out(n+shiftc, i_field*2-1, i) =
REAL (intermediate(i_field,n),KIND=8)
3241 v_out(n+shiftc, i_field*2 , i) = aimag(intermediate(i_field,n))
3243 c_out(n+shiftc, 1, i) =
REAL (intermediate2(n),KIND=8)
3244 c_out(n+shiftc, 2, i) = aimag(intermediate2(n))
3249 IF (
PRESENT(temps)) temps(3) = temps(3) + mpi_wtime() -t
3254 v_out, nb_procs, bloc_size, m_max_pad, temps)
3264 REAL(KIND=8),
DIMENSION(:,:,:),
INTENT(IN) :: V1_in, V2_in, V3_in
3265 REAL(KIND=8),
DIMENSION(:,:),
INTENT(IN) :: c_in_real
3266 REAL(KIND=8),
DIMENSION(:,:,:,:),
INTENT(OUT) :: V_out
3267 INTEGER,
INTENT(IN) :: nb_procs, bloc_size, m_max_pad
3268 REAL(KIND=8),
DIMENSION(:),
OPTIONAL,
INTENT(INOUT) :: temps
3269 COMPLEX(KIND=8),
DIMENSION(m_max_pad, SIZE(V1_in,2)*3/2, bloc_size) :: cu
3270 REAL(KIND=8),
DIMENSION(2*m_max_pad-1,SIZE(V1_in,2)*3/2,bloc_size) :: ru
3271 REAL(KIND=8),
DIMENSION(2*m_max_pad-1,bloc_size) :: visco_entro
3272 REAL(KIND=8),
DIMENSION(2*m_max_pad-1,SIZE(V1_in,2)/2,bloc_size) :: prod_ru_1, prod_ru_2, prod_ru_3
3273 COMPLEX(KIND=8),
DIMENSION(m_max_pad,SIZE(V1_in,2)/2,bloc_size) :: prod_cu_1, prod_cu_2, prod_cu_3
3275 COMPLEX(KIND=8),
DIMENSION(SIZE(V1_in,2)/2,bloc_size) :: intermediate_1, intermediate_2, intermediate_3
3276 REAL(KIND=8),
DIMENSION(SIZE(V1_in,3),3*SIZE(V1_in,2),bloc_size*nb_procs) :: dist_field, combined_field
3277 COMPLEX(KIND=8),
DIMENSION(SIZE(V1_in,2)/2,bloc_size,SIZE(V1_in,3)*nb_procs) :: combined_prod_cu_1
3278 COMPLEX(KIND=8),
DIMENSION(SIZE(V1_in,2)/2,bloc_size,SIZE(V1_in,3)*nb_procs) :: combined_prod_cu_2
3279 COMPLEX(KIND=8),
DIMENSION(SIZE(V1_in,2)/2,bloc_size,SIZE(V1_in,3)*nb_procs) :: combined_prod_cu_3
3280 COMPLEX(KIND=8),
DIMENSION(SIZE(V1_in,2)/2,bloc_size,SIZE(V1_in,3)*nb_procs) :: dist_prod_cu_1
3281 COMPLEX(KIND=8),
DIMENSION(SIZE(V1_in,2)/2,bloc_size,SIZE(V1_in,3)*nb_procs) :: dist_prod_cu_2
3282 COMPLEX(KIND=8),
DIMENSION(SIZE(V1_in,2)/2,bloc_size,SIZE(V1_in,3)*nb_procs) :: dist_prod_cu_3
3283 INTEGER :: np, np_tot, nb_field, m_max, m_max_c, MPID, N_r_pad
3284 INTEGER(KIND=8) :: fftw_plan_multi_c2r, fftw_plan_multi_r2c
3285 INTEGER :: nb, nf, shiftc, shiftl, jindex, longueur_tranche, i, n, code, rank, i_field
3288 INTEGER :: fft_dim, howmany, istride, ostride, idist, odist
3289 INTEGER,
DIMENSION(1) :: dim, inembed, onembed
3293 mpi_comm :: communicator
3294 CALL mpi_comm_rank(communicator, rank, code)
3296 IF (
PRESENT(temps)) temps = 0.d0
3299 nb_field=
SIZE(v1_in,2)
3300 m_max_c =
SIZE(v1_in,3)
3301 m_max = m_max_c*nb_procs
3302 np_tot = nb_procs*bloc_size
3303 n_r_pad=2*m_max_pad-1
3305 IF (mod(nb_field,2)/=0 .OR. m_max_c==0)
THEN 3318 dist_field(i, 1:nb_field, 1:np) = transpose(v1_in(:,:,i))
3319 dist_field(i, nb_field+1:2*nb_field,1:np) = transpose(v2_in(:,:,i))
3320 dist_field(i,2*nb_field+1:3*nb_field,1:np) = transpose(v3_in(:,:,i))
3322 IF (
PRESENT(temps)) temps(3) = temps(3) + mpi_wtime() -t
3324 IF (np/=np_tot) dist_field(:,:,np+1:np_tot) = 1.d100
3326 longueur_tranche=bloc_size*m_max_c*nb_field*3
3329 mpid=mpi_double_precision
3330 CALL mpi_alltoall (dist_field,longueur_tranche, mpid, combined_field, longueur_tranche, &
3331 mpid, communicator, code)
3332 IF (
PRESENT(temps)) temps(1) = temps(1) + mpi_wtime() -t
3340 shiftc = (nb-1)*bloc_size
3341 shiftl = (nb-1)*m_max_c
3343 DO nf = 1, nb_field*3/2
3349 cu(shiftl+1:shiftl+m_max_c,nf,n) = 0.5d0*cmplx(combined_field(:,2*nf-1,jindex),&
3350 -combined_field(:,2*nf,jindex),kind=8)
3354 cu(1,:,:) = 2*cmplx(
REAL(cu(1,:,:),KIND=8),0.d0,KIND=8)
3360 IF (
PRESENT(temps)) temps(3) = temps(3) + mpi_wtime() -t
3363 fft_dim=1; istride=1; ostride=1;
3367 idist=n_r_pad; inembed(1)=n_r_pad; dim(1)=n_r_pad
3368 odist=m_max_pad; onembed(1)=m_max_pad
3371 howmany=bloc_size*nb_field*3/2
3374 CALL dfftw_plan_many_dft_c2r(fftw_plan_multi_c2r, fft_dim, dim, howmany, cu, &
3375 onembed, ostride, odist, ru, inembed, istride, idist, fftw_estimate)
3377 CALL dfftw_execute(fftw_plan_multi_c2r)
3379 CALL dfftw_destroy_plan(fftw_plan_multi_c2r)
3387 visco_entro(:,n) = -
inputs%LES_coeff1_mom + c_in_real(:,n)
3392 prod_ru_1(:,1,:) = visco_entro*ru(:,1,:)
3393 prod_ru_1(:,2,:) = visco_entro*ru(:,2,:)
3394 prod_ru_1(:,3,:) = visco_entro*ru(:,3,:)
3396 prod_ru_2(:,1,:) = visco_entro*ru(:,4,:)
3397 prod_ru_2(:,2,:) = visco_entro*ru(:,5,:)
3398 prod_ru_2(:,3,:) = visco_entro*ru(:,6,:)
3400 prod_ru_3(:,1,:) = visco_entro*ru(:,7,:)
3401 prod_ru_3(:,2,:) = visco_entro*ru(:,8,:)
3402 prod_ru_3(:,3,:) = visco_entro*ru(:,9,:)
3405 howmany = bloc_size*nb_field/2
3406 CALL dfftw_plan_many_dft_r2c(fftw_plan_multi_r2c, fft_dim, dim, howmany, prod_ru_1, &
3407 inembed, istride, idist, prod_cu_1, onembed, ostride, odist, fftw_estimate)
3409 CALL dfftw_execute(fftw_plan_multi_r2c)
3411 CALL dfftw_destroy_plan(fftw_plan_multi_r2c)
3413 CALL dfftw_plan_many_dft_r2c(fftw_plan_multi_r2c, fft_dim, dim, howmany, prod_ru_2, &
3414 inembed, istride, idist, prod_cu_2, onembed, ostride, odist, fftw_estimate)
3416 CALL dfftw_execute(fftw_plan_multi_r2c)
3418 CALL dfftw_destroy_plan(fftw_plan_multi_r2c)
3420 CALL dfftw_plan_many_dft_r2c(fftw_plan_multi_r2c, fft_dim, dim, howmany, prod_ru_3, &
3421 inembed, istride, idist, prod_cu_3, onembed, ostride, odist, fftw_estimate)
3423 CALL dfftw_execute(fftw_plan_multi_r2c)
3425 CALL dfftw_destroy_plan(fftw_plan_multi_r2c)
3427 prod_cu_1 = prod_cu_1*(1.d0/n_r_pad)
3428 prod_cu_2 = prod_cu_2*(1.d0/n_r_pad)
3429 prod_cu_3 = prod_cu_3*(1.d0/n_r_pad)
3431 IF (
PRESENT(temps)) temps(2) = temps(2) + mpi_wtime() -t
3435 combined_prod_cu_1(:,:,1)=prod_cu_1(1,:,:)
3436 combined_prod_cu_2(:,:,1)=prod_cu_2(1,:,:)
3437 combined_prod_cu_3(:,:,1)=prod_cu_3(1,:,:)
3440 combined_prod_cu_1(:,:,n)=2*conjg(prod_cu_1(n,:,:))
3441 combined_prod_cu_2(:,:,n)=2*conjg(prod_cu_2(n,:,:))
3442 combined_prod_cu_3(:,:,n)=2*conjg(prod_cu_3(n,:,:))
3445 IF (
PRESENT(temps)) temps(3) = temps(3) + mpi_wtime() -t
3448 longueur_tranche=bloc_size*m_max_c*nb_field
3449 mpid=mpi_double_precision
3450 CALL mpi_alltoall (combined_prod_cu_1,longueur_tranche,mpid, dist_prod_cu_1,longueur_tranche, &
3451 mpid,communicator,code)
3452 CALL mpi_alltoall (combined_prod_cu_2,longueur_tranche,mpid, dist_prod_cu_2,longueur_tranche, &
3453 mpid,communicator,code)
3454 CALL mpi_alltoall (combined_prod_cu_3,longueur_tranche,mpid, dist_prod_cu_3,longueur_tranche, &
3455 mpid,communicator,code)
3456 IF (
PRESENT(temps)) temps(1) = temps(1) + mpi_wtime() -t
3461 shiftc = (nb-1)*bloc_size
3462 shiftl = (nb-1)*m_max_c
3463 intermediate_1 = dist_prod_cu_1(:,:,shiftl+i)
3464 intermediate_2 = dist_prod_cu_2(:,:,shiftl+i)
3465 intermediate_3 = dist_prod_cu_3(:,:,shiftl+i)
3467 IF (n+shiftc > np ) cycle
3468 DO i_field = 1, nb_field/2
3469 v_out(1,n+shiftc, i_field*2-1, i) =
REAL (intermediate_1(i_field,n),KIND=8)
3470 v_out(1,n+shiftc, i_field*2 , i) = aimag(intermediate_1(i_field,n))
3471 v_out(2,n+shiftc, i_field*2-1, i) =
REAL (intermediate_2(i_field,n),KIND=8)
3472 v_out(2,n+shiftc, i_field*2 , i) = aimag(intermediate_2(i_field,n))
3473 v_out(3,n+shiftc, i_field*2-1, i) =
REAL (intermediate_3(i_field,n),KIND=8)
3474 v_out(3,n+shiftc, i_field*2 , i) = aimag(intermediate_3(i_field,n))
3479 IF (
PRESENT(temps)) temps(3) = temps(3) + mpi_wtime() -t
3493 REAL(KIND=8),
DIMENSION(:,:,:),
INTENT(INOUT) :: c1_inout
3494 INTEGER,
INTENT(IN) :: nb_procs, bloc_size, m_max_pad
3495 REAL(KIND=8),
DIMENSION(:),
OPTIONAL,
INTENT(INOUT) :: temps
3496 REAL(KIND=8),
DIMENSION(SIZE(c1_inout,3),SIZE(c1_inout,2),bloc_size*nb_procs) :: dist_field
3497 REAL(KIND=8),
DIMENSION(SIZE(c1_inout,3),SIZE(c1_inout,2),bloc_size*nb_procs) :: combined_field
3498 COMPLEX(KIND=8),
DIMENSION(m_max_pad, SIZE(c1_inout,2)/2, bloc_size) :: cu
3499 REAL(KIND=8),
DIMENSION(2*m_max_pad-1,SIZE(c1_inout,2)/2,bloc_size) :: ru
3500 REAL(KIND=8),
DIMENSION(2*m_max_pad-1,bloc_size) :: prod_ru_1
3501 COMPLEX(KIND=8),
DIMENSION(m_max_pad,bloc_size) :: prod_cu_1
3502 COMPLEX(KIND=8),
DIMENSION(bloc_size,SIZE(c1_inout,3)*nb_procs) :: combined_prod_cu_1
3503 COMPLEX(KIND=8),
DIMENSION(bloc_size,SIZE(c1_inout,3)*nb_procs) :: dist_prod_cu_1
3504 COMPLEX(KIND=8),
DIMENSION(bloc_size) :: intermediate_1
3505 INTEGER :: np, np_tot, nb_field, m_max, m_max_c, MPID, N_r_pad
3506 INTEGER(KIND=8) :: fftw_plan_multi_c2r, fftw_plan_multi_r2c
3507 INTEGER :: nb, nf, shiftc, shiftl, jindex, longueur_tranche, i, n, code, rank
3510 INTEGER :: fft_dim, howmany, istride, ostride, idist, odist
3511 INTEGER,
DIMENSION(1) :: dim, inembed, onembed
3515 mpi_comm :: communicator
3517 CALL mpi_comm_rank(communicator, rank, code)
3519 IF (
PRESENT(temps)) temps = 0.d0
3521 np =
SIZE(c1_inout,1)
3522 nb_field =
SIZE(c1_inout,2)
3523 m_max_c =
SIZE(c1_inout,3)
3524 m_max = m_max_c*nb_procs
3525 np_tot = nb_procs*bloc_size
3526 n_r_pad = 2*m_max_pad-1
3528 IF (mod(nb_field,2)/=0 .OR. m_max_c==0)
THEN 3541 dist_field(i, 1:nb_field, 1:np) = transpose(c1_inout(:,:,i))
3543 IF (
PRESENT(temps)) temps(3) = temps(3) + mpi_wtime() -t
3545 IF (np/=np_tot) dist_field(:,:,np+1:np_tot) = 0.d0
3547 longueur_tranche=bloc_size*m_max_c*nb_field
3550 mpid=mpi_double_precision
3551 CALL mpi_alltoall (dist_field,longueur_tranche, mpid, combined_field, longueur_tranche, &
3552 mpid, communicator, code)
3553 IF (
PRESENT(temps)) temps(1) = temps(1) + mpi_wtime() -t
3561 shiftc = (nb-1)*bloc_size
3562 shiftl = (nb-1)*m_max_c
3564 DO nf = 1, nb_field/2
3570 cu(shiftl+1:shiftl+m_max_c,nf,n) = 0.5d0*cmplx(combined_field(:,2*nf-1,jindex),&
3571 -combined_field(:,2*nf,jindex),kind=8)
3575 cu(1,:,:) = 2*cmplx(
REAL(cu(1,:,:),KIND=8),0.d0,KIND=8)
3581 IF (
PRESENT(temps)) temps(3) = temps(3) + mpi_wtime() -t
3584 fft_dim=1; istride=1; ostride=1;
3588 idist=n_r_pad; inembed(1)=n_r_pad; dim(1)=n_r_pad
3589 odist=m_max_pad; onembed(1)=m_max_pad
3592 howmany=bloc_size*nb_field/2
3595 CALL dfftw_plan_many_dft_c2r(fftw_plan_multi_c2r, fft_dim, dim, howmany, cu, &
3596 onembed, ostride, odist, ru, inembed, istride, idist, fftw_estimate)
3598 CALL dfftw_execute(fftw_plan_multi_c2r)
3601 CALL dfftw_destroy_plan(fftw_plan_multi_c2r)
3605 prod_ru_1(:,n) = max(0.d0, min(1.d0, ru(:,1,n)))
3609 howmany = bloc_size*1
3610 CALL dfftw_plan_many_dft_r2c(fftw_plan_multi_r2c, fft_dim, dim, howmany, prod_ru_1, &
3611 inembed, istride, idist, prod_cu_1, onembed, ostride, odist, fftw_estimate)
3613 CALL dfftw_execute(fftw_plan_multi_r2c)
3615 CALL dfftw_destroy_plan(fftw_plan_multi_r2c)
3617 prod_cu_1 = prod_cu_1*(1.d0/n_r_pad)
3619 IF (
PRESENT(temps)) temps(2) = temps(2) + mpi_wtime() -t
3623 combined_prod_cu_1(:,1)=prod_cu_1(1,:)
3626 combined_prod_cu_1(:,n)=2*conjg(prod_cu_1(n,:))
3629 IF (
PRESENT(temps)) temps(3) = temps(3) + mpi_wtime() -t
3632 longueur_tranche=bloc_size*m_max_c*2
3633 mpid=mpi_double_precision
3634 CALL mpi_alltoall (combined_prod_cu_1,longueur_tranche,mpid, dist_prod_cu_1,longueur_tranche, &
3635 mpid,communicator,code)
3636 IF (
PRESENT(temps)) temps(1) = temps(1) + mpi_wtime() -t
3641 shiftc = (nb-1)*bloc_size
3642 shiftl = (nb-1)*m_max_c
3643 intermediate_1 = dist_prod_cu_1(:,shiftl+i)
3645 IF (n+shiftc > np ) cycle
3646 c1_inout(n+shiftc, 1, i) =
REAL (intermediate_1(n),KIND=8)
3647 c1_inout(n+shiftc, 2, i) = aimag(intermediate_1(n))
3651 IF (
PRESENT(temps)) temps(3) = temps(3) + mpi_wtime() -t
3656 hloc_gauss,
l_g, nb_procs, bloc_size, m_max_pad, temps)
3668 REAL(KIND=8),
DIMENSION(:,:,:),
INTENT(IN) :: V1_in, V2_in
3669 REAL(KIND=8),
DIMENSION(:,:,:),
INTENT(IN) :: c_in
3670 REAL(KIND=8),
DIMENSION(:,:,:),
INTENT(OUT) :: c_out
3671 REAL(KIND=8),
DIMENSION(:),
INTENT(IN) :: hloc_gauss
3672 INTEGER,
INTENT(IN) :: l_G
3673 REAL(KIND=8),
DIMENSION(:),
OPTIONAL,
INTENT(INOUT) :: temps
3674 INTEGER,
INTENT(IN) :: nb_procs, bloc_size, m_max_pad
3675 COMPLEX(KIND=8),
DIMENSION(m_max_pad, SIZE(V1_in,2)+SIZE(c_in,2)/2, bloc_size) :: cu
3676 REAL(KIND=8),
DIMENSION(2*m_max_pad-1,SIZE(V1_in,2)+SIZE(c_in,2)/2,bloc_size) :: ru
3677 COMPLEX(KIND=8),
DIMENSION(m_max_pad,bloc_size) :: prod_cu
3678 REAL(KIND=8),
DIMENSION(2*m_max_pad-1,bloc_size) :: prod_ru
3679 COMPLEX(KIND=8),
DIMENSION(bloc_size) :: intermediate
3680 REAL(KIND=8),
DIMENSION(SIZE(V1_in,3),2*SIZE(V1_in,2)+SIZE(c_in,2),bloc_size*nb_procs) :: dist_field
3681 REAL(KIND=8),
DIMENSION(SIZE(V1_in,3),2*SIZE(V1_in,2)+SIZE(c_in,2),bloc_size*nb_procs) :: combined_field
3682 COMPLEX(KIND=8),
DIMENSION(bloc_size,SIZE(V1_in,3)*nb_procs) :: combined_prod_cu
3683 COMPLEX(KIND=8),
DIMENSION(bloc_size,SIZE(V1_in,3)*nb_procs) :: dist_prod_cu
3684 REAL(KIND=8),
DIMENSION(2*m_max_pad-1,bloc_size) :: norm_vel
3685 REAL(KIND=8),
DIMENSION(2*m_max_pad-1,bloc_size/l_G) :: norm_vel_int
3686 REAL(KIND=8),
DIMENSION(2*m_max_pad-1,bloc_size) :: norm_grad_phi
3687 REAL(KIND=8),
DIMENSION(bloc_size*nb_procs) :: hloc_gauss_tot
3688 REAL(KIND=8) :: hh, x, max_norm_vel_loc, max_norm_vel_loc_F, max_norm_vel_tot
3690 INTEGER :: np, np_tot, nb_field, nb_field2, m_max, m_max_c, MPID, N_r_pad
3691 INTEGER(KIND=8) :: fftw_plan_multi_c2r, fftw_plan_multi_r2c
3692 INTEGER :: nb, nf, shiftc, shiftl, jindex, longueur_tranche, i, n, code
3695 INTEGER :: fft_dim, howmany, istride, ostride, idist, odist
3696 INTEGER,
DIMENSION(1) :: dim, inembed, onembed
3700 mpi_comm :: communicator_f
3701 mpi_comm :: communicator_s
3703 IF (
PRESENT(temps)) temps = 0.d0
3705 CALL mpi_comm_rank(communicator_f, rank, code)
3708 nb_field =
SIZE(v1_in,2)
3709 nb_field2=
SIZE(c_in,2)
3710 m_max_c =
SIZE(v1_in,3)
3711 m_max = m_max_c*nb_procs
3712 np_tot = nb_procs*bloc_size
3713 n_r_pad = 2*m_max_pad-1
3715 IF (mod(nb_field,2)/=0 .OR. mod(nb_field2,2)/=0 .OR. m_max_c==0)
THEN 3728 dist_field(i,1:nb_field,1:np) = transpose(v1_in(:,:,i))
3729 dist_field(i,nb_field+1:2*nb_field,1:np) = transpose(v2_in(:,:,i))
3730 dist_field(i,2*nb_field+1:2*nb_field+nb_field2,1:np) = transpose(c_in(:,:,i))
3732 IF (
PRESENT(temps)) temps(3) = temps(3) + mpi_wtime() -t
3734 IF (np/=np_tot) dist_field(:,:,np+1:np_tot) = 0.d0
3736 hloc_gauss_tot(1:np) = hloc_gauss
3737 IF (np/=np_tot) hloc_gauss_tot(np+1:np_tot) = 1.d100
3739 longueur_tranche=bloc_size*m_max_c*(nb_field*2+nb_field2)
3742 mpid=mpi_double_precision
3743 CALL mpi_alltoall (dist_field,longueur_tranche, mpid, combined_field, longueur_tranche, &
3744 mpid, communicator_f, code)
3745 IF (
PRESENT(temps)) temps(1) = temps(1) + mpi_wtime() -t
3753 shiftc = (nb-1)*bloc_size
3754 shiftl = (nb-1)*m_max_c
3756 DO nf = 1, (nb_field+nb_field2/2)
3762 cu(shiftl+1:shiftl+m_max_c,nf,n) = 0.5d0*cmplx(combined_field(:,2*nf-1,jindex),&
3763 -combined_field(:,2*nf,jindex),kind=8)
3767 cu(1,:,:) = 2*cmplx(
REAL(cu(1,:,:),KIND=8),0.d0,KIND=8)
3773 IF (
PRESENT(temps)) temps(3) = temps(3) + mpi_wtime() -t
3776 fft_dim=1; istride=1; ostride=1;
3780 idist=n_r_pad; inembed(1)=n_r_pad; dim(1)=n_r_pad
3781 odist=m_max_pad; onembed(1)=m_max_pad
3784 howmany=bloc_size*(nb_field+nb_field2/2)
3788 CALL dfftw_plan_many_dft_c2r(fftw_plan_multi_c2r, fft_dim, dim, howmany, cu, &
3789 onembed, ostride, odist, ru, inembed, istride, idist, fftw_estimate)
3791 CALL dfftw_execute(fftw_plan_multi_c2r)
3793 CALL dfftw_destroy_plan(fftw_plan_multi_c2r)
3800 norm_vel(:,:) = sqrt(ru(:,4,:)**2 + ru(:,5,:)**2 + ru(:,6,:)**2)
3801 DO i = 1, 2*m_max_pad - 1
3802 DO l = 1, bloc_size/l_g
3803 x = maxval(norm_vel(i,(l-1)*l_g+1:l*l_g))
3804 norm_vel_int(i,l) = x
3807 IF (2*m_max_pad - 1 .GE. 3)
THEN 3808 DO l = 1, bloc_size/l_g
3809 DO i = 2, 2*m_max_pad - 2
3810 norm_vel(i,(l-1)*l_g+1:l*l_g) = maxval(norm_vel_int(i-1:i+1,l))
3812 norm_vel(1,(l-1)*l_g+1:l*l_g) = max(norm_vel_int(1,l),norm_vel_int(2,l),norm_vel_int(2*m_max_pad - 1,l))
3813 norm_vel(2*m_max_pad - 1,(l-1)*l_g+1:l*l_g) = &
3814 max(norm_vel_int(2*m_max_pad - 2,l),norm_vel_int(2*m_max_pad - 1,l),norm_vel_int(1,l))
3817 DO l = 1, bloc_size/l_g
3818 norm_vel(1,(l-1)*l_g+1:l*l_g) = norm_vel_int(1,l)
3824 max_norm_vel_loc=maxval(norm_vel)
3825 CALL mpi_allreduce(max_norm_vel_loc,max_norm_vel_loc_f,1,mpi_double_precision, mpi_max, communicator_f, code)
3826 CALL mpi_allreduce(max_norm_vel_loc_f,max_norm_vel_tot,1,mpi_double_precision, mpi_max, communicator_s, code)
3830 norm_grad_phi(:,:) = sqrt(ru(:,1,:)**2 + ru(:,2,:)**2 + ru(:,3,:)**2)
3834 hh =
inputs%h_min_distance
3839 max_norm_vel_tot=min(1.d0,max_norm_vel_tot)
3842 prod_ru(:,n) =
inputs%level_set_comp_factor*4*
inputs%LES_coeff4* &
3843 max_norm_vel_tot*(2.d0*
regul_tab(ru(:,7,n),0.01d0)-1.d0)* &
3844 (max((1.d0 - (2*ru(:,7,n)-1.d0)**2),0.d0)/(2*hh)-norm_grad_phi(:,n))
3849 howmany = bloc_size*1
3850 CALL dfftw_plan_many_dft_r2c(fftw_plan_multi_r2c, fft_dim, dim, howmany, prod_ru, &
3851 inembed, istride, idist, prod_cu, onembed, ostride, odist, fftw_estimate)
3853 CALL dfftw_execute(fftw_plan_multi_r2c)
3855 CALL dfftw_destroy_plan(fftw_plan_multi_r2c)
3859 prod_cu = prod_cu*(1.d0/n_r_pad)
3861 IF (
PRESENT(temps)) temps(2) = temps(2) + mpi_wtime() -t
3865 combined_prod_cu(:,1)=prod_cu(1,:)
3867 combined_prod_cu(:,n)=2*conjg(prod_cu(n,:))
3870 IF (
PRESENT(temps)) temps(3) = temps(3) + mpi_wtime() -t
3873 longueur_tranche=bloc_size*m_max_c*2
3874 mpid=mpi_double_precision
3875 CALL mpi_alltoall (combined_prod_cu,longueur_tranche,mpid, dist_prod_cu,longueur_tranche, &
3876 mpid,communicator_f,code)
3877 IF (
PRESENT(temps)) temps(1) = temps(1) + mpi_wtime() -t
3882 shiftc = (nb-1)*bloc_size
3883 shiftl = (nb-1)*m_max_c
3884 intermediate = dist_prod_cu(:,shiftl+i)
3886 IF (n+shiftc > np ) cycle
3887 c_out(n+shiftc, 1, i) =
REAL (intermediate(n),KIND=8)
3888 c_out(n+shiftc, 2 , i) = aimag(intermediate(n))
3892 IF (
PRESENT(temps)) temps(3) = temps(3) + mpi_wtime() -t
3897 coeff1_in_level, v_out, c_out, nb_procs, bloc_size, m_max_pad, temps)
3906 REAL(KIND=8),
DIMENSION(:,:,:),
INTENT(IN) :: V1_in
3907 REAL(KIND=8),
DIMENSION(:,:,:),
INTENT(IN) :: c1_in
3908 REAL(KIND=8),
DIMENSION(:,:),
INTENT(IN) :: c_in_real
3909 REAL(KIND=8),
DIMENSION(:),
INTENT(IN) :: hloc_gauss
3910 REAL(KIND=8),
INTENT(IN) :: coeff1_in_level
3911 REAL(KIND=8),
DIMENSION(:,:,:),
INTENT(OUT) :: V_out
3912 REAL(KIND=8),
DIMENSION(:,:,:),
INTENT(OUT) :: c_out
3913 REAL(KIND=8),
DIMENSION(:),
OPTIONAL,
INTENT(INOUT) :: temps
3914 INTEGER,
INTENT(IN) :: bloc_size, m_max_pad, nb_procs
3915 INTEGER :: np, np_tot, nb_field1, nb_field2
3916 INTEGER :: m_max, m_max_c, MPID, N_r_pad
3917 INTEGER(KIND=8) :: fftw_plan_multi_c2r, fftw_plan_multi_r2c
3919 REAL(KIND=8),
DIMENSION(SIZE(V1_in,3),SIZE(V1_in,2)+SIZE(c1_in,2),bloc_size*nb_procs) :: dist_field
3920 REAL(KIND=8),
DIMENSION(SIZE(V1_in,3),SIZE(V1_in,2)+SIZE(c1_in,2),bloc_size*nb_procs) :: combined_field
3921 COMPLEX(KIND=8),
DIMENSION(m_max_pad, (SIZE(V1_in,2)+SIZE(c1_in,2))/2, bloc_size) :: cu
3922 REAL(KIND=8),
DIMENSION(2*m_max_pad-1,(SIZE(V1_in,2)+SIZE(c1_in,2))/2,bloc_size) :: ru
3923 REAL(KIND=8),
DIMENSION(bloc_size*nb_procs) :: hloc_gauss_tot
3924 REAL(KIND=8),
DIMENSION(2*m_max_pad-1, bloc_size) :: visc_entro
3925 COMPLEX(KIND=8),
DIMENSION(m_max_pad,SIZE(V1_in,2)/2,bloc_size) :: prod_cu
3926 REAL(KIND=8),
DIMENSION(2*m_max_pad-1,SIZE(V1_in,2)/2,bloc_size) :: prod_ru
3927 COMPLEX(KIND=8),
DIMENSION(SIZE(V1_in,2)/2, bloc_size) :: intermediate
3928 COMPLEX(KIND=8),
DIMENSION(SIZE(V1_in,2)/2,bloc_size,SIZE(V1_in,3)*nb_procs) :: combined_prod_cu
3929 COMPLEX(KIND=8),
DIMENSION(SIZE(V1_in,2)/2,bloc_size,SIZE(V1_in,3)*nb_procs) :: dist_prod_cu
3930 COMPLEX(KIND=8),
DIMENSION(m_max_pad,bloc_size) :: prod_cu2
3931 REAL(KIND=8),
DIMENSION(2*m_max_pad-1,bloc_size) :: prod_ru2
3932 COMPLEX(KIND=8),
DIMENSION(bloc_size,SIZE(V1_in,3)*nb_procs) :: combined_prod_cu2
3933 COMPLEX(KIND=8),
DIMENSION(bloc_size,SIZE(V1_in,3)*nb_procs) :: dist_prod_cu2
3934 COMPLEX(KIND=8),
DIMENSION(bloc_size) :: intermediate2
3936 INTEGER :: nb, nf, shiftc, shiftl, jindex, longueur_tranche, i, n, code
3941 INTEGER :: fft_dim, howmany, istride, ostride, idist, odist
3942 INTEGER,
DIMENSION(1) :: dim, inembed, onembed
3946 mpi_comm :: communicator
3948 CALL mpi_comm_rank(communicator, rank, code)
3950 IF (
PRESENT(temps)) temps = 0.d0
3953 nb_field1=
SIZE(v1_in,2)
3954 nb_field2=
SIZE(c1_in,2)
3955 m_max_c =
SIZE(v1_in,3)
3956 m_max = m_max_c*nb_procs
3957 n_r_pad = 2*m_max_pad-1
3958 np_tot = nb_procs*bloc_size
3960 IF (mod(nb_field1,2)/=0 .OR. mod(nb_field2,2)/=0 .OR. m_max_c==0)
THEN 3978 dist_field(i,1:nb_field1,1:np) = transpose(v1_in(:,:,i))
3979 dist_field(i,nb_field1+1:nb_field1+nb_field2,1:np) = transpose(c1_in(:,:,i))
3981 IF (
PRESENT(temps)) temps(3) = temps(3) + mpi_wtime() -t
3983 IF (np/=np_tot) dist_field(:,:,np+1:np_tot) = 1.d100
3985 hloc_gauss_tot(1:np) = hloc_gauss
3986 IF (np/=np_tot) hloc_gauss_tot(np+1:np_tot) = 1.d100
3988 longueur_tranche=bloc_size*m_max_c*(nb_field1+nb_field2)
3991 mpid=mpi_double_precision
3992 CALL mpi_alltoall (dist_field,longueur_tranche, mpid, combined_field, longueur_tranche, &
3993 mpid, communicator, code)
3994 IF (
PRESENT(temps)) temps(1) = temps(1) + mpi_wtime() -t
4002 shiftc = (nb-1)*bloc_size
4003 shiftl = (nb-1)*m_max_c
4005 DO nf = 1, (nb_field1+nb_field2)/2
4011 cu(shiftl+1:shiftl+m_max_c,nf,n) = 0.5d0*cmplx(combined_field(:,2*nf-1,jindex),&
4012 -combined_field(:,2*nf,jindex),kind=8)
4016 cu(1,:,:) = 2*cmplx(
REAL(cu(1,:,:),KIND=8),0.d0,KIND=8)
4022 IF (
PRESENT(temps)) temps(3) = temps(3) + mpi_wtime() -t
4025 fft_dim=1; istride=1; ostride=1;
4029 idist=n_r_pad; inembed(1)=n_r_pad; dim(1)=n_r_pad
4030 odist=m_max_pad; onembed(1)=m_max_pad
4033 howmany=bloc_size*(nb_field1+nb_field2)/2
4036 CALL dfftw_plan_many_dft_c2r(fftw_plan_multi_c2r, fft_dim, dim, howmany, cu, &
4037 onembed, ostride, odist, ru, inembed, istride, idist, fftw_estimate)
4039 CALL dfftw_execute(fftw_plan_multi_c2r)
4042 CALL dfftw_destroy_plan(fftw_plan_multi_c2r)
4044 IF (nb_field1 == 6 .AND. nb_field2 == 2)
THEN 4050 prod_ru2(:,:) = max(0.d0, ru(:,4,:)*(1.d0 - ru(:,4,:)))
4054 visc_entro(:,n) = -coeff1_in_level + c_in_real(:,n)
4058 prod_ru(:,1,:) = -visc_entro*ru(:,1,:)
4059 prod_ru(:,2,:) = -visc_entro*ru(:,2,:)
4060 prod_ru(:,3,:) = -visc_entro*ru(:,3,:)
4062 CALL error_petsc(
'error in problem type while calling FFT_PAR_ENTRO_VISC_DCL')
4065 howmany = bloc_size*nb_field1/2
4066 CALL dfftw_plan_many_dft_r2c(fftw_plan_multi_r2c, fft_dim, dim, howmany, prod_ru, &
4067 inembed, istride, idist, prod_cu, onembed, ostride, odist, fftw_estimate)
4068 CALL dfftw_execute(fftw_plan_multi_r2c)
4070 CALL dfftw_destroy_plan(fftw_plan_multi_r2c)
4072 howmany = bloc_size*1
4073 CALL dfftw_plan_many_dft_r2c(fftw_plan_multi_r2c, fft_dim, dim, howmany, prod_ru2, &
4074 inembed, istride, idist, prod_cu2, onembed, ostride, odist, fftw_estimate)
4075 CALL dfftw_execute(fftw_plan_multi_r2c)
4077 CALL dfftw_destroy_plan(fftw_plan_multi_r2c)
4081 prod_cu = prod_cu*(1.d0/n_r_pad)
4082 prod_cu2 = prod_cu2*(1.d0/n_r_pad)
4084 IF (
PRESENT(temps)) temps(2) = temps(2) + mpi_wtime() -t
4089 combined_prod_cu(:,:,1)=prod_cu(1,:,:)
4090 combined_prod_cu2(:,1)=prod_cu2(1,:)
4092 combined_prod_cu(:,:,n)=2*conjg(prod_cu(n,:,:))
4093 combined_prod_cu2(:,n)=2*conjg(prod_cu2(n,:))
4096 IF (
PRESENT(temps)) temps(3) = temps(3) + mpi_wtime() -t
4099 longueur_tranche=bloc_size*m_max_c*nb_field1
4100 mpid=mpi_double_precision
4101 CALL mpi_alltoall (combined_prod_cu,longueur_tranche,mpid, dist_prod_cu,longueur_tranche, &
4102 mpid,communicator,code)
4104 longueur_tranche=bloc_size*m_max_c*2
4105 mpid=mpi_double_precision
4106 CALL mpi_alltoall (combined_prod_cu2,longueur_tranche,mpid, dist_prod_cu2,longueur_tranche, &
4107 mpid,communicator,code)
4109 IF (
PRESENT(temps)) temps(1) = temps(1) + mpi_wtime() -t
4115 shiftc = (nb-1)*bloc_size
4116 shiftl = (nb-1)*m_max_c
4117 intermediate = dist_prod_cu(:,:,shiftl+i)
4118 intermediate2 = dist_prod_cu2(:,shiftl+i)
4120 IF (n+shiftc > np ) cycle
4121 DO i_field = 1, nb_field1/2
4122 v_out(n+shiftc, i_field*2-1, i) =
REAL (intermediate(i_field,n),KIND=8)
4123 v_out(n+shiftc, i_field*2 , i) = aimag(intermediate(i_field,n))
4125 c_out(n+shiftc, 1, i) =
REAL (intermediate2(n),KIND=8)
4126 c_out(n+shiftc, 2, i) = aimag(intermediate2(n))
4131 IF (
PRESENT(temps)) temps(3) = temps(3) + mpi_wtime() -t
4135 SUBROUTINE fft_par_scal_funct(communicator, c1_inout, funct, nb_procs, bloc_size, m_max_pad, temps)
4147 REAL(KIND=8),
DIMENSION(:,:,:),
INTENT(INOUT) :: c1_inout
4149 FUNCTION funct(x) RESULT(vv)
4155 INTEGER,
INTENT(IN) :: nb_procs, bloc_size, m_max_pad
4156 REAL(KIND=8),
DIMENSION(:),
OPTIONAL,
INTENT(INOUT) :: temps
4157 REAL(KIND=8),
DIMENSION(SIZE(c1_inout,3),SIZE(c1_inout,2),bloc_size*nb_procs) :: dist_field
4158 REAL(KIND=8),
DIMENSION(SIZE(c1_inout,3),SIZE(c1_inout,2),bloc_size*nb_procs) :: combined_field
4159 COMPLEX(KIND=8),
DIMENSION(m_max_pad, SIZE(c1_inout,2)/2, bloc_size) :: cu
4160 REAL(KIND=8),
DIMENSION(2*m_max_pad-1,SIZE(c1_inout,2)/2,bloc_size) :: ru
4161 REAL(KIND=8),
DIMENSION(2*m_max_pad-1,bloc_size) :: prod_ru_1
4162 COMPLEX(KIND=8),
DIMENSION(m_max_pad,bloc_size) :: prod_cu_1
4163 COMPLEX(KIND=8),
DIMENSION(bloc_size,SIZE(c1_inout,3)*nb_procs) :: combined_prod_cu_1
4164 COMPLEX(KIND=8),
DIMENSION(bloc_size,SIZE(c1_inout,3)*nb_procs) :: dist_prod_cu_1
4165 COMPLEX(KIND=8),
DIMENSION(bloc_size) :: intermediate_1
4166 INTEGER :: np, np_tot, nb_field, m_max, m_max_c, MPID, N_r_pad
4167 INTEGER(KIND=8) :: fftw_plan_multi_c2r, fftw_plan_multi_r2c
4168 INTEGER :: nb, nf, shiftc, shiftl, jindex, longueur_tranche, i, n, code, rank
4171 INTEGER :: fft_dim, howmany, istride, ostride, idist, odist
4172 INTEGER,
DIMENSION(1) :: dim, inembed, onembed
4176 mpi_comm :: communicator
4178 CALL mpi_comm_rank(communicator, rank, code)
4180 IF (
PRESENT(temps)) temps = 0.d0
4182 np =
SIZE(c1_inout,1)
4183 nb_field =
SIZE(c1_inout,2)
4184 m_max_c =
SIZE(c1_inout,3)
4185 m_max = m_max_c*nb_procs
4186 np_tot = nb_procs*bloc_size
4187 n_r_pad = 2*m_max_pad-1
4189 IF (mod(nb_field,2)/=0 .OR. m_max_c==0)
THEN 4202 dist_field(i, 1:nb_field, 1:np) = transpose(c1_inout(:,:,i))
4204 IF (
PRESENT(temps)) temps(3) = temps(3) + mpi_wtime() -t
4206 IF (np/=np_tot) dist_field(:,:,np+1:np_tot) = 0.d0
4208 longueur_tranche=bloc_size*m_max_c*nb_field
4211 mpid=mpi_double_precision
4212 CALL mpi_alltoall (dist_field,longueur_tranche, mpid, combined_field, longueur_tranche, &
4213 mpid, communicator, code)
4214 IF (
PRESENT(temps)) temps(1) = temps(1) + mpi_wtime() -t
4220 shiftc = (nb-1)*bloc_size
4221 shiftl = (nb-1)*m_max_c
4223 DO nf = 1, nb_field/2
4229 cu(shiftl+1:shiftl+m_max_c,nf,n) = 0.5d0*cmplx(combined_field(:,2*nf-1,jindex),&
4230 -combined_field(:,2*nf,jindex),kind=8)
4234 cu(1,:,:) = 2*cmplx(
REAL(cu(1,:,:),KIND=8),0.d0,KIND=8)
4238 IF (
PRESENT(temps)) temps(3) = temps(3) + mpi_wtime() -t
4241 fft_dim=1; istride=1; ostride=1;
4242 idist=n_r_pad; inembed(1)=n_r_pad; dim(1)=n_r_pad
4243 odist=m_max_pad; onembed(1)=m_max_pad
4245 howmany=bloc_size*nb_field/2
4248 CALL dfftw_plan_many_dft_c2r(fftw_plan_multi_c2r, fft_dim, dim, howmany, cu, &
4249 onembed, ostride, odist, ru, inembed, istride, idist, fftw_estimate)
4250 CALL dfftw_execute(fftw_plan_multi_c2r)
4253 CALL dfftw_destroy_plan(fftw_plan_multi_c2r)
4256 DO i = 1, 2*m_max_pad-1
4258 prod_ru_1(i,n) = funct(ru(i,1,n))
4263 howmany = bloc_size*1
4264 CALL dfftw_plan_many_dft_r2c(fftw_plan_multi_r2c, fft_dim, dim, howmany, prod_ru_1, &
4265 inembed, istride, idist, prod_cu_1, onembed, ostride, odist, fftw_estimate)
4266 CALL dfftw_execute(fftw_plan_multi_r2c)
4268 CALL dfftw_destroy_plan(fftw_plan_multi_r2c)
4270 prod_cu_1 = prod_cu_1*(1.d0/n_r_pad)
4272 IF (
PRESENT(temps)) temps(2) = temps(2) + mpi_wtime() -t
4276 combined_prod_cu_1(:,1)=prod_cu_1(1,:)
4279 combined_prod_cu_1(:,n)=2*conjg(prod_cu_1(n,:))
4282 IF (
PRESENT(temps)) temps(3) = temps(3) + mpi_wtime() -t
4285 longueur_tranche=bloc_size*m_max_c*2
4286 mpid=mpi_double_precision
4287 CALL mpi_alltoall (combined_prod_cu_1,longueur_tranche,mpid, dist_prod_cu_1,longueur_tranche, &
4288 mpid,communicator,code)
4289 IF (
PRESENT(temps)) temps(1) = temps(1) + mpi_wtime() -t
4294 shiftc = (nb-1)*bloc_size
4295 shiftl = (nb-1)*m_max_c
4296 intermediate_1 = dist_prod_cu_1(:,shiftl+i)
4298 IF (n+shiftc > np ) cycle
4299 c1_inout(n+shiftc, 1, i) =
REAL (intermediate_1(n),KIND=8)
4300 c1_inout(n+shiftc, 2, i) = aimag(intermediate_1(n))
4304 IF (
PRESENT(temps)) temps(3) = temps(3) + mpi_wtime() -t
subroutine, public fft_compute_entropy_visc(communicator, communicator_S, V1_in, V2_in, V3_in, V4_in, V5_in, hloc_gauss, V1_out, V2_out, V3_out, nb_procs, bloc_size, m_max_pad, residual_normalization, l_G, temps)
subroutine, public fft_par_compr_entro_visc_dcl(communicator, V1_in, V2_in, c1_in, c_in_real, hloc_gauss, coeff1_in_level, V_out, c_out, nb_procs, bloc_size, m_max_pad, temps)
subroutine, public fft_max_vel_dcl(communicator, V1_in, V_out, nb_procs, bloc_size, m_max_pad)
subroutine, public fft_par_var_eta_prod_t_dcl(communicator, eta, H_mesh, c_in, c_out, nb_procs, bloc_size, m_max_pad, time, temps)
subroutine, public fft_tensor_dcl(communicator, V1_in, V2_in, V_out, nb_procs, bloc_size, m_max_pad, temps, opt_tension)
subroutine, public fft_heaviside_dcl(communicator, V1_in, values, V_out, nb_procs, bloc_size, m_max_pad, coeff_tanh, temps)
subroutine, public fft_compute_entropy_visc_grad_mom(communicator, V1_in, V2_in, V3_in, c_in_real, V_out, nb_procs, bloc_size, m_max_pad, temps)
subroutine, public fft_scalar_vect_no_overshoot(communicator, scalar_bounds, V1_in, V2_in, V_out, pb, nb_procs, bloc_size, m_max_pad, temps)
subroutine, public fft_par_scal_funct(communicator, c1_inout, funct, nb_procs, bloc_size, m_max_pad, temps)
subroutine, public fft_no_overshoot_level_set(communicator, c1_inout, nb_procs, bloc_size, m_max_pad, temps)
subroutine, public fft_par_var_eta_prod_gauss_dcl(communicator, eta, H_mesh, c_in, c_out, nb_procs, bloc_size, m_max_pad, rr_gauss, time, temps)
subroutine error_petsc(string)
subroutine, public fft_par_cross_prod_dcl(communicator, V1_in, V2_in, V_out, nb_procs, bloc_size, m_max_pad, temps)
subroutine, public fft_check_interface(communicator, V1_in, nb_fluids, interface_ok, nb_procs, bloc_size, m_max_pad, temps)
subroutine, public fft_compute_diffu_mom(communicator, V1_in, V2_in, V3_in, V1_out, V2_out, nb_procs, bloc_size, m_max_pad, temps)
subroutine, public fft_par_prod_dcl(communicator, c1_in, c2_in, c_out, nb_procs, bloc_size, m_max_pad, temps)
real(kind=8) function, public regul(phi, eps)
subroutine, public fft_compute_entropy_visc_mom(communicator, communicator_S, V1_in, V2_in, V3_in, c1_in, hloc_gauss, c1_real_out, nb_procs, bloc_size, m_max_pad, l_G, opt_c2_real_out, temps)
subroutine, public fft_compression_level_set_dcl(communicator_F, communicator_S, V1_in, V2_in, c_in, c_out, hloc_gauss, l_G, nb_procs, bloc_size, m_max_pad, temps)
subroutine, public fft_scalar_vect_dcl(communicator, V1_in, V2_in, V_out, pb, nb_procs, bloc_size, m_max_pad, temps)
subroutine, public fft_par_entro_visc_dcl(communicator, V1_in, c1_in, c_in_real, hloc_gauss, coeff1_in_level, V_out, c_out, nb_procs, bloc_size, m_max_pad, temps)
real(kind=8) function, dimension(size(phi)) regul_tab(phi, eps)
subroutine, public fft_par_dot_prod_dcl(communicator, V1_in, V2_in, c_out, nb_procs, bloc_size, m_max_pad, temps)
subroutine, public fft_par_real(communicator, V1_in, V_out, opt_nb_plane)