# Fortran90: DO loop for sequence of numbers

Tags:
1. Dec 9, 2014

### SalfordPhysics

1. The problem statement, all variables and given/known data
A program finds the area under the Gaussian Distribution Curve between ±σ using Simpsons Rule.
Modify the program to investigate the effect of the number of strips.
Do this by using a DO loop in the main program for the
following sequence of number of strips (n); n-2, n-4, n-6, n-8, n-12,n-16,n-24,n-32,n-48,n-64,n-96

2. Relevant equations

3. The attempt at a solution
My program DOES work fine, but it has a long line of DO loops for bits of the sequence. I want to know if there is a way to massively shorten this part down.
(n) starts at 100 and there is first a print of that before implementing the sequence and printing on each iteration;

CALL evalArea((-1)*sigma,sigma,area,n) !n = 100
PRINT*, 'n=',n, 'area=',area
DO k = 1,4 !n = 98, 96, 94, 92
CALL evalArea((-1)*sigma,sigma,area,n)
n = n-2
PRINT*, 'n=',n, 'area=',area
END DO
DO
k = 1,2 !n = 88,84
n = n-4
CALL evalArea((-1)*sigma,sigma,area,n)
PRINT*, 'n=',n, 'area=',area
END DO
DO
k = 1,2 !n = 76,68
n = n-8
CALL evalArea((-1)*sigma,sigma,area,n)
PRINT*, 'n=',n, 'area=',area
END DO
DO
k = 1,2 ! n = 52, 36
n = n-16
CALL evalArea((-1)*sigma,sigma,area,n)
PRINT*, 'n=',n, 'area=',area
END DO
n = n-32 ! n = 4
CALL evalArea((-1)*sigma,sigma,area,n)
PRINT*, 'n=',n, 'area=',area

All help appreciated.

2. Dec 9, 2014

### SteamKing

Staff Emeritus
It's not clear what 'number of strips' means in the context of using Simpson's Rule. Are you talking about the number of ordinates in the interval -σ ≤ x ≤ σ?

Why do you use all these different loops?

Is your Gaussian curve symmetric about x = 0? If it is, you can use this fact to calculate only half the area and multiply by 2.

3. Dec 9, 2014

### SalfordPhysics

As I mentioned, I have the program running perfectly fine for a single integration with n=100, where n is the number of strips between -σ ≤ x ≤ σ. Yes it is symmetric about x = 0 but this is not important for my case.

I now need to implement a loop in the MAIN program that will repeat the whole process for a sequence of values n.
So first iteration is the original running of n=100.
Then is n = 98, n = 96, n = 64, n = 92 (n=n-2 part)
Then comes n = 88, n = 84 (n=n-4 part)

As you will see on the RHS of the code, I have put a !note as to which part each of the loops corresponds to. As before, I am looking to increase the efficiency and write this in a shorter, neater, more coherent manner. basically, I need some way to implement that sequence, which unfortunately is not geometric or arithmetic.

4. Dec 9, 2014

### Staff: Mentor

A simple way would be to set up a 1D integer array that contains the values of m to calculate n - m, then loop over an index and take the value of n using the m's from the array.

5. Dec 9, 2014

### SalfordPhysics

Thanks Dr! I simplified using IF-THEN-ELSE statements but your approach seems better. I will give it a go now.

It worked great! Thanks again.

Last edited: Dec 9, 2014