view main/optiminterp/src/example_optiminterp.F90 @ 2819:8f24e10508f7 octave-forge

Fix example
author abarth93
date Sun, 17 Dec 2006 21:01:58 +0000
parents e9c7f41ecc7f
children 2de537641f94
line wrap: on
line source

!  
! Example for using the n-dimentional optimal interpolation Fortran module
! Copyright (C) 2005 Alexander Barth <abarth@marine.usf.edu>
!  
! This program is free software; you can redistribute it and/or
! modify it under the terms of the GNU General Public License
! as published by the Free Software Foundation; either version 2
! of the License, or (at your option) any later version.
!  
! This program is distributed in the hope that it will be useful,
! but WITHOUT ANY WARRANTY; without even the implied warranty of
! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
! GNU General Public License for more details.
!  
! You should have received a copy of the GNU General Public License
! along with this program; if not, write to the Free Software
! Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, 
! MA 02110-1301, USA.
!  

! Author: Alexander Barth <abarth@marine.usf.edu>

program test_optiminterp
 use optimal_interpolation
 implicit none

 ! n times n is the sized of the 2D background grid
 ! on: number of observations
 ! m: number of influential observations

 integer, parameter :: n=100, on=200, m=30

 ! xi(1,:) and xi(2,:) represent the x and y coordindate of the 
 ! grid of the interpolated field
 ! fi and vari are the interpolated field and its error variance resp.

 real(wp) :: xi(2,n*n), fi(1,n*n), vari(n*n)

 ! xi(1,:) and xi(2,:) represent the x and y coordindate of the 
 ! observations
 ! f and var are observations and their error variance resp.


 real(wp) :: x(2,on), var(on), f(1,on)

 ! param: inverse of the correlation length

 real(wp) :: param(2)

 integer :: i,j,l

 ! we use a simple random generator instead of Fortran 90's
 ! random_number in the hope that the results will be
 ! platform independent

 integer(8), parameter :: A = 1664525_8, B = 1013904223_8, Mo = 4294967296_8
 integer(8) :: next = 0_8


 ! create a regular 2D grid
 l = 1
 do j=1,n
   do i=1,n
     xi(1,l) = (i-1.)/(n-1.)
     xi(2,l) = (j-1.)/(n-1.)
     l = l+1
   end do
 end do

 ! param is the inverse of the correlation length
 param = 1./0.1

 ! the error variance of the observations
 var = 0.01

 ! location of observations

 do j=1,on
   do i=1,2
     ! simple random generator
     next = mod(A*next  + B,Mo)
     x(i,j) = real(next,8)/real(Mo,8)
   end do
 end do

 ! the underlying function to interpolate

 f(1,:) = sin( x(1,:)*6 ) * cos( x(2,:)*6);

 ! fi is the interpolated function and vari its error variance
 call optiminterp(x,f,var,param,m,xi,fi,vari)

 ! control value

 write(6,'(A,F10.6)') 'Expected:',2.2205936104348591E-002
 write(6,'(A,F10.6)') 'Obtained:',fi(1,1)

end program test_optiminterp