Dismiss Notice
Join Physics Forums Today!
The friendliest, high quality science and math community on the planet! Everyone who loves science is here!

How to modify the following code?

  1. Dec 14, 2009 #1
    I can compile the following code, but I can not run it in my computer. How do change it? Thanks.


    module nrtype
    INTEGER, PARAMETER :: SP = KIND(1.0)
    INTEGER, PARAMETER :: DP = KIND(1.0D0)
    INTEGER, PARAMETER :: I4B = SELECTED_INT_KIND(9)
    INTEGER, PARAMETER :: I2B = SELECTED_INT_KIND(4)
    INTEGER, PARAMETER :: I1B = SELECTED_INT_KIND(2)
    END module

    program mainp
    use nrtype
    implicit none
    call xlocate
    end program

    subroutine xlocate
    USE nrtype
    IMPLICIT NONE
    !INTEGER(I4B), PARAMETER :: n=3
    INTEGER(I4B) :: i,j
    REAL(DP) :: x
    REAL(DP), DIMENSION(4) :: xx
    REAL(DP), DIMENSION(2):: xlim,ab
    !real(DP), external:: mylocate1
    xx=(/1.0_DP,2.0_DP,3.0_DP,4.0_DP/)
    x=1.5_DP
    CALL mylocate(xx,x,xlim,ab)
    write(*,*) ab

    END subroutine xlocate

    SUBROUTINE mylocate(xx,x,xlim,ab)
    USE nrtype
    IMPLICIT NONE
    REAL(DP), DIMENSION(2), INTENT(OUT):: xlim, ab
    REAL(DP), DIMENSION(:), INTENT(IN) :: xx
    REAL(DP), INTENT(IN) :: x
    INTEGER(I4B) :: k
    INTEGER(I4B) :: n,jl,jm,ju
    LOGICAL(I4B) :: ascnd
    REAL(DP)::h
    n=SIZE(xx)
    ascnd = (xx(n) >= xx(1))
    jl=0
    ju=n+1
    DO
    IF (ju-jl <= 1) EXIT
    jm=(ju+jl)/2
    IF (ascnd .EQV. (x >= xx(jm))) THEN
    jl=jm
    ELSE
    ju=jm
    END IF
    END DO
    IF (x == xx(1)) THEN
    k=1
    ELSE IF (x == xx(n)) THEN
    k=n-1
    ELSE
    k=jl
    END IF
    h=xx(k+1)-xx(k);

    ab(1)=(xx(k+1)-x)/h;
    ab(2)=(x-xx(k))/h;

    xlim(1)=k;
    xlim(2)=k+1;
    END SUBROUTINE mylocate
     
  2. jcsd
  3. Dec 14, 2009 #2

    Mark44

    Staff: Mentor

    Can you be more specific when you say you can't run it on your computer?
     
  4. Dec 14, 2009 #3
    The compiler said handle exception: Error while dumping state. If I make mylocate internal subroutine by using contain, I can compile and run it just like the following. It is so weird. Can someone explain this to me? Thanks.

    module nrtype
    INTEGER, PARAMETER :: SP = KIND(1.0)
    INTEGER, PARAMETER :: DP = KIND(1.0D0)
    INTEGER, PARAMETER :: I4B = SELECTED_INT_KIND(9)
    INTEGER, PARAMETER :: I2B = SELECTED_INT_KIND(4)
    INTEGER, PARAMETER :: I1B = SELECTED_INT_KIND(2)
    END module

    program mainp
    use nrtype
    implicit none
    call xlocate
    end program mainp

    subroutine xlocate
    USE nrtype
    ! USE nr
    IMPLICIT NONE
    !INTEGER(I4B), PARAMETER :: n=3
    INTEGER(I4B) :: i,j
    REAL(DP) :: x
    REAL(DP), DIMENSION(4) :: xx
    REAL(DP), DIMENSION(2):: xlim,ab
    !real(DP), external:: mylocate1
    xx=(/1.0_DP,2.0_DP,3.0_DP,4.0_DP/)
    x=1.5_DP
    CALL mylocate(xx,x,xlim,ab)
    write(*,*) ab
    !j=mylocate1(xx,x)
    !write(*,*) j
    Contains
    SUBROUTINE mylocate(xx,x,xlim,ab)
    USE nrtype
    IMPLICIT NONE
    REAL(DP), DIMENSION(2), INTENT(OUT):: xlim, ab
    REAL(DP), DIMENSION(:), INTENT(IN) :: xx
    REAL(DP), INTENT(IN) :: x
    INTEGER(I4B) :: k
    INTEGER(I4B) :: n,jl,jm,ju
    LOGICAL(I4B) :: ascnd
    REAL(DP)::h
    n=SIZE(xx)
    ascnd = (xx(n) >= xx(1))
    jl=0
    ju=n+1
    DO
    IF (ju-jl <= 1) EXIT
    jm=(ju+jl)/2
    IF (ascnd .EQV. (x >= xx(jm))) THEN
    jl=jm
    ELSE
    ju=jm
    END IF
    END DO
    IF (x == xx(1)) THEN
    k=1
    ELSE IF (x == xx(n)) THEN
    k=n-1
    ELSE
    k=jl
    END IF
    h=xx(k+1)-xx(k);

    ab(1)=(xx(k+1)-x)/h;
    ab(2)=(x-xx(k))/h;

    xlim(1)=k;
    xlim(2)=k+1;
    END SUBROUTINE mylocate

    END subroutine xlocate
     
  5. Dec 14, 2009 #4

    Mark44

    Staff: Mentor

    What I would do is put a bunch of WRITE *,* statements in xlocate and mylocate to display the value of variables. (I'm assuming you want to get the code in post 1 to work.) Before you run this code, go through and predict the values of all variables. After that run the code with the WRITE statements, and see if the values displayed match what your hand calculations predicted.
     
Share this great discussion with others via Reddit, Google+, Twitter, or Facebook