1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58
|
program random_irregular_cartesian_grid
implicit none
real, parameter :: dmin = 2., & ! Distance minimale entre 2 noeuds (unite arbitraire)
dmax = 3. ! Distance maximale entre 2 noeuds (unite arbitraire)
integer, parameter :: n = 100 ! Nbr de points de la grille
real, dimension(n) :: x, & ! grille (abscisses)
y ! grille (ordonnees)
real, dimension(2*n-2) :: rnd ! Nombres pseudo-aléatoires 0 <= rnd <= 1
integer :: i, j, k, l
real :: dx, dy, d
real :: time_begin,time_end
!**** Generation de la grille
call cpu_time(time_begin)
call random_number(rnd)
x(1) = 0.; y(1) = 0. ! Le premier point est choisi comme origine
j = 1 ! Indice permettant de parcourir le tableau rnd
do i = 2, n
dx = rnd(j)*dmin + (1.-rnd(j))*dmax; x(i) = x(i-1) + dx ! dmin <= dx <= dmax
dy = rnd(j+1)*dmin + (1.-rnd(j+1))*dmax; y(i) = y(i-1) + dy ! dmin <= dy <= dmax
j = j + 2
end do
call cpu_time(time_end)
print *,"*** Grille (Pt n°|x|y)",n*n," points."
do i = 1, n
do j = 1, n
print *,j+n*(i-1),x(i),y(j)
end do
end do
print '("Generation",t20,": ",es7.1," s.")',(time_end-time_begin)
!*** Verification de la condition ||M_kl.M_ij|| >=
call cpu_time(time_begin)
do i = 1, n
do j = 1, n
do k = 1, n
do l = 1, n
dx = x(k) - x(i)
dy = y(l) - y(j)
d = sqrt(dx*dx + dy*dy)
if ((d < dmin).AND.((k /= i).OR.(l /= j))) then
print '("Error : Pt N°",i7," - ",i7,"d = ",g9.3)',j+n*(i-1),l+n*(l-1),d
end if
end do
end do
end do
end do
call cpu_time(time_end)
print '("Verification",t20,": ",es7.1," s.")',(time_end-time_begin)
end program random_irregular_cartesian_grid |
Partager